diff --git a/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java b/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java index b3e2e7a708..e3533c489d 100644 --- a/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java +++ b/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java @@ -175,7 +175,7 @@ public final class ChannelOutboundBuffer { } long newWriteBufferSize = TOTAL_PENDING_SIZE_UPDATER.addAndGet(this, size); - if (newWriteBufferSize >= channel.config().getWriteBufferHighWaterMark()) { + if (newWriteBufferSize > channel.config().getWriteBufferHighWaterMark()) { setUnwritable(invokeLater); } } @@ -194,8 +194,7 @@ public final class ChannelOutboundBuffer { } long newWriteBufferSize = TOTAL_PENDING_SIZE_UPDATER.addAndGet(this, -size); - if (notifyWritability && (newWriteBufferSize == 0 - || newWriteBufferSize <= channel.config().getWriteBufferLowWaterMark())) { + if (notifyWritability && newWriteBufferSize < channel.config().getWriteBufferLowWaterMark()) { setWritable(invokeLater); } } diff --git a/transport/src/test/java/io/netty/channel/ChannelOutboundBufferTest.java b/transport/src/test/java/io/netty/channel/ChannelOutboundBufferTest.java index 4a510db067..e65dbd4599 100644 --- a/transport/src/test/java/io/netty/channel/ChannelOutboundBufferTest.java +++ b/transport/src/test/java/io/netty/channel/ChannelOutboundBufferTest.java @@ -220,19 +220,21 @@ public class ChannelOutboundBufferTest { ch.config().setWriteBufferLowWaterMark(128); ch.config().setWriteBufferHighWaterMark(256); - // Ensure exceeding the low watermark does not make channel unwritable. ch.write(buffer().writeZero(128)); + // Ensure exceeding the low watermark does not make channel unwritable. + ch.write(buffer().writeZero(2)); assertThat(buf.toString(), is("")); ch.unsafe().outboundBuffer().addFlush(); // Ensure exceeding the high watermark makes channel unwritable. - ch.write(buffer().writeZero(128)); + ch.write(buffer().writeZero(127)); assertThat(buf.toString(), is("false ")); // Ensure going down to the low watermark makes channel writable again by flushing the first write. assertThat(ch.unsafe().outboundBuffer().remove(), is(true)); - assertThat(ch.unsafe().outboundBuffer().totalPendingWriteBytes(), is(128L)); + assertThat(ch.unsafe().outboundBuffer().remove(), is(true)); + assertThat(ch.unsafe().outboundBuffer().totalPendingWriteBytes(), is(127L)); assertThat(buf.toString(), is("false true ")); safeClose(ch); @@ -329,7 +331,7 @@ public class ChannelOutboundBufferTest { ChannelOutboundBuffer cob = ch.unsafe().outboundBuffer(); // Trigger channelWritabilityChanged() by writing a lot. - ch.write(buffer().writeZero(256)); + ch.write(buffer().writeZero(257)); assertThat(buf.toString(), is("false ")); // Ensure that setting a user-defined writability flag to false does not trigger channelWritabilityChanged()