diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java index 3b9513eeb47..29d3dbc1cdf 100644 --- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java +++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientTransport.java @@ -953,8 +953,8 @@ void finishStream( } if (!startPendingStreams()) { stopIfNecessary(); - maybeClearInUse(stream); } + maybeClearInUse(stream); } } } diff --git a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java index 7347399bfe5..ab7dff98444 100644 --- a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java +++ b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java @@ -2080,6 +2080,26 @@ public void shutdownNow_streamListenerRpcProgress() throws Exception { assertEquals(MISCARRIED, listener3.rpcProgress); } + @Test + public void finishedStreamRemovedFromInUseState() throws Exception { + initTransport(); + setMaxConcurrentStreams(1); + final MockStreamListener listener = new MockStreamListener(); + OkHttpClientStream stream = + clientTransport.newStream(method, new Metadata(), CallOptions.DEFAULT, tracers); + stream.start(listener); + OkHttpClientStream pendingStream = + clientTransport.newStream(method, new Metadata(), CallOptions.DEFAULT, tracers); + pendingStream.start(listener); + waitForStreamPending(1); + clientTransport.finishStream(stream.transportState().id(), Status.OK, PROCESSED, + false, null, null); + verify(transportListener).transportInUse(true); + clientTransport.finishStream(pendingStream.transportState().id(), Status.OK, PROCESSED, + false, null, null); + verify(transportListener).transportInUse(false); + } + private int activeStreamCount() { return clientTransport.getActiveStreams().length; }