diff --git a/src/main/java/org/komamitsu/fluency/buffer/PackedForwardBuffer.java b/src/main/java/org/komamitsu/fluency/buffer/PackedForwardBuffer.java index 48462e51..68018b0b 100644 --- a/src/main/java/org/komamitsu/fluency/buffer/PackedForwardBuffer.java +++ b/src/main/java/org/komamitsu/fluency/buffer/PackedForwardBuffer.java @@ -50,15 +50,17 @@ private RetentionBuffer prepareBuffer(String tag, int writeSize) return retentionBuffer; } + int existingDataSize = 0; int newRetentionBufferSize; if (retentionBuffer == null) { newRetentionBufferSize = bufferConfig.getInitialBufferSize(); } else{ + existingDataSize = retentionBuffer.getByteBuffer().position(); newRetentionBufferSize = (int) (retentionBuffer.getByteBuffer().capacity() * bufferConfig.getBufferExpandRatio()); } - while (newRetentionBufferSize < writeSize) { + while (newRetentionBufferSize < (writeSize + existingDataSize)) { newRetentionBufferSize *= bufferConfig.getBufferExpandRatio(); } diff --git a/src/test/java/org/komamitsu/fluency/buffer/PackedForwardBufferTest.java b/src/test/java/org/komamitsu/fluency/buffer/PackedForwardBufferTest.java index 9dfd2963..619912a7 100644 --- a/src/test/java/org/komamitsu/fluency/buffer/PackedForwardBufferTest.java +++ b/src/test/java/org/komamitsu/fluency/buffer/PackedForwardBufferTest.java @@ -66,4 +66,35 @@ public void testGetBufferedDataSize() buffer.flush(sender, true); assertThat(buffer.getBufferedDataSize(), is(0L)); } + + @Test + public void testAppendIfItDoesNotThrowBufferOverflow() + throws IOException + { + PackedForwardBuffer buffer = new PackedForwardBuffer.Config().setInitialBufferSize(64 * 1024).createInstance(); + + StringBuilder buf = new StringBuilder(); + + for (int i = 0; i < 1024 * 60; i++) { + buf.append('x'); + } + String str60kb = buf.toString(); + + for (int i = 0; i < 1024 * 40; i++) { + buf.append('x'); + } + String str100kb = buf.toString(); + + { + Map map = new HashMap(); + map.put("k", str60kb); + buffer.append("tag0", new Date().getTime(), map); + } + + { + Map map = new HashMap(); + map.put("k", str100kb); + buffer.append("tag0", new Date().getTime(), map); + } + } } \ No newline at end of file