core: fix terminated status check in TransportListener (#5955)

This commit is contained in:
Jihun Cho 2019-07-09 16:36:36 -07:00 committed by GitHub
parent 6615f2fc9d
commit d974bea4b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 4 deletions

View File

@ -494,6 +494,7 @@ final class InternalSubchannel implements InternalInstrumented<ChannelStats>, Tr
private class TransportListener implements ManagedClientTransport.Listener {
final ConnectionClientTransport transport;
final SocketAddress address;
boolean shutdownInitiated = false;
TransportListener(ConnectionClientTransport transport, SocketAddress address) {
this.transport = transport;
@ -530,6 +531,7 @@ final class InternalSubchannel implements InternalInstrumented<ChannelStats>, Tr
public void transportShutdown(final Status s) {
channelLogger.log(
ChannelLogLevel.INFO, "{0} SHUTDOWN with {1}", transport.getLogId(), printShortStatus(s));
shutdownInitiated = true;
syncContext.execute(new Runnable() {
@Override
public void run() {
@ -561,6 +563,9 @@ final class InternalSubchannel implements InternalInstrumented<ChannelStats>, Tr
@Override
public void transportTerminated() {
Preconditions.checkState(
shutdownInitiated, "transportShutdown() must be called before transportTerminated().");
channelLogger.log(ChannelLogLevel.INFO, "{0} Terminated", transport.getLogId());
channelz.removeClientSocket(transport);
handleTransportInUseState(transport, false);
@ -573,9 +578,6 @@ final class InternalSubchannel implements InternalInstrumented<ChannelStats>, Tr
}
}
});
Preconditions.checkState(activeTransport != transport,
"activeTransport still points to this transport. "
+ "Seems transportShutdown() was not called.");
}
}

View File

@ -839,6 +839,7 @@ public class InternalSubchannelTest {
internalSubchannel.shutdown(SHUTDOWN_REASON);
verify(transportInfo.transport).shutdown(same(SHUTDOWN_REASON));
assertExactCallbackInvokes("onStateChange:SHUTDOWN");
transportInfo.listener.transportShutdown(SHUTDOWN_REASON);
transportInfo.listener.transportTerminated();
assertExactCallbackInvokes("onTerminated");
@ -1144,7 +1145,9 @@ public class InternalSubchannelTest {
internalSubchannel.obtainActiveTransport();
MockClientTransportInfo t0 = transports.poll();
t0.listener.transportReady();
assertTrue(channelz.containsClientSocket(t0.transport.getLogId()));
t0.listener.transportShutdown(Status.RESOURCE_EXHAUSTED);
t0.listener.transportTerminated();
assertFalse(channelz.containsClientSocket(t0.transport.getLogId()));
}

View File

@ -521,8 +521,10 @@ public class ManagedChannelImplTest {
MockClientTransportInfo transportInfo = transports.poll();
assertNotNull(transportInfo);
assertTrue(channelz.containsClientSocket(transportInfo.transport.getLogId()));
transportInfo.listener.transportReady();
// terminate transport
transportInfo.listener.transportShutdown(Status.CANCELLED);
transportInfo.listener.transportTerminated();
assertFalse(channelz.containsClientSocket(transportInfo.transport.getLogId()));
@ -564,6 +566,7 @@ public class ManagedChannelImplTest {
assertTrue(channelz.containsClientSocket(transportInfo.transport.getLogId()));
// terminate transport
transportInfo.listener.transportShutdown(Status.INTERNAL);
transportInfo.listener.transportTerminated();
assertFalse(channelz.containsClientSocket(transportInfo.transport.getLogId()));
@ -3270,6 +3273,7 @@ public class ManagedChannelImplTest {
verify(mockLoadBalancer).shutdown();
// simulating the shutdown of load balancer triggers the shutdown of subchannel
shutdownSafely(helper, subchannel);
transportInfo.listener.transportShutdown(Status.INTERNAL);
transportInfo.listener.transportTerminated(); // simulating transport terminated
assertTrue(
"channel.isTerminated() is expected to be true but was false",
@ -3369,7 +3373,9 @@ public class ManagedChannelImplTest {
verify(mockLoadBalancer).shutdown();
// simulating the shutdown of load balancer triggers the shutdown of subchannel
shutdownSafely(helper, subchannel);
transportInfo.listener.transportTerminated(); // simulating transport terminated
// simulating transport shutdown & terminated
transportInfo.listener.transportShutdown(Status.INTERNAL);
transportInfo.listener.transportTerminated();
assertTrue(
"channel.isTerminated() is expected to be true but was false",
channel.isTerminated());