From c241460f45069ea8aa821929f3b384f380e0bad6 Mon Sep 17 00:00:00 2001 From: Kun Zhang Date: Wed, 11 Apr 2018 17:56:57 -0700 Subject: [PATCH] core: always call StreamTracer.streamClosed() when stream is officially closed. Previously StreamTracer.streamClosed() is called in ServerStream.close(), but it is not exactly when the stream is officially closed. ServerStreamListener.closed() is guaranteed to be called and it is the official end of the stream. --- core/src/main/java/io/grpc/internal/AbstractServerStream.java | 2 +- .../java/io/grpc/internal/testing/AbstractTransportTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/io/grpc/internal/AbstractServerStream.java b/core/src/main/java/io/grpc/internal/AbstractServerStream.java index 7cdb69e97e1..ec4a8e69692 100644 --- a/core/src/main/java/io/grpc/internal/AbstractServerStream.java +++ b/core/src/main/java/io/grpc/internal/AbstractServerStream.java @@ -128,7 +128,6 @@ public final void close(Status status, Metadata trailers) { Preconditions.checkNotNull(trailers, "trailers"); if (!outboundClosed) { outboundClosed = true; - statsTraceCtx.streamClosed(status); endOfMessages(); addStatusToTrailers(trailers, status); // Safe to set without synchronization because access is tightly controlled. @@ -336,6 +335,7 @@ private void closeListener(Status newStatus) { statsTraceCtx.streamClosed(newStatus); getTransportTracer().reportStreamClosed(false); } else { + statsTraceCtx.streamClosed(closedStatus); getTransportTracer().reportStreamClosed(closedStatus.isOk()); } listenerClosed = true; diff --git a/testing/src/main/java/io/grpc/internal/testing/AbstractTransportTest.java b/testing/src/main/java/io/grpc/internal/testing/AbstractTransportTest.java index d69d2d527a9..5caca3712b1 100644 --- a/testing/src/main/java/io/grpc/internal/testing/AbstractTransportTest.java +++ b/testing/src/main/java/io/grpc/internal/testing/AbstractTransportTest.java @@ -776,10 +776,10 @@ public void basicStream() throws Exception { trailers.put(asciiKey, "dupvalue"); trailers.put(binaryKey, "äbinarytrailers"); serverStream.close(status, trailers); - assertSame(status, serverStreamTracer1.getStatus()); assertNull(serverStreamTracer1.nextInboundEvent()); assertNull(serverStreamTracer1.nextOutboundEvent()); assertCodeEquals(Status.OK, serverStreamListener.status.get(TIMEOUT_MS, TimeUnit.MILLISECONDS)); + assertSame(status, serverStreamTracer1.getStatus()); Status clientStreamStatus = clientStreamListener.status.get(TIMEOUT_MS, TimeUnit.MILLISECONDS); Metadata clientStreamTrailers = clientStreamListener.trailers.get(TIMEOUT_MS, TimeUnit.MILLISECONDS);