From a3f2f6249e5fd7d809b780f8e160796c469dc045 Mon Sep 17 00:00:00 2001 From: Xudong Ma Date: Thu, 27 Aug 2015 14:35:35 -0700 Subject: [PATCH] OkHttp: Fix race condition between sendCancel and sendFrame --- okhttp/src/main/java/io/grpc/okhttp/OkHttpClientStream.java | 5 ++++- .../test/java/io/grpc/okhttp/OkHttpClientTransportTest.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientStream.java b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientStream.java index ffa4b316bf..9a299b595e 100644 --- a/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientStream.java +++ b/okhttp/src/main/java/io/grpc/okhttp/OkHttpClientStream.java @@ -190,11 +190,14 @@ class OkHttpClientStream extends Http2ClientStream { } synchronized (lock) { + if (cancelSent) { + return; + } if (pendingData != null) { // Stream is pending start, queue the data. pendingData.add(new PendingData(buffer, endOfStream, flush)); } else { - checkState(id() != 0, "streamId should be set"); + checkState(id() != null, "streamId should be set"); // If buffer > frameWriter.maxDataLength() the flow-controller will ensure that it is // properly chunked. outboundFlow.data(endOfStream, id(), buffer, flush); diff --git a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java index cf81e9cce6..997d4adf6d 100644 --- a/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java +++ b/okhttp/src/test/java/io/grpc/okhttp/OkHttpClientTransportTest.java @@ -197,7 +197,7 @@ public class OkHttpClientTransportTest { startTransport(3, null, true, 1); MockStreamListener listener = new MockStreamListener(); - clientTransport.newStream(method, new Metadata.Headers(), listener).request(1); + clientTransport.newStream(method, new Metadata(), listener).request(1); assertContainStream(3); frameHandler().headers(false, false, 3, 0, grpcResponseHeaders(), HeadersMode.HTTP_20_HEADERS); assertNotNull(listener.headers);