Motivation: Regression appeared after making changes in fix #10360 . The main problem here that `buffer.getBytes(buffer.readerIndex(), fileChannel, fileChannel.position(), localsize)` doesn't change channel position after writes. Modification: Manually set position according to the written bytes. Result: Fixes #10449 .
This commit is contained in:
parent
5aea78950f
commit
686df17b1a
@ -156,7 +156,6 @@ public abstract class AbstractDiskHttpData extends AbstractHttpData {
|
|||||||
throw new IOException("Out of size: " + (size + localsize) +
|
throw new IOException("Out of size: " + (size + localsize) +
|
||||||
" > " + definedSize);
|
" > " + definedSize);
|
||||||
}
|
}
|
||||||
int written = 0;
|
|
||||||
if (file == null) {
|
if (file == null) {
|
||||||
file = tempFile();
|
file = tempFile();
|
||||||
}
|
}
|
||||||
@ -164,9 +163,21 @@ public abstract class AbstractDiskHttpData extends AbstractHttpData {
|
|||||||
RandomAccessFile accessFile = new RandomAccessFile(file, "rw");
|
RandomAccessFile accessFile = new RandomAccessFile(file, "rw");
|
||||||
fileChannel = accessFile.getChannel();
|
fileChannel = accessFile.getChannel();
|
||||||
}
|
}
|
||||||
buffer.getBytes(buffer.readerIndex(), fileChannel, fileChannel.position(), localsize);
|
int totalWritten = 0;
|
||||||
|
long position = fileChannel.position();
|
||||||
|
int index = buffer.readerIndex();
|
||||||
|
while (totalWritten < localsize) {
|
||||||
|
int written = buffer.getBytes(index, fileChannel, position, localsize - totalWritten);
|
||||||
|
if (written < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
totalWritten += written;
|
||||||
|
position += written;
|
||||||
|
index += written;
|
||||||
|
}
|
||||||
|
fileChannel.position(position);
|
||||||
|
buffer.readerIndex(index);
|
||||||
size += localsize;
|
size += localsize;
|
||||||
buffer.readerIndex(buffer.readerIndex() + written);
|
|
||||||
} finally {
|
} finally {
|
||||||
// Release the buffer as it was retained before and we not need a reference to it at all
|
// Release the buffer as it was retained before and we not need a reference to it at all
|
||||||
// See https://github.com/netty/netty/issues/1516
|
// See https://github.com/netty/netty/issues/1516
|
||||||
|
@ -113,16 +113,19 @@ public class DiskFileUploadTest {
|
|||||||
public void testAddContents() throws Exception {
|
public void testAddContents() throws Exception {
|
||||||
DiskFileUpload f1 = new DiskFileUpload("file1", "file1", "application/json", null, null, 0);
|
DiskFileUpload f1 = new DiskFileUpload("file1", "file1", "application/json", null, null, 0);
|
||||||
try {
|
try {
|
||||||
String json = "{\"foo\":\"bar\"}";
|
byte[] jsonBytes = new byte[4096];
|
||||||
byte[] bytes = json.getBytes(CharsetUtil.UTF_8);
|
PlatformDependent.threadLocalRandom().nextBytes(jsonBytes);
|
||||||
f1.addContent(Unpooled.wrappedBuffer(bytes), true);
|
|
||||||
assertEquals(json, f1.getString());
|
f1.addContent(Unpooled.wrappedBuffer(jsonBytes, 0, 1024), false);
|
||||||
assertArrayEquals(bytes, f1.get());
|
f1.addContent(Unpooled.wrappedBuffer(jsonBytes, 1024, jsonBytes.length - 1024), true);
|
||||||
|
assertArrayEquals(jsonBytes, f1.get());
|
||||||
|
|
||||||
File file = f1.getFile();
|
File file = f1.getFile();
|
||||||
assertEquals((long) bytes.length, file.length());
|
assertEquals(jsonBytes.length, file.length());
|
||||||
|
|
||||||
FileInputStream fis = new FileInputStream(file);
|
FileInputStream fis = new FileInputStream(file);
|
||||||
try {
|
try {
|
||||||
byte[] buf = new byte[bytes.length];
|
byte[] buf = new byte[jsonBytes.length];
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
int read = 0;
|
int read = 0;
|
||||||
int len = buf.length;
|
int len = buf.length;
|
||||||
@ -133,7 +136,7 @@ public class DiskFileUploadTest {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
assertArrayEquals(bytes, buf);
|
assertArrayEquals(jsonBytes, buf);
|
||||||
} finally {
|
} finally {
|
||||||
fis.close();
|
fis.close();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user