| 
					
				 | 
			
			
				@@ -87,7 +87,7 @@ static std::unordered_map<string, std::deque<int>> get_hosts_and_cores( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       CoreRequest dummy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       CoreResponse cores; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       grpc::Status s = stub->CoreCount(&ctx, dummy, &cores); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      assert(s.ok()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      GPR_ASSERT(s.ok()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       std::deque<int> dq; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       for (int i = 0; i < cores.cores(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         dq.push_back(i); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -289,9 +289,13 @@ std::unique_ptr<ScenarioResult> RunScenario( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *args.mutable_setup() = server_config; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     servers[i].stream = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         servers[i].stub->RunServer(runsc::AllocContext(&contexts)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(servers[i].stream->Write(args)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!servers[i].stream->Write(args)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Could not write args to server %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ServerStatus init_status; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(servers[i].stream->Read(&init_status)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!servers[i].stream->Read(&init_status)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Server %zu did not yield initial status", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     gpr_join_host_port(&cli_target, host, init_status.port()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     client_config.add_server_targets(cli_target); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     gpr_free(host); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -345,9 +349,13 @@ std::unique_ptr<ScenarioResult> RunScenario( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *args.mutable_setup() = per_client_config; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     clients[i].stream = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         clients[i].stub->RunClient(runsc::AllocContext(&contexts)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(clients[i].stream->Write(args)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!clients[i].stream->Write(args)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Could not write args to client %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ClientStatus init_status; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(clients[i].stream->Read(&init_status)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!clients[i].stream->Read(&init_status)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Client %zu did not yield initial status", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Let everything warmup 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -362,19 +370,31 @@ std::unique_ptr<ScenarioResult> RunScenario( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   server_mark.mutable_mark()->set_reset(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ClientArgs client_mark; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   client_mark.mutable_mark()->set_reset(true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (auto server = &servers[0]; server != &servers[num_servers]; server++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(server->stream->Write(server_mark)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (size_t i = 0; i < num_servers; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto server = &servers[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!server->stream->Write(server_mark)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Couldn't write mark to server %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (auto client = &clients[0]; client != &clients[num_clients]; client++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(client->stream->Write(client_mark)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (size_t i = 0; i < num_clients; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto client = &clients[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!client->stream->Write(client_mark)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Couldn't write mark to client %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ServerStatus server_status; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   ClientStatus client_status; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (auto server = &servers[0]; server != &servers[num_servers]; server++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(server->stream->Read(&server_status)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (size_t i = 0; i < num_servers; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto server = &servers[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!server->stream->Read(&server_status)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Couldn't get status from server %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (auto client = &clients[0]; client != &clients[num_clients]; client++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(client->stream->Read(&client_status)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (size_t i = 0; i < num_clients; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto client = &clients[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!client->stream->Read(&client_status)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Couldn't get status from client %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Wait some time 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -390,37 +410,73 @@ std::unique_ptr<ScenarioResult> RunScenario( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   Histogram merged_latencies; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_log(GPR_INFO, "Finishing clients"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (auto client = &clients[0]; client != &clients[num_clients]; client++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(client->stream->Write(client_mark)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(client->stream->WritesDone()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (size_t i = 0; i < num_clients; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto client = &clients[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!client->stream->Write(client_mark)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Couldn't write mark to client %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!client->stream->WritesDone()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Failed WritesDone for client %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (auto client = &clients[0]; client != &clients[num_clients]; client++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(client->stream->Read(&client_status)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    const auto& stats = client_status.stats(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    merged_latencies.MergeProto(stats.latencies()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    result->add_client_stats()->CopyFrom(stats); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(!client->stream->Read(&client_status)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (size_t i = 0; i < num_clients; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto client = &clients[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // Read the client final status 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (client->stream->Read(&client_status)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_INFO, "Received final status from client %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      const auto& stats = client_status.stats(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      merged_latencies.MergeProto(stats.latencies()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      result->add_client_stats()->CopyFrom(stats); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // That final status should be the last message on the client stream 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      GPR_ASSERT(!client->stream->Read(&client_status)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Couldn't get final status from client %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (auto client = &clients[0]; client != &clients[num_clients]; client++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(client->stream->Finish().ok()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (size_t i = 0; i < num_clients; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto client = &clients[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Status s = client->stream->Finish(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    result->add_client_success(s.ok()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!s.ok()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Client %zu had an error %s", i, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              s.error_message().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   delete[] clients; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   merged_latencies.FillProto(result->mutable_latencies()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_log(GPR_INFO, "Finishing servers"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (auto server = &servers[0]; server != &servers[num_servers]; server++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(server->stream->Write(server_mark)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(server->stream->WritesDone()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (size_t i = 0; i < num_servers; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto server = &servers[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!server->stream->Write(server_mark)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Couldn't write mark to server %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!server->stream->WritesDone()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Failed WritesDone for server %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (auto server = &servers[0]; server != &servers[num_servers]; server++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(server->stream->Read(&server_status)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    result->add_server_stats()->CopyFrom(server_status.stats()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    result->add_server_cores(server_status.cores()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(!server->stream->Read(&server_status)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (size_t i = 0; i < num_servers; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto server = &servers[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // Read the server final status 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (server->stream->Read(&server_status)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_INFO, "Received final status from server %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      result->add_server_stats()->CopyFrom(server_status.stats()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      result->add_server_cores(server_status.cores()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // That final status should be the last message on the server stream 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      GPR_ASSERT(!server->stream->Read(&server_status)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Couldn't get final status from server %zu", i); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  for (auto server = &servers[0]; server != &servers[num_servers]; server++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(server->stream->Finish().ok()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  for (size_t i = 0; i < num_servers; i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto server = &servers[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Status s = server->stream->Finish(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    result->add_server_success(s.ok()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!s.ok()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Server %zu had an error %s", i, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              s.error_message().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   delete[] servers; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -429,8 +485,9 @@ std::unique_ptr<ScenarioResult> RunScenario( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void RunQuit() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+bool RunQuit() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   // Get client, server lists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  bool result = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   auto workers = get_workers("QPS_WORKERS"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (size_t i = 0; i < workers.size(); i++) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     auto stub = WorkerService::NewStub( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -438,8 +495,14 @@ void RunQuit() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     Void dummy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc::ClientContext ctx; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ctx.set_fail_fast(false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    GPR_ASSERT(stub->QuitWorker(&ctx, dummy, &dummy).ok()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    Status s = stub->QuitWorker(&ctx, dummy, &dummy); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (!s.ok()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      gpr_log(GPR_ERROR, "Worker %zu could not be properly quit because %s", i, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+              s.error_message().c_str()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      result = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return result; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }  // namespace testing 
			 |