|
|
|
@ -46,6 +46,7 @@ |
|
|
|
|
#include "src/core/lib/iomgr/timer.h" |
|
|
|
|
#include "src/core/lib/profiling/timers.h" |
|
|
|
|
#include "src/core/lib/slice/slice_internal.h" |
|
|
|
|
#include "src/core/lib/surface/call.h" |
|
|
|
|
#include "src/core/lib/surface/channel.h" |
|
|
|
|
#include "src/core/lib/surface/channel_init.h" |
|
|
|
|
#include "src/core/lib/transport/connectivity_state.h" |
|
|
|
@ -640,8 +641,8 @@ static bool publish_transport_locked(grpc_subchannel* c) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* publish */ |
|
|
|
|
c->connected_subchannel.reset( |
|
|
|
|
grpc_core::New<grpc_core::ConnectedSubchannel>(stk)); |
|
|
|
|
c->connected_subchannel.reset(grpc_core::New<grpc_core::ConnectedSubchannel>( |
|
|
|
|
stk, c->channelz_subchannel.get())); |
|
|
|
|
gpr_log(GPR_INFO, "New connected subchannel at %p for subchannel %p", |
|
|
|
|
c->connected_subchannel.get(), c); |
|
|
|
|
|
|
|
|
@ -796,9 +797,12 @@ grpc_arg grpc_create_subchannel_address_arg(const grpc_resolved_address* addr) { |
|
|
|
|
|
|
|
|
|
namespace grpc_core { |
|
|
|
|
|
|
|
|
|
ConnectedSubchannel::ConnectedSubchannel(grpc_channel_stack* channel_stack) |
|
|
|
|
ConnectedSubchannel::ConnectedSubchannel( |
|
|
|
|
grpc_channel_stack* channel_stack, |
|
|
|
|
channelz::SubchannelNode* channelz_subchannel) |
|
|
|
|
: RefCountedWithTracing<ConnectedSubchannel>(&grpc_trace_stream_refcount), |
|
|
|
|
channel_stack_(channel_stack) {} |
|
|
|
|
channel_stack_(channel_stack), |
|
|
|
|
channelz_subchannel_(channelz_subchannel) {} |
|
|
|
|
|
|
|
|
|
ConnectedSubchannel::~ConnectedSubchannel() { |
|
|
|
|
GRPC_CHANNEL_STACK_UNREF(channel_stack_, "connected_subchannel_dtor"); |
|
|
|
@ -845,14 +849,15 @@ grpc_error* ConnectedSubchannel::CreateCall(const CallArgs& args, |
|
|
|
|
connection.release(); // Ref is passed to the grpc_subchannel_call object.
|
|
|
|
|
(*call)->connection = this; |
|
|
|
|
const grpc_call_element_args call_args = { |
|
|
|
|
callstk, /* call_stack */ |
|
|
|
|
nullptr, /* server_transport_data */ |
|
|
|
|
args.context, /* context */ |
|
|
|
|
args.path, /* path */ |
|
|
|
|
args.start_time, /* start_time */ |
|
|
|
|
args.deadline, /* deadline */ |
|
|
|
|
args.arena, /* arena */ |
|
|
|
|
args.call_combiner /* call_combiner */ |
|
|
|
|
callstk, /* call_stack */ |
|
|
|
|
nullptr, /* server_transport_data */ |
|
|
|
|
args.context, /* context */ |
|
|
|
|
args.path, /* path */ |
|
|
|
|
args.start_time, /* start_time */ |
|
|
|
|
args.deadline, /* deadline */ |
|
|
|
|
args.arena, /* arena */ |
|
|
|
|
args.call_combiner, /* call_combiner */ |
|
|
|
|
args.call /* call */ |
|
|
|
|
}; |
|
|
|
|
grpc_error* error = grpc_call_stack_init( |
|
|
|
|
channel_stack_, 1, subchannel_call_destroy, *call, &call_args); |
|
|
|
@ -861,6 +866,10 @@ grpc_error* ConnectedSubchannel::CreateCall(const CallArgs& args, |
|
|
|
|
gpr_log(GPR_ERROR, "error: %s", error_string); |
|
|
|
|
return error; |
|
|
|
|
} |
|
|
|
|
if (channelz_subchannel_ != nullptr) { |
|
|
|
|
channelz_subchannel_->RecordCallStarted(); |
|
|
|
|
grpc_call_set_channelz_subchannel(args.call, channelz_subchannel_); |
|
|
|
|
} |
|
|
|
|
grpc_call_stack_set_pollset_or_pollset_set(callstk, args.pollent); |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} |
|
|
|
|