diff --git a/core/src/testFixtures/java/io/grpc/internal/AbstractTransportTest.java b/core/src/testFixtures/java/io/grpc/internal/AbstractTransportTest.java index a1c00d7dca..6129bb706c 100644 --- a/core/src/testFixtures/java/io/grpc/internal/AbstractTransportTest.java +++ b/core/src/testFixtures/java/io/grpc/internal/AbstractTransportTest.java @@ -2106,6 +2106,9 @@ public abstract class AbstractTransportTest { * be present, and the cause should be stripped away. */ private static void checkClientStatus(Status expectedStatus, Status clientStreamStatus) { + if (!clientStreamStatus.isOk() && clientStreamStatus.getCode() != expectedStatus.getCode()) { + System.out.println("Full Status: " + clientStreamStatus); + } assertEquals(expectedStatus.getCode(), clientStreamStatus.getCode()); assertEquals(expectedStatus.getDescription(), clientStreamStatus.getDescription()); assertNull(clientStreamStatus.getCause()); diff --git a/netty/src/main/java/io/grpc/netty/NettyServerHandler.java b/netty/src/main/java/io/grpc/netty/NettyServerHandler.java index fd053125d5..bbf2f17748 100644 --- a/netty/src/main/java/io/grpc/netty/NettyServerHandler.java +++ b/netty/src/main/java/io/grpc/netty/NettyServerHandler.java @@ -512,6 +512,9 @@ class NettyServerHandler extends AbstractNettyHandler { flowControlPing().onDataRead(data.readableBytes(), padding); try { NettyServerStream.TransportState stream = serverStream(requireHttp2Stream(streamId)); + if (stream == null) { + return; + } try (TaskCloseable ignore = PerfMark.traceTask("NettyServerHandler.onDataRead")) { PerfMark.attachTag(stream.tag()); stream.inboundDataReceived(data, endOfStream); @@ -679,12 +682,14 @@ class NettyServerHandler extends AbstractNettyHandler { private void closeStreamWhenDone(ChannelPromise promise, int streamId) throws Http2Exception { final NettyServerStream.TransportState stream = serverStream(requireHttp2Stream(streamId)); - promise.addListener(new ChannelFutureListener() { - @Override - public void operationComplete(ChannelFuture future) { - stream.complete(); - } - }); + if (stream != null) { + promise.addListener(new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture future) { + stream.complete(); + } + }); + } } /** diff --git a/netty/src/test/java/io/grpc/netty/NettyServerHandlerTest.java b/netty/src/test/java/io/grpc/netty/NettyServerHandlerTest.java index 2f92de5a89..6ee9960995 100644 --- a/netty/src/test/java/io/grpc/netty/NettyServerHandlerTest.java +++ b/netty/src/test/java/io/grpc/netty/NettyServerHandlerTest.java @@ -634,6 +634,34 @@ public class NettyServerHandlerTest extends NettyHandlerTestBase pickCount = new HashMap<>(); for (int i = 0; i < 1000; i++) { int result = sss.pick(); - pickCount.put(result, pickCount.getOrDefault(result, 0) + 1); + pickCount.merge(result, 1, (o, v) -> o + v); } for (int i = 0; i < 3; i++) { assertThat(Math.abs(pickCount.getOrDefault(i, 0) / 1000.0 - weights[i] / totalWeight))