Skip to content

Commit bdfdafe

Browse files
committed
core: fast-path return in ServerCallImpl.triggerEvent when closeCalled is true
Check closeCalled before dispatching triggerEvent to the transport stream, avoiding unnecessary task allocations and transport hops if the call has already been closed. TAG=agy CONV=e1bfa5a2-e855-4f79-abdd-ef2b264977be
1 parent 1b8a230 commit bdfdafe

2 files changed

Lines changed: 11 additions & 0 deletions

File tree

core/src/main/java/io/grpc/internal/ServerCallImpl.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,9 @@ public MethodDescriptor<ReqT, RespT> getMethodDescriptor() {
256256

257257
@Override
258258
public void triggerEvent(Object event) {
259+
if (closeCalled) {
260+
return;
261+
}
259262
try (TaskCloseable ignore = PerfMark.traceTask("ServerCall.triggerEvent")) {
260263
PerfMark.attachTag(tag);
261264
stream.triggerEvent(event);

core/src/test/java/io/grpc/internal/ServerCallImplTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,14 @@ public void triggerEvent_propagatesToStream() {
500500
verify(stream).triggerEvent(event);
501501
}
502502

503+
@Test
504+
public void triggerEvent_afterClose_noop() {
505+
call.close(Status.OK, new Metadata());
506+
Object event = new Object();
507+
call.triggerEvent(event);
508+
verify(stream, never()).triggerEvent(event);
509+
}
510+
503511
@Test
504512
public void streamListener_triggerEvent() {
505513
ServerStreamListenerImpl<Long> streamListener =

0 commit comments

Comments
 (0)