Based on https://groups.google.com/d/topic/grpc-io/6e0GFRSWit8/discussion and the code, it seems that channel.shutdown() when using Netty transport kills open streams.
gracefulClose() calls close() which waits for gracefulShutdownTimeoutMillis. It seems we should either set the grace time to infinity or delay calling close until after all the streams are closed.
We need to investigate why AbstractTransportTest.openStreamPreventsTermination() failed to notice this.