From 95279db5ef78fcd64259bf6a1b5341377f3461b3 Mon Sep 17 00:00:00 2001 From: Cristian Ferretti <37232625+jcferretti@users.noreply.github.com> Date: Tue, 25 May 2021 09:24:29 -0400 Subject: [PATCH] Fix integer overflow in SortedRanges.invertOnNew. Fixes #666. (#667) * Fix integer overflow in SortedRanges.invertOnNew. Fixes #666. * Fix another instance of an int pos that should have been long. Co-authored-by: Cristian Ferretti --- .../v2/utils/sortedranges/SortedRanges.java | 4 +-- .../utils/TestIncrementalReleaseFilter.java | 30 +++++++++++++++++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/DB/src/main/java/io/deephaven/db/v2/utils/sortedranges/SortedRanges.java b/DB/src/main/java/io/deephaven/db/v2/utils/sortedranges/SortedRanges.java index 62253a2f13e..9c187f8cb8c 100644 --- a/DB/src/main/java/io/deephaven/db/v2/utils/sortedranges/SortedRanges.java +++ b/DB/src/main/java/io/deephaven/db/v2/utils/sortedranges/SortedRanges.java @@ -2191,7 +2191,7 @@ static boolean removeLegacy(final MutableObject sarOut, final Inde public final TreeIndexImpl invertRangeOnNew(final long start, final long end, final long maxPosition) { final long packedStart = pack(start); int i = 0; - int pos = 0; + long pos = 0; long data = packedGet(i); boolean neg = false; long pendingStart = -1; @@ -2260,7 +2260,7 @@ public final boolean invertOnNew( long end = rit.currentRangeEnd(); long packedStart = pack(start); int i = 0; - int pos = 0; + long pos = 0; long data = packedGet(i); boolean neg = false; long pendingStart = -1; diff --git a/DB/src/test/java/io/deephaven/db/v2/utils/TestIncrementalReleaseFilter.java b/DB/src/test/java/io/deephaven/db/v2/utils/TestIncrementalReleaseFilter.java index b1dc33b64eb..dbcdd8f6ea6 100644 --- a/DB/src/test/java/io/deephaven/db/v2/utils/TestIncrementalReleaseFilter.java +++ b/DB/src/test/java/io/deephaven/db/v2/utils/TestIncrementalReleaseFilter.java @@ -14,10 +14,12 @@ import io.deephaven.db.v2.select.IncrementalReleaseFilter; import org.junit.experimental.categories.Category; -import static io.deephaven.db.v2.TstUtils.getTable; -import static io.deephaven.db.v2.TstUtils.initColumnInfos; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static io.deephaven.db.v2.TstUtils.assertTableEquals; -@Category(OutOfBandTest.class) public class TestIncrementalReleaseFilter extends LiveTableTestCase { public void testSimple() { final Table source = TableTools.newTable(TableTools.intCol("Sentinel", 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)); @@ -37,6 +39,28 @@ public void testSimple() { } } + public void testBigTable() { + final Table sourcePart = TableTools.emptyTable(1_000_000_000L); + final List sourceParts = IntStream.range(0, 20).mapToObj(x -> sourcePart).collect(Collectors.toList()); + final Table source = TableTools.merge(sourceParts); + TableTools.show(source); + + final IncrementalReleaseFilter incrementalReleaseFilter = new IncrementalReleaseFilter(2, 10_000_000); + final Table filtered = source.where(incrementalReleaseFilter); + final Table flattened = filtered.flatten(); + + assertEquals(2, filtered.size()); + + int cycles = 0; + while (filtered.size() < source.size()) { + LiveTableMonitor.DEFAULT.runWithinUnitTestCycle(incrementalReleaseFilter::refresh); + cycles++; + } + assertTableEquals(source, filtered); + assertTableEquals(flattened, filtered); + System.out.println("Cycles: " + cycles); + } + static public T sleepValue(long duration, T retVal) { final Object blech = new Object(); //noinspection SynchronizationOnLocalVariableOrMethodParameter