mirror of https://github.com/grpc/grpc-java.git
Update test to demonstrate that pending streams will not be started if the transport is in goAway status.
This commit is contained in:
parent
d2929cd1a3
commit
b42122b035
|
|
@ -284,6 +284,8 @@ class OkHttpClientTransport implements ClientTransport {
|
||||||
private boolean startPendingStreams() {
|
private boolean startPendingStreams() {
|
||||||
boolean hasStreamStarted = false;
|
boolean hasStreamStarted = false;
|
||||||
synchronized (lock) {
|
synchronized (lock) {
|
||||||
|
// No need to check goAway since the pendingStreams will be cleared when goAway
|
||||||
|
// becomes true.
|
||||||
while (!pendingStreams.isEmpty() && streams.size() < maxConcurrentStreams) {
|
while (!pendingStreams.isEmpty() && streams.size() < maxConcurrentStreams) {
|
||||||
OkHttpClientStream stream = pendingStreams.poll();
|
OkHttpClientStream stream = pendingStreams.poll();
|
||||||
startStream(stream);
|
startStream(stream);
|
||||||
|
|
|
||||||
|
|
@ -660,19 +660,26 @@ public class OkHttpClientTransportTest {
|
||||||
@Test
|
@Test
|
||||||
public void pendingStreamFailedByGoAway() throws Exception {
|
public void pendingStreamFailedByGoAway() throws Exception {
|
||||||
initTransport();
|
initTransport();
|
||||||
setMaxConcurrentStreams(0);
|
setMaxConcurrentStreams(1);
|
||||||
final MockStreamListener listener = new MockStreamListener();
|
final MockStreamListener listener1 = new MockStreamListener();
|
||||||
final CountDownLatch newStreamReturn = new CountDownLatch(1);
|
final MockStreamListener listener2 = new MockStreamListener();
|
||||||
// The stream should be pending.
|
clientTransport.newStream(method, new Metadata.Headers(), listener1);
|
||||||
clientTransport.newStream(method, new Metadata.Headers(), listener);
|
// The second stream should be pending.
|
||||||
newStreamReturn.countDown();
|
clientTransport.newStream(method, new Metadata.Headers(), listener2);
|
||||||
|
|
||||||
waitForStreamPending(1);
|
waitForStreamPending(1);
|
||||||
|
assertEquals(1, activeStreamCount());
|
||||||
|
|
||||||
frameHandler().goAway(0, ErrorCode.CANCEL, null);
|
// Receives GO_AWAY.
|
||||||
|
frameHandler().goAway(99, ErrorCode.CANCEL, null);
|
||||||
|
|
||||||
listener.waitUntilStreamClosed();
|
listener2.waitUntilStreamClosed();
|
||||||
assertEquals(Status.CANCELLED.getCode(), listener.status.getCode());
|
assertEquals(Status.CANCELLED.getCode(), listener2.status.getCode());
|
||||||
assertEquals(0, clientTransport.getPendingStreamSize());
|
assertEquals(0, clientTransport.getPendingStreamSize());
|
||||||
|
|
||||||
|
// active stream should not be affected.
|
||||||
|
assertEquals(1, activeStreamCount());
|
||||||
|
getStream(3).sendCancel(Status.CANCELLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
@ -680,10 +687,8 @@ public class OkHttpClientTransportTest {
|
||||||
initTransport();
|
initTransport();
|
||||||
setMaxConcurrentStreams(0);
|
setMaxConcurrentStreams(0);
|
||||||
final MockStreamListener listener = new MockStreamListener();
|
final MockStreamListener listener = new MockStreamListener();
|
||||||
final CountDownLatch newStreamReturn = new CountDownLatch(1);
|
|
||||||
// The second stream should be pending.
|
// The second stream should be pending.
|
||||||
clientTransport.newStream(method, new Metadata.Headers(), listener);
|
clientTransport.newStream(method, new Metadata.Headers(), listener);
|
||||||
newStreamReturn.countDown();
|
|
||||||
waitForStreamPending(1);
|
waitForStreamPending(1);
|
||||||
|
|
||||||
clientTransport.shutdown();
|
clientTransport.shutdown();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue