diff options
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.cc | 32 |
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)); |