diff --git a/common/src/main/java/io/netty/util/concurrent/DefaultProgressivePromise.java b/common/src/main/java/io/netty/util/concurrent/DefaultProgressivePromise.java index d3c32a5386..164fac5136 100644 --- a/common/src/main/java/io/netty/util/concurrent/DefaultProgressivePromise.java +++ b/common/src/main/java/io/netty/util/concurrent/DefaultProgressivePromise.java @@ -55,7 +55,12 @@ public class DefaultProgressivePromise extends DefaultPromise implements P @Override public boolean tryProgress(long progress, long total) { - if (progress < 0 || progress > total || isDone()) { + if (total < 0) { + total = -1; + if (progress < 0 || isDone()) { + return false; + } + } else if (progress < 0 || progress > total || isDone()) { return false; } diff --git a/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java b/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java index 9e85fa0f98..948cc45461 100644 --- a/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java +++ b/example/src/main/java/io/netty/example/http/file/HttpStaticFileServerHandler.java @@ -22,6 +22,7 @@ import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelProgressiveFuture; import io.netty.channel.ChannelProgressiveFutureListener; +import io.netty.channel.DefaultFileRegion; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.handler.codec.http.DefaultFullHttpResponse; import io.netty.handler.codec.http.DefaultHttpResponse; @@ -106,6 +107,12 @@ public class HttpStaticFileServerHandler extends SimpleChannelInboundHandler) pendingMessage); currentWrite.fail(future.cause()); - } else if (isWritable()) { - currentWrite.progress(); - resumeTransfer(); } else { currentWrite.progress(); + if (isWritable()) { + resumeTransfer(); + } } } }); diff --git a/transport/src/main/java/io/netty/channel/AbstractChannel.java b/transport/src/main/java/io/netty/channel/AbstractChannel.java index c51cd072b4..50e4c4b8f7 100644 --- a/transport/src/main/java/io/netty/channel/AbstractChannel.java +++ b/transport/src/main/java/io/netty/channel/AbstractChannel.java @@ -794,13 +794,16 @@ public abstract class AbstractChannel extends DefaultAttributeMap implements Cha * Calculate the number of bytes a message takes up in memory. Sub-classes may override this if they use different * messages then {@link ByteBuf} or {@link ByteBufHolder}. If the size can not be calculated 0 should be returned. */ - protected int calculateMessageSize(Object message) { + protected long calculateMessageSize(Object message) { if (message instanceof ByteBuf) { return ((ByteBuf) message).readableBytes(); } if (message instanceof ByteBufHolder) { return ((ByteBufHolder) message).content().readableBytes(); } + if (message instanceof FileRegion) { + return ((FileRegion) message).count(); + } return 0; } diff --git a/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java b/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java index 5d444b465b..2d9fc73323 100644 --- a/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java +++ b/transport/src/main/java/io/netty/channel/ChannelOutboundBuffer.java @@ -145,7 +145,7 @@ public final class ChannelOutboundBuffer { unflushed = this.unflushed; } - final int size = channel.calculateMessageSize(msg); + final long size = channel.calculateMessageSize(msg); incrementPendingOutboundBytes(size); unflushed[unflushedCount] = msg; @@ -249,7 +249,7 @@ public final class ChannelOutboundBuffer { tail = n; } - private void incrementPendingOutboundBytes(int size) { + private void incrementPendingOutboundBytes(long size) { if (size == 0) { return; }