Skip to content

Commit a9cc6ac

Browse files
committed
Fallback to ArrayUtil.oversize if we overflow targets
1 parent 5f2dddd commit a9cc6ac

File tree

3 files changed

+38
-2
lines changed

3 files changed

+38
-2
lines changed

collections/src/test/java/org/neo4j/gds/collections/ArrayUtilTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@
2222
import org.junit.jupiter.api.Assertions;
2323
import org.junit.jupiter.api.Test;
2424
import org.junit.jupiter.params.ParameterizedTest;
25+
import org.junit.jupiter.params.provider.Arguments;
2526
import org.junit.jupiter.params.provider.MethodSource;
2627

2728
import java.util.Arrays;
2829
import java.util.Locale;
2930
import java.util.stream.Stream;
3031

3132
import static org.assertj.core.api.Assertions.assertThat;
33+
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
3234
import static org.junit.jupiter.api.Assertions.assertArrayEquals;
3335
import static org.junit.jupiter.api.Assertions.assertEquals;
3436
import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -190,4 +192,21 @@ void oversizeAlignsToPointerSize() {
190192
// 42 + (42/8) == 47, which gets aligned to 48
191193
assertEquals(48, actual);
192194
}
195+
196+
@ParameterizedTest(name = "{1}")
197+
@MethodSource("bytesPerElement")
198+
void oversizeThrowsOnIntegerMaxValue(int bytesPerElement, String label) {
199+
assertThatIllegalArgumentException().isThrownBy(
200+
() -> ArrayUtil.oversize(Integer.MAX_VALUE, bytesPerElement)
201+
)
202+
.withMessageContaining("requested array size")
203+
.withMessageContaining("exceeds maximum array in java ");
204+
}
205+
206+
private static Stream<Arguments> bytesPerElement() {
207+
return Stream.of(
208+
Arguments.of(Byte.BYTES, "Byte.BYTES"),
209+
Arguments.of(Integer.BYTES, "Integer.BYTES")
210+
);
211+
}
193212
}

core/src/main/java/org/neo4j/gds/core/loading/ChunkedAdjacencyLists.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,8 +198,7 @@ private byte[] ensureCompressedTargetsCapacity(long index, int pos, int required
198198
)
199199
);
200200
} else if (compressedTargets.length <= targetLength) {
201-
int newLength = BitUtil.nextHighestPowerOfTwo(targetLength);
202-
// int newLength = ArrayUtil.oversize(pos + required, Byte.BYTES);
201+
int newLength = getNewLength(targetLength);
203202
compressedTargets = Arrays.copyOf(compressedTargets, newLength);
204203
this.targetLists.set(index, compressedTargets);
205204
}

core/src/test/java/org/neo4j/gds/core/loading/ChunkedAdjacencyListsTest.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@
2020
package org.neo4j.gds.core.loading;
2121

2222
import org.junit.jupiter.api.Test;
23+
import org.junit.jupiter.params.ParameterizedTest;
24+
import org.junit.jupiter.params.provider.ValueSource;
2325
import org.neo4j.gds.core.compression.common.AdjacencyCompression;
2426
import org.neo4j.gds.core.compression.common.ZigZagLongDecoding;
2527

2628
import static org.assertj.core.api.Assertions.assertThat;
29+
import static org.assertj.core.api.Assertions.assertThatNoException;
2730
import static org.assertj.core.api.Assertions.fail;
2831
import static org.neo4j.gds.core.compression.common.ZigZagLongDecoding.Identity.INSTANCE;
2932
import static org.neo4j.gds.core.loading.AdjacencyPreAggregation.IGNORE_VALUE;
@@ -232,4 +235,19 @@ void addWithPreAggregatedWeights() {
232235
assertThat(actualProperties[0]).containsSequence(3L, 3L, 4L);
233236
});
234237
}
238+
239+
@ParameterizedTest
240+
@ValueSource(ints = {
241+
110_000_000_0,
242+
210_000_000_9,
243+
214_000_000_5
244+
})
245+
void shouldComputeNewLength(int minLength) {
246+
assertThatNoException().isThrownBy(
247+
() ->
248+
assertThat(ChunkedAdjacencyLists.getNewLength(minLength))
249+
.isPositive()
250+
.isLessThan(Integer.MAX_VALUE)
251+
);
252+
}
235253
}

0 commit comments

Comments
 (0)