|  | @@ -830,44 +830,45 @@ static void read_service_config(grpc_exec_ctx *exec_ctx, void *arg,
 | 
	
		
			
				|  |  |    channel_data *chand = elem->channel_data;
 | 
	
		
			
				|  |  |    call_data *calld = elem->call_data;
 | 
	
		
			
				|  |  |    // If this is an error, there's no point in looking at the service config.
 | 
	
		
			
				|  |  | -  if (error != GRPC_ERROR_NONE) return;
 | 
	
		
			
				|  |  | -  // Get the method config table from channel data.
 | 
	
		
			
				|  |  | -  gpr_mu_lock(&chand->mu);
 | 
	
		
			
				|  |  | -  grpc_method_config_table *method_config_table = NULL;
 | 
	
		
			
				|  |  | -  if (chand->method_config_table != NULL) {
 | 
	
		
			
				|  |  | -    method_config_table =
 | 
	
		
			
				|  |  | -        grpc_method_config_table_ref(chand->method_config_table);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -  gpr_mu_unlock(&chand->mu);
 | 
	
		
			
				|  |  | -  // If the method config table was present, use it.
 | 
	
		
			
				|  |  | -  if (method_config_table != NULL) {
 | 
	
		
			
				|  |  | -    const grpc_method_config *method_config =
 | 
	
		
			
				|  |  | -        grpc_method_config_table_get_method_config(method_config_table,
 | 
	
		
			
				|  |  | -                                                   calld->path);
 | 
	
		
			
				|  |  | -    if (method_config != NULL) {
 | 
	
		
			
				|  |  | -      const gpr_timespec *per_method_timeout =
 | 
	
		
			
				|  |  | -          grpc_method_config_get_timeout(method_config);
 | 
	
		
			
				|  |  | -      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);
 | 
	
		
			
				|  |  | -        if (per_method_timeout != NULL) {
 | 
	
		
			
				|  |  | -          gpr_timespec per_method_deadline =
 | 
	
		
			
				|  |  | -              gpr_time_add(calld->call_start_time, *per_method_timeout);
 | 
	
		
			
				|  |  | -          if (gpr_time_cmp(per_method_deadline, calld->deadline) < 0) {
 | 
	
		
			
				|  |  | -            calld->deadline = per_method_deadline;
 | 
	
		
			
				|  |  | -            // Reset deadline timer.
 | 
	
		
			
				|  |  | -            grpc_deadline_state_reset(exec_ctx, elem, calld->deadline);
 | 
	
		
			
				|  |  | +  if (error == GRPC_ERROR_NONE) {
 | 
	
		
			
				|  |  | +    // Get the method config table from channel data.
 | 
	
		
			
				|  |  | +    gpr_mu_lock(&chand->mu);
 | 
	
		
			
				|  |  | +    grpc_method_config_table *method_config_table = NULL;
 | 
	
		
			
				|  |  | +    if (chand->method_config_table != NULL) {
 | 
	
		
			
				|  |  | +      method_config_table =
 | 
	
		
			
				|  |  | +          grpc_method_config_table_ref(chand->method_config_table);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    gpr_mu_unlock(&chand->mu);
 | 
	
		
			
				|  |  | +    // If the method config table was present, use it.
 | 
	
		
			
				|  |  | +    if (method_config_table != NULL) {
 | 
	
		
			
				|  |  | +      const grpc_method_config *method_config =
 | 
	
		
			
				|  |  | +          grpc_method_config_table_get_method_config(method_config_table,
 | 
	
		
			
				|  |  | +                                                     calld->path);
 | 
	
		
			
				|  |  | +      if (method_config != NULL) {
 | 
	
		
			
				|  |  | +        const gpr_timespec *per_method_timeout =
 | 
	
		
			
				|  |  | +            grpc_method_config_get_timeout(method_config);
 | 
	
		
			
				|  |  | +        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);
 | 
	
		
			
				|  |  | +          if (per_method_timeout != NULL) {
 | 
	
		
			
				|  |  | +            gpr_timespec per_method_deadline =
 | 
	
		
			
				|  |  | +                gpr_time_add(calld->call_start_time, *per_method_timeout);
 | 
	
		
			
				|  |  | +            if (gpr_time_cmp(per_method_deadline, calld->deadline) < 0) {
 | 
	
		
			
				|  |  | +              calld->deadline = per_method_deadline;
 | 
	
		
			
				|  |  | +              // Reset deadline timer.
 | 
	
		
			
				|  |  | +              grpc_deadline_state_reset(exec_ctx, elem, calld->deadline);
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  |            }
 | 
	
		
			
				|  |  | +          if (wait_for_ready != NULL) {
 | 
	
		
			
				|  |  | +            calld->wait_for_ready_from_service_config =
 | 
	
		
			
				|  |  | +                *wait_for_ready ? WAIT_FOR_READY_TRUE : WAIT_FOR_READY_FALSE;
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +          gpr_mu_unlock(&calld->mu);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  | -        if (wait_for_ready != NULL) {
 | 
	
		
			
				|  |  | -          calld->wait_for_ready_from_service_config =
 | 
	
		
			
				|  |  | -              *wait_for_ready ? WAIT_FOR_READY_TRUE : WAIT_FOR_READY_FALSE;
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        gpr_mu_unlock(&calld->mu);
 | 
	
		
			
				|  |  |        }
 | 
	
		
			
				|  |  | +      grpc_method_config_table_unref(method_config_table);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    grpc_method_config_table_unref(method_config_table);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    GRPC_CALL_STACK_UNREF(exec_ctx, calld->owning_call, "read_service_config");
 | 
	
		
			
				|  |  |  }
 |