diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java index f5ab7ae3df..f121f6a30e 100644 --- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java +++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java @@ -284,6 +284,8 @@ class OkHttpClientTransport implements ClientTransport { private boolean startPendingStreams() { boolean hasStreamStarted = false; synchronized (lock) { + // No need to check goAway since the pendingStreams will be cleared when goAway + // becomes true. while (!pendingStreams.isEmpty() && streams.size() < maxConcurrentStreams) { OkHttpClientStream stream = pendingStreams.poll(); startStream(stream); diff --git a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java index 509d6ba69f..6c8159a710 100644 --- a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java +++ b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java @@ -660,19 +660,26 @@ public class OkHttpClientTransportTest { @Test public void pendingStreamFailedByGoAway() throws Exception { initTransport(); - setMaxConcurrentStreams(0); - final MockStreamListener listener = new MockStreamListener(); - final CountDownLatch newStreamReturn = new CountDownLatch(1); - // The stream should be pending. - clientTransport.newStream(method, new Metadata.Headers(), listener); - newStreamReturn.countDown(); + setMaxConcurrentStreams(1); + final MockStreamListener listener1 = new MockStreamListener(); + final MockStreamListener listener2 = new MockStreamListener(); + clientTransport.newStream(method, new Metadata.Headers(), listener1); + // The second stream should be pending. + clientTransport.newStream(method, new Metadata.Headers(), listener2); + waitForStreamPending(1); + assertEquals(1, activeStreamCount()); - frameHandler().goAway(0, ErrorCode.CANCEL, null); + // Receives GO_AWAY. + frameHandler().goAway(99, ErrorCode.CANCEL, null); - listener.waitUntilStreamClosed(); - assertEquals(Status.CANCELLED.getCode(), listener.status.getCode()); + listener2.waitUntilStreamClosed(); + assertEquals(Status.CANCELLED.getCode(), listener2.status.getCode()); assertEquals(0, clientTransport.getPendingStreamSize()); + + // active stream should not be affected. + assertEquals(1, activeStreamCount()); + getStream(3).sendCancel(Status.CANCELLED); } @Test @@ -680,10 +687,8 @@ public class OkHttpClientTransportTest { initTransport(); setMaxConcurrentStreams(0); final MockStreamListener listener = new MockStreamListener(); - final CountDownLatch newStreamReturn = new CountDownLatch(1); // The second stream should be pending. clientTransport.newStream(method, new Metadata.Headers(), listener); - newStreamReturn.countDown(); waitForStreamPending(1); clientTransport.shutdown();