summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@yahoo-inc.com>2018-02-06 15:34:48 +0100
committerGitHub <noreply@github.com>2018-02-06 15:34:48 +0100
commit7e0c1619062e268d69f47c004574bb63ad496f72 (patch)
tree3e9303834f0c147be3a23deba21d2d8a61d4c3ea
parent384475dbec8d3a525a7ea7c0d14d65b75a529689 (diff)
parent3800655f1633b11a317dcd828799470a71b7a948 (diff)
Merge pull request #4931 from vespa-engine/balder/deliver-chunks-of-requested-size
Fill the buffer gradually.
-rw-r--r--filedistribution/src/main/java/com/yahoo/vespa/filedistribution/FileReferenceDataBlob.java12
-rw-r--r--filedistribution/src/test/java/com/yahoo/vespa/filedistribution/FileReferenceDataTest.java16
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));
+ }
+
}