summaryrefslogtreecommitdiff
path: root/grpc/src/core/ext/filters/client_channel/dynamic_filters.cc
diff options
context:
space:
mode:
Diffstat (limited to 'grpc/src/core/ext/filters/client_channel/dynamic_filters.cc')
-rw-r--r--grpc/src/core/ext/filters/client_channel/dynamic_filters.cc32
1 files changed, 18 insertions, 14 deletions
diff --git a/grpc/src/core/ext/filters/client_channel/dynamic_filters.cc b/grpc/src/core/ext/filters/client_channel/dynamic_filters.cc
index afde3c75..47c05a30 100644
--- a/grpc/src/core/ext/filters/client_channel/dynamic_filters.cc
+++ b/grpc/src/core/ext/filters/client_channel/dynamic_filters.cc
@@ -18,6 +18,7 @@
#include "src/core/ext/filters/client_channel/dynamic_filters.h"
+#include "src/core/lib/channel/channel_args.h"
#include "src/core/lib/channel/channel_stack.h"
#include "src/core/lib/surface/lame_client.h"
@@ -36,7 +37,7 @@ namespace grpc_core {
// DynamicFilters::Call
//
-DynamicFilters::Call::Call(Args args, grpc_error** error)
+DynamicFilters::Call::Call(Args args, grpc_error_handle* error)
: channel_stack_(std::move(args.channel_stack)) {
grpc_call_stack* call_stack = CALL_TO_CALL_STACK(this);
const grpc_call_element_args call_args = {
@@ -52,8 +53,7 @@ DynamicFilters::Call::Call(Args args, grpc_error** error)
*error = grpc_call_stack_init(channel_stack_->channel_stack_, 1, Destroy,
this, &call_args);
if (GPR_UNLIKELY(*error != GRPC_ERROR_NONE)) {
- const char* error_string = grpc_error_string(*error);
- gpr_log(GPR_ERROR, "error: %s", error_string);
+ gpr_log(GPR_ERROR, "error: %s", grpc_error_std_string(*error).c_str());
return;
}
grpc_call_stack_set_pollset_or_pollset_set(call_stack, args.pollent);
@@ -93,7 +93,7 @@ void DynamicFilters::Call::Unref(const DebugLocation& /*location*/,
GRPC_CALL_STACK_UNREF(CALL_TO_CALL_STACK(this), reason);
}
-void DynamicFilters::Call::Destroy(void* arg, grpc_error* /*error*/) {
+void DynamicFilters::Call::Destroy(void* arg, grpc_error_handle /*error*/) {
DynamicFilters::Call* self = static_cast<DynamicFilters::Call*>(arg);
// Keep some members before destroying the subchannel call.
grpc_closure* after_call_stack_destroy = self->after_call_stack_destroy_;
@@ -123,13 +123,13 @@ void DynamicFilters::Call::IncrementRefCount(
namespace {
-void DestroyChannelStack(void* arg, grpc_error* /*error*/) {
+void DestroyChannelStack(void* arg, grpc_error_handle /*error*/) {
grpc_channel_stack* channel_stack = static_cast<grpc_channel_stack*>(arg);
grpc_channel_stack_destroy(channel_stack);
gpr_free(channel_stack);
}
-std::pair<grpc_channel_stack*, grpc_error*> CreateChannelStack(
+std::pair<grpc_channel_stack*, grpc_error_handle> CreateChannelStack(
const grpc_channel_args* args,
std::vector<const grpc_channel_filter*> filters) {
// Allocate memory for channel stack.
@@ -138,13 +138,13 @@ std::pair<grpc_channel_stack*, grpc_error*> CreateChannelStack(
grpc_channel_stack* channel_stack =
reinterpret_cast<grpc_channel_stack*>(gpr_zalloc(channel_stack_size));
// Initialize stack.
- grpc_error* error = grpc_channel_stack_init(
+ grpc_error_handle error = grpc_channel_stack_init(
/*initial_refs=*/1, DestroyChannelStack, channel_stack, filters.data(),
filters.size(), args, /*optional_transport=*/nullptr, "DynamicFilters",
channel_stack);
if (error != GRPC_ERROR_NONE) {
gpr_log(GPR_ERROR, "error initializing client internal stack: %s",
- grpc_error_string(error));
+ grpc_error_std_string(error).c_str());
grpc_channel_stack_destroy(channel_stack);
gpr_free(channel_stack);
return {nullptr, error};
@@ -160,12 +160,16 @@ RefCountedPtr<DynamicFilters> DynamicFilters::Create(
// Attempt to create channel stack from requested filters.
auto p = CreateChannelStack(args, std::move(filters));
if (p.second != GRPC_ERROR_NONE) {
- // Initial pass failed. Create with lame filter.
- grpc_error* error = p.second;
- p = CreateChannelStack(args, {&grpc_lame_filter});
+ // Channel stack creation failed with requested filters.
+ // Create with lame filter instead.
+ grpc_error_handle error = p.second;
+ grpc_arg error_arg = MakeLameClientErrorArg(error);
+ grpc_channel_args* new_args =
+ grpc_channel_args_copy_and_add(args, &error_arg, 1);
+ GRPC_ERROR_UNREF(error);
+ p = CreateChannelStack(new_args, {&grpc_lame_filter});
GPR_ASSERT(p.second == GRPC_ERROR_NONE);
- grpc_channel_element* elem = grpc_channel_stack_element(p.first, 0);
- SetLameFilterError(elem, error);
+ grpc_channel_args_destroy(new_args);
}
return MakeRefCounted<DynamicFilters>(p.first);
}
@@ -175,7 +179,7 @@ DynamicFilters::~DynamicFilters() {
}
RefCountedPtr<DynamicFilters::Call> DynamicFilters::CreateCall(
- DynamicFilters::Call::Args args, grpc_error** error) {
+ DynamicFilters::Call::Args args, grpc_error_handle* error) {
size_t allocation_size = GPR_ROUND_UP_TO_ALIGNMENT_SIZE(sizeof(Call)) +
channel_stack_->call_stack_size;
Call* call = static_cast<Call*>(args.arena->Alloc(allocation_size));