| 
					
				 | 
			
			
				@@ -345,9 +345,6 @@ typedef struct glb_lb_policy { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /** are we currently updating lb_call? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   bool updating_lb_call; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  /** are we currently updating lb_channel? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  bool updating_lb_channel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /** are we already watching the LB channel's connectivity? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   bool watching_lb_channel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -360,9 +357,6 @@ typedef struct glb_lb_policy { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /** called upon changes to the LB channel's connectivity. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_closure lb_channel_on_connectivity_changed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  /** args from the latest update received while already updating, or NULL */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_lb_policy_args *pending_update_args; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /************************************************************/ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /*  client data associated with the LB server communication */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /************************************************************/ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -982,10 +976,6 @@ static void glb_destroy(grpc_exec_ctx *exec_ctx, grpc_lb_policy *pol) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_fake_resolver_response_generator_unref(glb_policy->response_generator); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_subchannel_index_unref(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (glb_policy->pending_update_args != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_channel_args_destroy(exec_ctx, glb_policy->pending_update_args->args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    gpr_free(glb_policy->pending_update_args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_free(glb_policy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1752,45 +1742,22 @@ static void glb_update_locked(grpc_exec_ctx *exec_ctx, grpc_lb_policy *policy, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const grpc_lb_addresses *addresses = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       (const grpc_lb_addresses *)arg->value.pointer.p; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // If a non-empty serverlist hasn't been received from the balancer, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // propagate the update to fallback_backend_addresses. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (glb_policy->serverlist == NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // If a non-empty serverlist hasn't been received from the balancer, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // propagate the update to fallback_backend_addresses. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fallback_update_locked(exec_ctx, glb_policy, addresses); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  } else if (glb_policy->updating_lb_channel) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // If we have recieved serverlist from the balancer, we need to defer update 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // when there is an in-progress one. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (GRPC_TRACER_ON(grpc_lb_glb_trace)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      gpr_log(GPR_INFO, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              "Update already in progress for grpclb %p. Deferring update.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-              (void *)glb_policy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (glb_policy->pending_update_args != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      grpc_channel_args_destroy(exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                glb_policy->pending_update_args->args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      gpr_free(glb_policy->pending_update_args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    glb_policy->pending_update_args = (grpc_lb_policy_args *)gpr_zalloc( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        sizeof(*glb_policy->pending_update_args)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    glb_policy->pending_update_args->client_channel_factory = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        args->client_channel_factory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    glb_policy->pending_update_args->args = grpc_channel_args_copy(args->args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    glb_policy->pending_update_args->combiner = args->combiner; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  glb_policy->updating_lb_channel = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   GPR_ASSERT(glb_policy->lb_channel != NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Propagate updates to the LB channel (pick_first) through the fake 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // resolver. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_channel_args *lb_channel_args = build_lb_channel_args( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       exec_ctx, addresses, glb_policy->response_generator, args->args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  /* Propagate updates to the LB channel (pick first) through the fake resolver 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-   */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_fake_resolver_response_generator_set_response( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       exec_ctx, glb_policy->response_generator, lb_channel_args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_channel_args_destroy(exec_ctx, lb_channel_args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // Start watching the LB channel connectivity for connection, if not 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  // already doing so. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!glb_policy->watching_lb_channel) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // Watch the LB channel connectivity for connection. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     glb_policy->lb_channel_connectivity = grpc_channel_check_connectivity_state( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         glb_policy->lb_channel, true /* try to connect */); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc_channel_element *client_channel_elem = grpc_channel_stack_last_element( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1842,18 +1809,10 @@ static void glb_lb_channel_on_connectivity_changed_cb(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /* fallthrough */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     case GRPC_CHANNEL_READY: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (glb_policy->lb_call != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        glb_policy->updating_lb_channel = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         glb_policy->updating_lb_call = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         grpc_call_cancel(glb_policy->lb_call, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // lb_on_server_status_received will pick up the cancel and reinit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // lb_on_server_status_received() will pick up the cancel and reinit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         // lb_call. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (glb_policy->pending_update_args != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          grpc_lb_policy_args *args = glb_policy->pending_update_args; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          glb_policy->pending_update_args = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          glb_update_locked(exec_ctx, &glb_policy->base, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          grpc_channel_args_destroy(exec_ctx, args->args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          gpr_free(args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       } else if (glb_policy->started_picking && !glb_policy->shutting_down) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (glb_policy->retry_timer_active) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           grpc_timer_cancel(exec_ctx, &glb_policy->lb_call_retry_timer); 
			 |