|  | @@ -51,7 +51,7 @@
 | 
	
		
			
				|  |  |   * lb_on_response_received. The former will be called when the call to the LB
 | 
	
		
			
				|  |  |   * server completes. This can happen if the LB server closes the connection or
 | 
	
		
			
				|  |  |   * if this policy itself cancels the call (for example because it's shutting
 | 
	
		
			
				|  |  | - * down).If the internal call times out, the usual behavior of pick-first
 | 
	
		
			
				|  |  | + * down). If the internal call times out, the usual behavior of pick-first
 | 
	
		
			
				|  |  |   * applies, continuing to pick from the list {a1..an}.
 | 
	
		
			
				|  |  |   *
 | 
	
		
			
				|  |  |   * Upon sucesss, the incoming \a LoadBalancingResponse is processed by \a
 | 
	
	
		
			
				|  | @@ -325,11 +325,10 @@ typedef struct glb_lb_policy {
 | 
	
		
			
				|  |  |     * server indicates a redirect. */
 | 
	
		
			
				|  |  |    grpc_byte_buffer *lb_request_payload;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* response from the LB server, if any. Processed in lb_on_response_received()
 | 
	
		
			
				|  |  | -   */
 | 
	
		
			
				|  |  | +  /* response the LB server, if any. Processed in lb_on_response_received() */
 | 
	
		
			
				|  |  |    grpc_byte_buffer *lb_response_payload;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  /* the call's status and status detailset in lb_on_server_status_received() */
 | 
	
		
			
				|  |  | +  /* call status code and details, set in lb_on_server_status_received() */
 | 
	
		
			
				|  |  |    grpc_status_code lb_call_status;
 | 
	
		
			
				|  |  |    char *lb_call_status_details;
 | 
	
		
			
				|  |  |    size_t lb_call_status_details_capacity;
 | 
	
	
		
			
				|  | @@ -1013,7 +1012,7 @@ static void query_for_backends_locked(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |    GPR_ASSERT(glb_policy->lb_channel != NULL);
 | 
	
		
			
				|  |  |    /* take a weak ref (won't prevent calling of \a glb_shutdown if the strong ref
 | 
	
		
			
				|  |  |     * count goes to zero) to be unref'd in lb_on_server_status_received */
 | 
	
		
			
				|  |  | -  GRPC_LB_POLICY_WEAK_REF(&glb_policy->base, "query_for_backends_locked");
 | 
	
		
			
				|  |  | +  GRPC_LB_POLICY_WEAK_REF(&glb_policy->base, "query_for_backends");
 | 
	
		
			
				|  |  |    lb_call_init(glb_policy);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (grpc_lb_glb_trace) {
 | 
	
	
		
			
				|  | @@ -1139,19 +1138,21 @@ static void lb_on_response_received(grpc_exec_ctx *exec_ctx, void *arg,
 | 
	
		
			
				|  |  |        gpr_slice_unref(response_slice);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    /* keep listening for serverlist updates */
 | 
	
		
			
				|  |  | -    op->op = GRPC_OP_RECV_MESSAGE;
 | 
	
		
			
				|  |  | -    op->data.recv_message = &glb_policy->lb_response_payload;
 | 
	
		
			
				|  |  | -    op->flags = 0;
 | 
	
		
			
				|  |  | -    op->reserved = NULL;
 | 
	
		
			
				|  |  | -    op++;
 | 
	
		
			
				|  |  | -    const grpc_call_error call_error = grpc_call_start_batch_and_execute(
 | 
	
		
			
				|  |  | -        exec_ctx, glb_policy->lb_call, ops, (size_t)(op - ops),
 | 
	
		
			
				|  |  | -        &glb_policy->lb_on_response_received); /* loop */
 | 
	
		
			
				|  |  | -    GPR_ASSERT(GRPC_CALL_OK == call_error);
 | 
	
		
			
				|  |  | +    if (!glb_policy->shutting_down) {
 | 
	
		
			
				|  |  | +      /* keep listening for serverlist updates */
 | 
	
		
			
				|  |  | +      op->op = GRPC_OP_RECV_MESSAGE;
 | 
	
		
			
				|  |  | +      op->data.recv_message = &glb_policy->lb_response_payload;
 | 
	
		
			
				|  |  | +      op->flags = 0;
 | 
	
		
			
				|  |  | +      op->reserved = NULL;
 | 
	
		
			
				|  |  | +      op++;
 | 
	
		
			
				|  |  | +      const grpc_call_error call_error = grpc_call_start_batch_and_execute(
 | 
	
		
			
				|  |  | +          exec_ctx, glb_policy->lb_call, ops, (size_t)(op - ops),
 | 
	
		
			
				|  |  | +          &glb_policy->lb_on_response_received); /* loop */
 | 
	
		
			
				|  |  | +      GPR_ASSERT(GRPC_CALL_OK == call_error);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      return;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  /* else, empty payload: call cancelled by server. */
 | 
	
		
			
				|  |  | +  /* else, empty payload: call cancelled. */
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void lb_call_on_retry_timer(grpc_exec_ctx *exec_ctx, void *arg,
 | 
	
	
		
			
				|  | @@ -1188,14 +1189,10 @@ static void lb_on_server_status_received(grpc_exec_ctx *exec_ctx, void *arg,
 | 
	
		
			
				|  |  |              (void *)glb_policy->lb_call);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -  const bool was_cancelled =
 | 
	
		
			
				|  |  | -      (glb_policy->lb_call_status == GRPC_STATUS_CANCELLED);
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |    /* We need to performe cleanups no matter what. */
 | 
	
		
			
				|  |  |    lb_call_destroy(glb_policy);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    if (!glb_policy->shutting_down) {
 | 
	
		
			
				|  |  | -    GPR_ASSERT(!was_cancelled);
 | 
	
		
			
				|  |  |      /* if we aren't shutting down, restart the LB client call after some time */
 | 
	
		
			
				|  |  |      gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC);
 | 
	
		
			
				|  |  |      gpr_timespec next_try =
 |