|  | @@ -55,7 +55,9 @@ using grpc::testing::EchoRequest;
 | 
	
		
			
				|  |  |  using grpc::testing::EchoResponse;
 | 
	
		
			
				|  |  |  using std::chrono::system_clock;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -const int kNumThreads = 100;  // Number of threads
 | 
	
		
			
				|  |  | +const int kNumThreads = 100; // Number of threads
 | 
	
		
			
				|  |  | +const int kNumAsyncSendThreads = 2;
 | 
	
		
			
				|  |  | +const int kNumAsyncReceiveThreads = 50;
 | 
	
		
			
				|  |  |  const int kNumRpcs = 1000;    // Number of RPCs per thread
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  namespace grpc {
 | 
	
	
		
			
				|  | @@ -273,7 +275,7 @@ class AsyncClientEnd2endTest : public ::testing::Test {
 | 
	
		
			
				|  |  |      for (int i = 0; i < num_rpcs; ++i) {
 | 
	
		
			
				|  |  |        AsyncClientCall* call = new AsyncClientCall;
 | 
	
		
			
				|  |  |        EchoRequest request;
 | 
	
		
			
				|  |  | -      request.set_message("Hello");
 | 
	
		
			
				|  |  | +      request.set_message("Hello: " + std::to_string(i));
 | 
	
		
			
				|  |  |        call->response_reader =
 | 
	
		
			
				|  |  |            common_.GetStub()->AsyncEcho(&call->context, request, &cq_);
 | 
	
		
			
				|  |  |        call->response_reader->Finish(&call->response, &call->status,
 | 
	
	
		
			
				|  | @@ -290,7 +292,9 @@ class AsyncClientEnd2endTest : public ::testing::Test {
 | 
	
		
			
				|  |  |        bool ok = false;
 | 
	
		
			
				|  |  |        if (!cq_.Next(&got_tag, &ok)) break;
 | 
	
		
			
				|  |  |        AsyncClientCall* call = static_cast<AsyncClientCall*>(got_tag);
 | 
	
		
			
				|  |  | -      GPR_ASSERT(ok);
 | 
	
		
			
				|  |  | +      if (!ok) {
 | 
	
		
			
				|  |  | +        gpr_log(GPR_DEBUG, "Error: %d", call->status.error_code());
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  |        delete call;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        bool notify;
 | 
	
	
		
			
				|  | @@ -315,22 +319,22 @@ class AsyncClientEnd2endTest : public ::testing::Test {
 | 
	
		
			
				|  |  |  TEST_F(AsyncClientEnd2endTest, ThreadStress) {
 | 
	
		
			
				|  |  |    common_.ResetStub();
 | 
	
		
			
				|  |  |    std::vector<std::thread*> send_threads, completion_threads;
 | 
	
		
			
				|  |  | -  for (int i = 0; i < kNumThreads / 2; ++i) {
 | 
	
		
			
				|  |  | +  for (int i = 0; i < kNumAsyncReceiveThreads; ++i) {
 | 
	
		
			
				|  |  |      completion_threads.push_back(new std::thread(
 | 
	
		
			
				|  |  |          &AsyncClientEnd2endTest_ThreadStress_Test::AsyncCompleteRpc, this));
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  for (int i = 0; i < kNumThreads / 2; ++i) {
 | 
	
		
			
				|  |  | +  for (int i = 0; i < kNumAsyncSendThreads; ++i) {
 | 
	
		
			
				|  |  |      send_threads.push_back(
 | 
	
		
			
				|  |  |          new std::thread(&AsyncClientEnd2endTest_ThreadStress_Test::AsyncSendRpc,
 | 
	
		
			
				|  |  |                          this, kNumRpcs));
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  for (int i = 0; i < kNumThreads / 2; ++i) {
 | 
	
		
			
				|  |  | +  for (int i = 0; i < kNumAsyncSendThreads; ++i) {
 | 
	
		
			
				|  |  |      send_threads[i]->join();
 | 
	
		
			
				|  |  |      delete send_threads[i];
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    Wait();
 | 
	
		
			
				|  |  | -  for (int i = 0; i < kNumThreads / 2; ++i) {
 | 
	
		
			
				|  |  | +  for (int i = 0; i < kNumAsyncReceiveThreads; ++i) {
 | 
	
		
			
				|  |  |      completion_threads[i]->join();
 | 
	
		
			
				|  |  |      delete completion_threads[i];
 | 
	
		
			
				|  |  |    }
 |