From 352eda26c0a576deb50850191e2999ab95ceb004 Mon Sep 17 00:00:00 2001 From: Michael Marshall Date: Wed, 3 Dec 2025 11:26:21 -0600 Subject: [PATCH] Fix OnDiskGraphIndex#ramBytesUsed NPE --- .../jvector/graph/disk/OnDiskGraphIndex.java | 17 +++++++++++++---- .../graph/disk/TestOnDiskGraphIndex.java | 1 + 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/jvector-base/src/main/java/io/github/jbellis/jvector/graph/disk/OnDiskGraphIndex.java b/jvector-base/src/main/java/io/github/jbellis/jvector/graph/disk/OnDiskGraphIndex.java index da3c6c0ed..9ab122392 100644 --- a/jvector-base/src/main/java/io/github/jbellis/jvector/graph/disk/OnDiskGraphIndex.java +++ b/jvector-base/src/main/java/io/github/jbellis/jvector/graph/disk/OnDiskGraphIndex.java @@ -402,11 +402,20 @@ public long ramBytesUsed() { List> inMemoryNeighborsLocal = inMemoryNeighbors.get(); long inMemoryNeighborsBytes = RamUsageEstimator.NUM_BYTES_OBJECT_REF; - for (Int2ObjectHashMap neighbors : inMemoryNeighborsLocal) { - inMemoryNeighborsBytes += neighbors.values().stream().mapToLong(is -> Integer.BYTES * (long) is.length).sum(); - inMemoryNeighborsBytes += RamUsageEstimator.NUM_BYTES_OBJECT_REF; + if (inMemoryNeighborsLocal != null) { + for (Int2ObjectHashMap neighbors : inMemoryNeighborsLocal) { + if (neighbors != null) { + inMemoryNeighborsBytes += neighbors.values().stream().mapToLong(is -> Integer.BYTES * (long) is.length).sum(); + } + inMemoryNeighborsBytes += RamUsageEstimator.NUM_BYTES_OBJECT_REF; + } + } + + Int2ObjectHashMap inMemoryFeaturesLocal = inMemoryFeatures.get(); + long inMemoryFeaturesBytes = 0; + if (inMemoryFeaturesLocal != null) { + inMemoryFeaturesBytes = inMemoryFeaturesLocal.values().stream().mapToLong(is -> Integer.BYTES * is.ramBytesUsed()).sum(); } - long inMemoryFeaturesBytes = inMemoryFeatures.get().values().stream().mapToLong(is -> Integer.BYTES * is.ramBytesUsed()).sum(); inMemoryFeaturesBytes += RamUsageEstimator.NUM_BYTES_OBJECT_REF; return Long.BYTES + 6 * Integer.BYTES + RamUsageEstimator.NUM_BYTES_OBJECT_REF diff --git a/jvector-tests/src/test/java/io/github/jbellis/jvector/graph/disk/TestOnDiskGraphIndex.java b/jvector-tests/src/test/java/io/github/jbellis/jvector/graph/disk/TestOnDiskGraphIndex.java index 9b3e1c54a..29a8dca29 100644 --- a/jvector-tests/src/test/java/io/github/jbellis/jvector/graph/disk/TestOnDiskGraphIndex.java +++ b/jvector-tests/src/test/java/io/github/jbellis/jvector/graph/disk/TestOnDiskGraphIndex.java @@ -337,6 +337,7 @@ public void testV0Read() throws IOException { var onDiskGraph = OnDiskGraphIndex.load(readerSupplier); var onDiskView = onDiskGraph.getView()) { + assertEquals(88, onDiskGraph.ramBytesUsed()); // Current size of graph that hasn't been read from assertEquals(32, onDiskGraph.getDegree(0)); assertEquals(2, onDiskGraph.version); assertEquals(100_000, onDiskGraph.size(0));