Skip to content

Commit 08a2106

Browse files
dapengzhang0carl-mastrangelo
authored andcommitted
core,netty: quick patch for setListener regression
resolves grpc/grpc#8715 now that setListener is called prior to `JumpToApplicationThreadServerStreamListener` being completely ready to use. We should not call `AbstractStream2#onStreamAllocated()` inside `setListener()` anymore, but call it after `ServerImpl#streamCreated()` is completed.
1 parent 872c239 commit 08a2106

File tree

5 files changed

+22
-8
lines changed

5 files changed

+22
-8
lines changed

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ protected interface Sink {
8585
* Tears down the stream, typically in the event of a timeout. This method may be called
8686
* multiple times and from any thread.
8787
*
88-
* <p>This is a clone of {@link ServerStream#cancel()}.
88+
* <p>This is a clone of {@link ServerStream#cancel(Status)}.
8989
*/
9090
void cancel(Status status);
9191
}
@@ -177,11 +177,13 @@ protected TransportState(int maxMessageSize) {
177177
* thread.
178178
*/
179179
public final void setListener(ServerStreamListener listener) {
180-
this.listener = Preconditions.checkNotNull(listener);
180+
Preconditions.checkState(this.listener == null, "setListener should be called only once");
181+
this.listener = Preconditions.checkNotNull(listener, "listener");
182+
}
181183

182-
// Now that the stream has actually been initialized, call the listener's onReady callback if
183-
// appropriate.
184-
onStreamAllocated();
184+
@Override
185+
public final void onStreamAllocated() {
186+
super.onStreamAllocated();
185187
}
186188

187189
@Override

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ private boolean isReady() {
224224
* StreamListener#onReady()} handler if appropriate. This must be called from the transport
225225
* thread, since the listener may be called back directly.
226226
*/
227-
protected final void onStreamAllocated() {
227+
protected void onStreamAllocated() {
228228
checkState(listener() != null);
229229
synchronized (onReadyLock) {
230230
checkState(!allocated, "Already allocated");

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,17 +107,27 @@ public void completeWithoutClose() {
107107

108108
@Test
109109
public void setListener_setOnlyOnce() {
110-
111110
stream.transportState().setListener(new ServerStreamListenerBase());
112111
thrown.expect(IllegalStateException.class);
113112

114113
stream.transportState().setListener(new ServerStreamListenerBase());
115114
}
116115

117116
@Test
118-
public void setListener_readyCalled() {
117+
public void listenerReady_onlyOnce() {
118+
stream.transportState().setListener(new ServerStreamListenerBase());
119+
stream.transportState().onStreamAllocated();
120+
thrown.expect(IllegalStateException.class);
121+
122+
stream.transportState().onStreamAllocated();
123+
}
124+
125+
126+
@Test
127+
public void listenerReady_readyCalled() {
119128
ServerStreamListener streamListener = mock(ServerStreamListener.class);
120129
stream.transportState().setListener(streamListener);
130+
stream.transportState().onStreamAllocated();
121131

122132
verify(streamListener).onReady();
123133
}

netty/src/main/java/io/grpc/netty/NettyServerHandler.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ private void onHeadersRead(ChannelHandlerContext ctx, int streamId, Http2Headers
194194

195195
Metadata metadata = Utils.convertHeaders(headers);
196196
transportListener.streamCreated(stream, method, metadata);
197+
state.onStreamAllocated();
197198
http2Stream.setProperty(streamKey, state);
198199
} catch (Http2Exception e) {
199200
throw e;

netty/src/test/java/io/grpc/netty/NettyServerStreamTest.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ public Object answer(InvocationOnMock invocation) throws Throwable {
294294
new NettyServerStream.TransportState(handler, http2Stream, DEFAULT_MAX_MESSAGE_SIZE);
295295
NettyServerStream stream = new NettyServerStream(channel, state);
296296
stream.transportState().setListener(serverListener);
297+
state.onStreamAllocated();
297298
verify(serverListener, atLeastOnce()).onReady();
298299
verifyNoMoreInteractions(serverListener);
299300
return stream;

0 commit comments

Comments
 (0)