Skip to content

Commit e63929e

Browse files
committed
Add overflow behaviour test for RecyclerBytesStreamOutput (elastic#90638)
Relates elastic#90632
1 parent ebb6d52 commit e63929e

File tree

1 file changed

+51
-0
lines changed

1 file changed

+51
-0
lines changed

server/src/test/java/org/elasticsearch/common/io/stream/RecyclerBytesStreamOutputTests.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.elasticsearch.common.geo.GeoPoint;
1818
import org.elasticsearch.common.lucene.BytesRefs;
1919
import org.elasticsearch.common.recycler.Recycler;
20+
import org.elasticsearch.common.unit.ByteSizeUnit;
2021
import org.elasticsearch.common.util.Maps;
2122
import org.elasticsearch.common.util.PageCacheRecycler;
2223
import org.elasticsearch.core.TimeValue;
@@ -38,6 +39,7 @@
3839
import java.util.Objects;
3940
import java.util.TreeMap;
4041
import java.util.concurrent.TimeUnit;
42+
import java.util.concurrent.atomic.AtomicLong;
4143
import java.util.function.Supplier;
4244
import java.util.stream.Collectors;
4345
import java.util.stream.IntStream;
@@ -46,6 +48,7 @@
4648
import static org.hamcrest.Matchers.containsString;
4749
import static org.hamcrest.Matchers.endsWith;
4850
import static org.hamcrest.Matchers.equalTo;
51+
import static org.hamcrest.Matchers.greaterThan;
4952
import static org.hamcrest.Matchers.hasSize;
5053
import static org.hamcrest.Matchers.instanceOf;
5154
import static org.hamcrest.Matchers.is;
@@ -978,4 +981,52 @@ boolean failOnTooManyNestedExceptions(Throwable throwable) {
978981
assertThat(newEx.getMessage(), equalTo("disk broken"));
979982
assertArrayEquals(newEx.getStackTrace(), rootEx.getStackTrace());
980983
}
984+
985+
public void testOverflow() {
986+
final var pageSize = randomFrom(ByteSizeUnit.MB.toIntBytes(1L), ByteSizeUnit.KB.toIntBytes(16)) + between(-1024, 1024);
987+
final var pagesAllocated = new AtomicLong();
988+
989+
try (RecyclerBytesStreamOutput output = new RecyclerBytesStreamOutput(new Recycler<>() {
990+
private final V<BytesRef> page = new V<>() {
991+
private final BytesRef bytesRef = new BytesRef(new byte[pageSize]);
992+
993+
@Override
994+
public BytesRef v() {
995+
return bytesRef;
996+
}
997+
998+
@Override
999+
public boolean isRecycled() {
1000+
return false;
1001+
}
1002+
1003+
@Override
1004+
public void close() {
1005+
pagesAllocated.decrementAndGet();
1006+
}
1007+
};
1008+
1009+
@Override
1010+
public V<BytesRef> obtain() {
1011+
pagesAllocated.incrementAndGet();
1012+
return page;
1013+
}
1014+
})) {
1015+
var bytesAllocated = 0;
1016+
while (bytesAllocated < Integer.MAX_VALUE) {
1017+
var thisAllocation = between(1, Integer.MAX_VALUE - bytesAllocated);
1018+
bytesAllocated += thisAllocation;
1019+
final var expectedPages = ((long) bytesAllocated + pageSize - 1) / pageSize;
1020+
try {
1021+
output.skip(thisAllocation);
1022+
assertThat(pagesAllocated.get(), equalTo(expectedPages));
1023+
} catch (IllegalArgumentException e) {
1024+
assertThat(expectedPages * pageSize, greaterThan((long) Integer.MAX_VALUE));
1025+
return;
1026+
}
1027+
}
1028+
} finally {
1029+
assertThat(pagesAllocated.get(), equalTo(0L));
1030+
}
1031+
}
9811032
}

0 commit comments

Comments
 (0)