| 
					
				 | 
			
			
				@@ -579,17 +579,26 @@ def test_round_robin(gcp, backend_service, instance_group): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     threshold = 1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     wait_until_all_rpcs_go_to_given_backends(instance_names, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                              _WAIT_FOR_STATS_SEC) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    stats = get_client_stats(_NUM_TEST_RPCS, _WAIT_FOR_STATS_SEC) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    requests_received = [stats.rpcs_by_peer[x] for x in stats.rpcs_by_peer] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    total_requests_received = sum(requests_received) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if total_requests_received != _NUM_TEST_RPCS: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        raise Exception('Unexpected RPC failures', stats) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    expected_requests = total_requests_received / len(instance_names) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for instance in instance_names: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if abs(stats.rpcs_by_peer[instance] - expected_requests) > threshold: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            raise Exception( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'RPC peer distribution differs from expected by more than %d ' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                'for instance %s (%s)' % (threshold, instance, stats)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # TODO(ericgribkoff) Delayed config propagation from earlier tests 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # may result in briefly receiving an empty EDS update, resulting in failed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # RPCs. Retry distribution validation if this occurs; long-term fix is 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # creating new backend resources for each individual test case. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    max_attempts = 10 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    for i in range(max_attempts): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        stats = get_client_stats(_NUM_TEST_RPCS, _WAIT_FOR_STATS_SEC) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requests_received = [stats.rpcs_by_peer[x] for x in stats.rpcs_by_peer] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        total_requests_received = sum(requests_received) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if total_requests_received != _NUM_TEST_RPCS: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            logger.info('Unexpected RPC failures, retrying: %s', stats) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            continue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        expected_requests = total_requests_received / len(instance_names) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for instance in instance_names: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if abs(stats.rpcs_by_peer[instance] - expected_requests) > threshold: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                raise Exception( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'RPC peer distribution differs from expected by more than %d ' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    'for instance %s (%s)' % (threshold, instance, stats)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    raise Exception('RPC failures persisted through %d retries' % max_attempts) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 def test_secondary_locality_gets_no_requests_on_partial_primary_failure( 
			 |