diff --git a/netty/src/main/java/io/grpc/netty/WriteQueue.java b/netty/src/main/java/io/grpc/netty/WriteQueue.java index 0b7624bc09..7c470e1e73 100644 --- a/netty/src/main/java/io/grpc/netty/WriteQueue.java +++ b/netty/src/main/java/io/grpc/netty/WriteQueue.java @@ -121,6 +121,7 @@ class WriteQueue { try { QueuedCommand cmd; int i = 0; + boolean flushedOnce = false; while ((cmd = queue.poll()) != null) { channel.write(cmd, cmd.promise()); if (++i == DEQUE_CHUNK_SIZE) { @@ -129,10 +130,11 @@ class WriteQueue { // might never end as new events are continuously added to the queue, if we never // flushed in that case we would be guaranteed to OOM. channel.flush(); + flushedOnce = true; } } - // Must flush at least once - if (i != 0) { + // Must flush at least once, even if there were no writes. + if (i != 0 || !flushedOnce) { channel.flush(); } } finally { diff --git a/netty/src/test/java/io/grpc/netty/WriteQueueTest.java b/netty/src/test/java/io/grpc/netty/WriteQueueTest.java index 2034ccc544..8ab600f867 100644 --- a/netty/src/test/java/io/grpc/netty/WriteQueueTest.java +++ b/netty/src/test/java/io/grpc/netty/WriteQueueTest.java @@ -71,7 +71,7 @@ public class WriteQueueTest { public ChannelPromise promise; private long writeCalledNanos; - private long flushCalledNanos = writeCalledNanos + 1; + private long flushCalledNanos = writeCalledNanos; /** * Set up for test. diff --git a/stub/src/main/java/io/grpc/stub/ClientCalls.java b/stub/src/main/java/io/grpc/stub/ClientCalls.java index b3cb880ac4..5c3fdf5ea6 100644 --- a/stub/src/main/java/io/grpc/stub/ClientCalls.java +++ b/stub/src/main/java/io/grpc/stub/ClientCalls.java @@ -40,7 +40,6 @@ import com.google.common.util.concurrent.ListenableFuture; import io.grpc.CallOptions; import io.grpc.Channel; import io.grpc.ClientCall; -import io.grpc.ExperimentalApi; import io.grpc.Metadata; import io.grpc.MethodDescriptor; import io.grpc.Status;