|
|
|
@ -69,11 +69,13 @@ static grpc_error* init_call_elem(grpc_call_element* elem, |
|
|
|
|
call_data* calld = (call_data*)elem->call_data; |
|
|
|
|
// Get stats object from context and take a ref.
|
|
|
|
|
GPR_ASSERT(args->context != nullptr); |
|
|
|
|
GPR_ASSERT(args->context[GRPC_GRPCLB_CLIENT_STATS].value != nullptr); |
|
|
|
|
calld->client_stats = grpc_grpclb_client_stats_ref( |
|
|
|
|
(grpc_grpclb_client_stats*)args->context[GRPC_GRPCLB_CLIENT_STATS].value); |
|
|
|
|
// Record call started.
|
|
|
|
|
grpc_grpclb_client_stats_add_call_started(calld->client_stats); |
|
|
|
|
if (args->context[GRPC_GRPCLB_CLIENT_STATS].value != nullptr) { |
|
|
|
|
calld->client_stats = grpc_grpclb_client_stats_ref( |
|
|
|
|
(grpc_grpclb_client_stats*)args->context[GRPC_GRPCLB_CLIENT_STATS] |
|
|
|
|
.value); |
|
|
|
|
// Record call started.
|
|
|
|
|
grpc_grpclb_client_stats_add_call_started(calld->client_stats); |
|
|
|
|
} |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -81,36 +83,40 @@ static void destroy_call_elem(grpc_call_element* elem, |
|
|
|
|
const grpc_call_final_info* final_info, |
|
|
|
|
grpc_closure* ignored) { |
|
|
|
|
call_data* calld = (call_data*)elem->call_data; |
|
|
|
|
// Record call finished, optionally setting client_failed_to_send and
|
|
|
|
|
// received.
|
|
|
|
|
grpc_grpclb_client_stats_add_call_finished( |
|
|
|
|
!calld->send_initial_metadata_succeeded /* client_failed_to_send */, |
|
|
|
|
calld->recv_initial_metadata_succeeded /* known_received */, |
|
|
|
|
calld->client_stats); |
|
|
|
|
// All done, so unref the stats object.
|
|
|
|
|
grpc_grpclb_client_stats_unref(calld->client_stats); |
|
|
|
|
if (calld->client_stats != nullptr) { |
|
|
|
|
// Record call finished, optionally setting client_failed_to_send and
|
|
|
|
|
// received.
|
|
|
|
|
grpc_grpclb_client_stats_add_call_finished( |
|
|
|
|
!calld->send_initial_metadata_succeeded /* client_failed_to_send */, |
|
|
|
|
calld->recv_initial_metadata_succeeded /* known_received */, |
|
|
|
|
calld->client_stats); |
|
|
|
|
// All done, so unref the stats object.
|
|
|
|
|
grpc_grpclb_client_stats_unref(calld->client_stats); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void start_transport_stream_op_batch( |
|
|
|
|
grpc_call_element* elem, grpc_transport_stream_op_batch* batch) { |
|
|
|
|
call_data* calld = (call_data*)elem->call_data; |
|
|
|
|
GPR_TIMER_BEGIN("clr_start_transport_stream_op_batch", 0); |
|
|
|
|
// Intercept send_initial_metadata.
|
|
|
|
|
if (batch->send_initial_metadata) { |
|
|
|
|
calld->original_on_complete_for_send = batch->on_complete; |
|
|
|
|
GRPC_CLOSURE_INIT(&calld->on_complete_for_send, on_complete_for_send, calld, |
|
|
|
|
grpc_schedule_on_exec_ctx); |
|
|
|
|
batch->on_complete = &calld->on_complete_for_send; |
|
|
|
|
} |
|
|
|
|
// Intercept recv_initial_metadata.
|
|
|
|
|
if (batch->recv_initial_metadata) { |
|
|
|
|
calld->original_recv_initial_metadata_ready = |
|
|
|
|
batch->payload->recv_initial_metadata.recv_initial_metadata_ready; |
|
|
|
|
GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready, |
|
|
|
|
recv_initial_metadata_ready, calld, |
|
|
|
|
grpc_schedule_on_exec_ctx); |
|
|
|
|
batch->payload->recv_initial_metadata.recv_initial_metadata_ready = |
|
|
|
|
&calld->recv_initial_metadata_ready; |
|
|
|
|
if (calld->client_stats != nullptr) { |
|
|
|
|
// Intercept send_initial_metadata.
|
|
|
|
|
if (batch->send_initial_metadata) { |
|
|
|
|
calld->original_on_complete_for_send = batch->on_complete; |
|
|
|
|
GRPC_CLOSURE_INIT(&calld->on_complete_for_send, on_complete_for_send, |
|
|
|
|
calld, grpc_schedule_on_exec_ctx); |
|
|
|
|
batch->on_complete = &calld->on_complete_for_send; |
|
|
|
|
} |
|
|
|
|
// Intercept recv_initial_metadata.
|
|
|
|
|
if (batch->recv_initial_metadata) { |
|
|
|
|
calld->original_recv_initial_metadata_ready = |
|
|
|
|
batch->payload->recv_initial_metadata.recv_initial_metadata_ready; |
|
|
|
|
GRPC_CLOSURE_INIT(&calld->recv_initial_metadata_ready, |
|
|
|
|
recv_initial_metadata_ready, calld, |
|
|
|
|
grpc_schedule_on_exec_ctx); |
|
|
|
|
batch->payload->recv_initial_metadata.recv_initial_metadata_ready = |
|
|
|
|
&calld->recv_initial_metadata_ready; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// Chain to next filter.
|
|
|
|
|
grpc_call_next_op(elem, batch); |
|
|
|
|