diff --git a/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpClientTransport.java b/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpClientTransport.java index 0e37a3884e..04fd3612e2 100644 --- a/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpClientTransport.java +++ b/okhttp/src/main/java/io/grpc/transport/okhttp/OkHttpClientTransport.java @@ -279,19 +279,6 @@ public class OkHttpClientTransport implements ClientTransport { return hasStreamStarted; } - private void failPendingStreams(Status status) { - LinkedList streams; - synchronized (lock) { - streams = pendingStreams; - pendingStreams = new LinkedList(); - } - for (PendingStream stream : streams) { - stream.clientStream.transportReportStatus( - status, true, new Metadata.Trailers()); - stream.createdFuture.set(null); - } - } - @Override public void start(Listener listener) { this.listener = Preconditions.checkNotNull(listener, "listener"); @@ -368,6 +355,7 @@ public class OkHttpClientTransport implements ClientTransport { private void onGoAway(int lastKnownStreamId, Status status) { boolean notifyShutdown; ArrayList goAwayStreams = new ArrayList(); + List pendingStreamsCopy; synchronized (lock) { notifyShutdown = !goAway; goAway = true; @@ -382,6 +370,9 @@ public class OkHttpClientTransport implements ClientTransport { } } } + + pendingStreamsCopy = pendingStreams; + pendingStreams = new LinkedList(); } if (notifyShutdown) { @@ -390,7 +381,12 @@ public class OkHttpClientTransport implements ClientTransport { for (OkHttpClientStream stream : goAwayStreams) { stream.transportReportStatus(status, false, new Metadata.Trailers()); } - failPendingStreams(status); + + for (PendingStream stream : pendingStreamsCopy) { + stream.clientStream.transportReportStatus( + status, true, new Metadata.Trailers()); + stream.createdFuture.set(null); + } stopIfNecessary(); }