From a4c9dd32b6e987baa3371801c2c7c55e08795a8f Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Thu, 16 Aug 2018 11:01:43 -0700 Subject: [PATCH 1/2] cronet: report statsTraceCtx.clientOutboundHeaders() --- cronet/src/main/java/io/grpc/cronet/CronetClientStream.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cronet/src/main/java/io/grpc/cronet/CronetClientStream.java b/cronet/src/main/java/io/grpc/cronet/CronetClientStream.java index 100be20f5b3..091e050fdd1 100644 --- a/cronet/src/main/java/io/grpc/cronet/CronetClientStream.java +++ b/cronet/src/main/java/io/grpc/cronet/CronetClientStream.java @@ -65,6 +65,7 @@ class CronetClientStream extends AbstractClientStream { private static final String LOG_TAG = "grpc-java-cronet"; private final String url; private final String userAgent; + private final StatsTraceContext statsTraceCtx; private final Executor executor; private final Metadata headers; private final CronetClientTransport transport; @@ -98,6 +99,7 @@ class CronetClientStream extends AbstractClientStream { method.isSafe()); this.url = Preconditions.checkNotNull(url, "url"); this.userAgent = Preconditions.checkNotNull(userAgent, "userAgent"); + this.statsTraceCtx = Preconditions.checkNotNull(statsTraceCtx, "statsTraceCtx"); this.executor = Preconditions.checkNotNull(executor, "executor"); this.headers = Preconditions.checkNotNull(headers, "headers"); this.transport = Preconditions.checkNotNull(transport, "transport"); @@ -374,6 +376,7 @@ public void onStreamReady(BidirectionalStream stream) { // Now that the stream is ready, call the listener's onReady callback if // appropriate. state.onStreamAllocated(); + statsTraceCtx.clientOutboundHeaders(); state.streamReady = true; state.writeAllPendingData(); } From 4b82c1c57e1c168877bbacedbde9373a8ad6739a Mon Sep 17 00:00:00 2001 From: Eric Gribkoff Date: Fri, 17 Aug 2018 11:56:52 -0700 Subject: [PATCH 2/2] notify on first write --- .../src/main/java/io/grpc/cronet/CronetClientStream.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/cronet/src/main/java/io/grpc/cronet/CronetClientStream.java b/cronet/src/main/java/io/grpc/cronet/CronetClientStream.java index 091e050fdd1..de0bc629bd0 100644 --- a/cronet/src/main/java/io/grpc/cronet/CronetClientStream.java +++ b/cronet/src/main/java/io/grpc/cronet/CronetClientStream.java @@ -223,6 +223,8 @@ class TransportState extends Http2ClientStreamTransportState { private Status cancelReason; @GuardedBy("lock") private boolean readClosed; + @GuardedBy("lock") + private boolean firstWriteComplete; public TransportState( int maxMessageSize, StatsTraceContext statsTraceCtx, Object lock, @@ -376,7 +378,6 @@ public void onStreamReady(BidirectionalStream stream) { // Now that the stream is ready, call the listener's onReady callback if // appropriate. state.onStreamAllocated(); - statsTraceCtx.clientOutboundHeaders(); state.streamReady = true; state.writeAllPendingData(); } @@ -421,6 +422,12 @@ public void onWriteCompleted(BidirectionalStream stream, UrlResponseInfo info, Log.v(LOG_TAG, "onWriteCompleted"); } synchronized (state.lock) { + if (!state.firstWriteComplete) { + // Cronet API doesn't notify when headers are written to wire, but it occurs before first + // onWriteCompleted callback. + state.firstWriteComplete = true; + statsTraceCtx.clientOutboundHeaders(); + } state.onSentBytes(buffer.position()); } }