|
|
|
@ -663,9 +663,13 @@ static bool pick_subchannel(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, |
|
|
|
|
// If the application explicitly set wait_for_ready, use that.
|
|
|
|
|
// Otherwise, if the service config specified a value for this
|
|
|
|
|
// method, use that.
|
|
|
|
|
if ((initial_metadata_flags & |
|
|
|
|
GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET) == 0 && |
|
|
|
|
calld->wait_for_ready_from_service_config != WAIT_FOR_READY_UNSET) { |
|
|
|
|
const bool wait_for_ready_set_from_api = |
|
|
|
|
initial_metadata_flags & |
|
|
|
|
GRPC_INITIAL_METADATA_WAIT_FOR_READY_EXPLICITLY_SET; |
|
|
|
|
const bool wait_for_ready_set_from_service_config = |
|
|
|
|
calld->wait_for_ready_from_service_config != WAIT_FOR_READY_UNSET; |
|
|
|
|
if (!wait_for_ready_set_from_api && |
|
|
|
|
wait_for_ready_set_from_service_config) { |
|
|
|
|
if (calld->wait_for_ready_from_service_config == WAIT_FOR_READY_TRUE) { |
|
|
|
|
initial_metadata_flags |= GRPC_INITIAL_METADATA_WAIT_FOR_READY; |
|
|
|
|
} else { |
|
|
|
@ -676,8 +680,9 @@ static bool pick_subchannel(grpc_exec_ctx *exec_ctx, grpc_call_element *elem, |
|
|
|
|
const grpc_lb_policy_pick_args inputs = { |
|
|
|
|
calld->pollent, initial_metadata, initial_metadata_flags, |
|
|
|
|
&calld->lb_token_mdelem, gpr_inf_future(GPR_CLOCK_MONOTONIC)}; |
|
|
|
|
bool result = grpc_lb_policy_pick(exec_ctx, lb_policy, &inputs, |
|
|
|
|
connected_subchannel, NULL, on_ready); |
|
|
|
|
const bool result = |
|
|
|
|
grpc_lb_policy_pick(exec_ctx, lb_policy, &inputs, |
|
|
|
|
connected_subchannel, NULL, on_ready); |
|
|
|
|
GRPC_LB_POLICY_UNREF(exec_ctx, lb_policy, "pick_subchannel"); |
|
|
|
|
GPR_TIMER_END("pick_subchannel", 0); |
|
|
|
|
return result; |
|
|
|
@ -836,13 +841,13 @@ static void read_service_config(grpc_exec_ctx *exec_ctx, void *arg, |
|
|
|
|
gpr_mu_unlock(&chand->mu); |
|
|
|
|
// If the method config table was present, use it.
|
|
|
|
|
if (method_config_table != NULL) { |
|
|
|
|
grpc_method_config *method_config = |
|
|
|
|
const grpc_method_config *method_config = |
|
|
|
|
grpc_method_config_table_get_method_config(method_config_table, |
|
|
|
|
calld->path); |
|
|
|
|
if (method_config != NULL) { |
|
|
|
|
gpr_timespec *per_method_timeout = |
|
|
|
|
const gpr_timespec *per_method_timeout = |
|
|
|
|
grpc_method_config_get_timeout(method_config); |
|
|
|
|
bool *wait_for_ready = |
|
|
|
|
const bool *wait_for_ready = |
|
|
|
|
grpc_method_config_get_wait_for_ready(method_config); |
|
|
|
|
if (per_method_timeout != NULL || wait_for_ready != NULL) { |
|
|
|
|
gpr_mu_lock(&calld->mu); |
|
|
|
@ -907,14 +912,14 @@ static grpc_error *cc_init_call_elem(grpc_exec_ctx *exec_ctx, |
|
|
|
|
grpc_method_config_table_get_method_config(method_config_table, |
|
|
|
|
args->path); |
|
|
|
|
if (method_config != NULL) { |
|
|
|
|
gpr_timespec *per_method_timeout = |
|
|
|
|
const gpr_timespec *per_method_timeout = |
|
|
|
|
grpc_method_config_get_timeout(method_config); |
|
|
|
|
if (per_method_timeout != NULL) { |
|
|
|
|
gpr_timespec per_method_deadline = |
|
|
|
|
gpr_time_add(calld->call_start_time, *per_method_timeout); |
|
|
|
|
calld->deadline = gpr_time_min(calld->deadline, per_method_deadline); |
|
|
|
|
} |
|
|
|
|
bool *wait_for_ready = |
|
|
|
|
const bool *wait_for_ready = |
|
|
|
|
grpc_method_config_get_wait_for_ready(method_config); |
|
|
|
|
if (wait_for_ready != NULL) { |
|
|
|
|
calld->wait_for_ready_from_service_config = |
|
|
|
|