diff options
Diffstat (limited to 'filedistribution')
2 files changed, 23 insertions, 5 deletions
diff --git a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDataBlob.java b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDataBlob.java index c22770395d3..1b9b7032698 100644 --- a/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDataBlob.java +++ b/filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDataBlob.java @@ -9,7 +9,7 @@ import java.nio.ByteBuffer; public class FileReferenceDataBlob extends FileReferenceData { private final byte[] content; private final long xxhash; - private boolean contentRead = false; + private int contentRead = 0; public FileReferenceDataBlob(FileReference fileReference, String filename, Type type, byte[] content) { this(fileReference, filename, type, content, XXHashFactory.fastestInstance().hash64().hash(ByteBuffer.wrap(content), 0)); @@ -31,12 +31,14 @@ public class FileReferenceDataBlob extends FileReferenceData { @Override public int nextContent(ByteBuffer bb) { - if (contentRead) { + if (contentRead >= content.length) { return -1; } else { - contentRead = true; - bb.put(content); - return content.length; + int left = content.length - contentRead; + int size = Math.min(bb.remaining(), left); + bb.put(content, contentRead, size); + contentRead += size; + return size; } } diff --git a/filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReferenceDataTest.java b/filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReferenceDataTest.java index 0b85def5809..f12935609b9 100644 --- a/filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReferenceDataTest.java +++ b/filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReferenceDataTest.java @@ -25,4 +25,20 @@ public class FileReferenceDataTest { assertEquals(-1, fileReferenceData.nextContent(byteBuffer)); } + @Test + public void testLargerDataBlob() { + String content = "blobbblubbblabb"; + FileReferenceData fileReferenceData = + new FileReferenceDataBlob(new FileReference("ref"), "foo", FileReferenceData.Type.compressed, Utf8.toBytes(content)); + ByteBuffer byteBuffer = ByteBuffer.allocate(10); + assertEquals(10, fileReferenceData.nextContent(byteBuffer)); + assertEquals(content.substring(0,10), Utf8.toString(Arrays.copyOfRange(byteBuffer.array(), 0, 10))); + byteBuffer.flip(); + assertEquals(5, fileReferenceData.nextContent(byteBuffer)); + assertEquals(content.substring(10,15), Utf8.toString(Arrays.copyOfRange(byteBuffer.array(), 0, 5))); + + // nextContent() will always return everything for FileReferenceDataBlob, so nothing more should be read + assertEquals(-1, fileReferenceData.nextContent(byteBuffer)); + } + } |