This is an automated email from the ASF dual-hosted git repository. dcapwell pushed a commit to branch CASSANDRA-20883_v2 in repository https://gitbox.apache.org/repos/asf/cassandra-accord.git
commit cef3cb40552f01887d4bdc739c78acca4171c2a4 Author: David Capwell <[email protected]> AuthorDate: Mon Sep 8 13:19:07 2025 -0700 CASSANDRA-20883: fixed a bug with the bit set when querying outside of the size --- .../src/main/java/accord/utils/LargeBitSet.java | 2 +- .../src/main/java/accord/utils/SmallBitSet.java | 2 ++ .../test/java/accord/utils/SimpleBitSetTest.java | 26 +++++++++++++++++----- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/accord-core/src/main/java/accord/utils/LargeBitSet.java b/accord-core/src/main/java/accord/utils/LargeBitSet.java index fbeae5bf..73309a05 100644 --- a/accord-core/src/main/java/accord/utils/LargeBitSet.java +++ b/accord-core/src/main/java/accord/utils/LargeBitSet.java @@ -320,7 +320,7 @@ public class LargeBitSet implements SimpleBitSet private int nextSetBitInternal(int i, int exclIndexBound, int ifNotFound) { Invariants.requireArgument(i >= 0); - Invariants.requireArgument(i <= size()); + if (i >= size()) return -1; if (count == 0) return ifNotFound; diff --git a/accord-core/src/main/java/accord/utils/SmallBitSet.java b/accord-core/src/main/java/accord/utils/SmallBitSet.java index a0e692f9..6efc39de 100644 --- a/accord-core/src/main/java/accord/utils/SmallBitSet.java +++ b/accord-core/src/main/java/accord/utils/SmallBitSet.java @@ -77,6 +77,8 @@ public class SmallBitSet implements SimpleBitSet @Override public int nextSetBit(int fromIndex) { + if (fromIndex >= 64) + return -1; long bits = this.bits & bitsEqualOrGreater(fromIndex); if (bits == 0) return -1; diff --git a/accord-core/src/test/java/accord/utils/SimpleBitSetTest.java b/accord-core/src/test/java/accord/utils/SimpleBitSetTest.java index 6c750eaa..69eb5c58 100644 --- a/accord-core/src/test/java/accord/utils/SimpleBitSetTest.java +++ b/accord-core/src/test/java/accord/utils/SimpleBitSetTest.java @@ -64,6 +64,12 @@ class SimpleBitSetTest return new Property.SimpleCommand<>("NextSetBit(" + idx + ')', s2 -> s2.nextSetBit(idx)); } + private static Property.Command<State, Void, ?> nextSetBitOutOfRange(RandomSource rs, State state) + { + int idx = rs.nextInt(state.size, Integer.MAX_VALUE); + return new Property.SimpleCommand<>("NextSetBitOutOfRange(" + idx + ')', s2 -> s2.nextSetBit(idx)); + } + @Test public void test() { @@ -74,6 +80,7 @@ class SimpleBitSetTest .add(SimpleBitSetTest::clear) .add(SimpleBitSetTest::isEmpty) .add(SimpleBitSetTest::nextSetBit) + .add(SimpleBitSetTest::nextSetBitOutOfRange) .build()); } @@ -145,13 +152,20 @@ class SimpleBitSetTest public int nextSetBit(int fromIndex) { int expected; - for (expected = fromIndex; expected < size; expected++) + if (fromIndex >= size) { - if (model.get(expected)) - break; - } - if (expected == size) expected = -1; + } + else + { + for (expected = fromIndex; expected < size; expected++) + { + if (model.get(expected)) + break; + } + if (expected == size) + expected = -1; + } int actual = sut.nextSetBit(fromIndex); Assertions.assertThat(actual).isEqualTo(expected); @@ -167,7 +181,7 @@ class SimpleBitSetTest @Override public String toString() { - return sut.getClass().getSimpleName(); + return sut.getClass().getSimpleName() + ", size=" + size; } } } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
