Skip to content

Commit 98364f1

Browse files
committed
Add some defensive checks when elements are removed
1 parent 805f588 commit 98364f1

File tree

1 file changed

+53
-20
lines changed

1 file changed

+53
-20
lines changed

src/main/java/org/gephi/graph/impl/GraphViewImpl.java

Lines changed: 53 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -570,6 +570,11 @@ public void not() {
570570
// views)
571571
for (int edgeId = edgeBitVector.nextSetBit(0); edgeId >= 0; edgeId = edgeBitVector.nextSetBit(edgeId + 1)) {
572572
EdgeImpl edge = getEdge(edgeId);
573+
if (edge == null) {
574+
// SAFETY: Edge no longer exists in store
575+
edgesToRemove.set(edgeId);
576+
continue;
577+
}
573578
// Check if both endpoints are in the node view
574579
if (!nodeBitVector.get(edge.source.storeId) || !nodeBitVector.get(edge.target.storeId)) {
575580
edgesToRemove.set(edgeId);
@@ -625,6 +630,10 @@ private void bulkRemoveNodes(BitSet nodesToRemove) {
625630
BitSet edgesToRemove = new BitSet();
626631
for (int nodeId = nodesToRemove.nextSetBit(0); nodeId >= 0; nodeId = nodesToRemove.nextSetBit(nodeId + 1)) {
627632
NodeImpl node = getNode(nodeId);
633+
if (node == null) {
634+
continue; // SAFETY: Node was removed from store (storeId reused or deleted)
635+
}
636+
628637
EdgeInOutIterator itr = graphStore.edgeStore.edgeIterator(node, false);
629638
while (itr.hasNext()) {
630639
EdgeImpl edge = itr.next();
@@ -653,11 +662,13 @@ private void bulkRemoveNodes(BitSet nodesToRemove) {
653662
if (indexStore != null || timeIndexStore != null) {
654663
for (int i = nodesToRemove.nextSetBit(0); i >= 0; i = nodesToRemove.nextSetBit(i + 1)) {
655664
NodeImpl node = getNode(i);
656-
if (indexStore != null) {
657-
indexStore.clearInView(node, this);
658-
}
659-
if (timeIndexStore != null) {
660-
timeIndexStore.clearInView(node, this);
665+
if (node != null) { // SAFETY: Skip if node no longer exists
666+
if (indexStore != null) {
667+
indexStore.clearInView(node, this);
668+
}
669+
if (timeIndexStore != null) {
670+
timeIndexStore.clearInView(node, this);
671+
}
661672
}
662673
}
663674
}
@@ -681,11 +692,13 @@ private void bulkAddNodes(BitSet nodesToAdd) {
681692
if (indexStore != null || timeIndexStore != null) {
682693
for (int i = nodesToAdd.nextSetBit(0); i >= 0; i = nodesToAdd.nextSetBit(i + 1)) {
683694
NodeImpl node = getNode(i);
684-
if (indexStore != null) {
685-
indexStore.indexInView(node, this);
686-
}
687-
if (timeIndexStore != null) {
688-
timeIndexStore.indexInView(node, this);
695+
if (node != null) { // SAFETY: Skip if node no longer exists
696+
if (indexStore != null) {
697+
indexStore.indexInView(node, this);
698+
}
699+
if (timeIndexStore != null) {
700+
timeIndexStore.indexInView(node, this);
701+
}
689702
}
690703
}
691704
}
@@ -696,6 +709,10 @@ private void bulkAddNodes(BitSet nodesToAdd) {
696709
BitSet edgesToAdd = new BitSet();
697710
for (int nodeId = nodesToAdd.nextSetBit(0); nodeId >= 0; nodeId = nodesToAdd.nextSetBit(nodeId + 1)) {
698711
NodeImpl node = getNode(nodeId);
712+
if (node == null) {
713+
continue; // SAFETY: Skip if node no longer exists
714+
}
715+
699716
EdgeInOutIterator itr = graphStore.edgeStore.edgeIterator(node, false);
700717
while (itr.hasNext()) {
701718
EdgeImpl edge = itr.next();
@@ -726,6 +743,10 @@ private void bulkRemoveEdges(BitSet edgesToRemove) {
726743
// Update type counts and mutual edge counts
727744
for (int i = edgesToRemove.nextSetBit(0); i >= 0; i = edgesToRemove.nextSetBit(i + 1)) {
728745
EdgeImpl edge = getEdge(i);
746+
if (edge == null) {
747+
continue; // SAFETY: Edge was removed from store (storeId reused or deleted)
748+
}
749+
729750
int type = edge.type;
730751
ensureTypeCountArrayCapacity(type);
731752
typeCounts[type]--;
@@ -748,11 +769,13 @@ private void bulkRemoveEdges(BitSet edgesToRemove) {
748769
if (indexStore != null || timeIndexStore != null) {
749770
for (int i = edgesToRemove.nextSetBit(0); i >= 0; i = edgesToRemove.nextSetBit(i + 1)) {
750771
EdgeImpl edge = getEdge(i);
751-
if (indexStore != null) {
752-
indexStore.clearInView(edge, this);
753-
}
754-
if (timeIndexStore != null) {
755-
timeIndexStore.clearInView(edge, this);
772+
if (edge != null) { // SAFETY: Skip if edge no longer exists
773+
if (indexStore != null) {
774+
indexStore.clearInView(edge, this);
775+
}
776+
if (timeIndexStore != null) {
777+
timeIndexStore.clearInView(edge, this);
778+
}
756779
}
757780
}
758781
}
@@ -771,6 +794,10 @@ private void bulkAddEdges(BitSet edgesToAdd) {
771794
// Update type counts and mutual edge counts
772795
for (int i = edgesToAdd.nextSetBit(0); i >= 0; i = edgesToAdd.nextSetBit(i + 1)) {
773796
EdgeImpl edge = getEdge(i);
797+
if (edge == null) {
798+
continue; // SAFETY: Skip if edge no longer exists in store
799+
}
800+
774801
int type = edge.type;
775802
ensureTypeCountArrayCapacity(type);
776803
typeCounts[type]++;
@@ -793,11 +820,13 @@ private void bulkAddEdges(BitSet edgesToAdd) {
793820
if (indexStore != null || timeIndexStore != null) {
794821
for (int i = edgesToAdd.nextSetBit(0); i >= 0; i = edgesToAdd.nextSetBit(i + 1)) {
795822
EdgeImpl edge = getEdge(i);
796-
if (indexStore != null) {
797-
indexStore.indexInView(edge, this);
798-
}
799-
if (timeIndexStore != null) {
800-
timeIndexStore.indexInView(edge, this);
823+
if (edge != null) { // SAFETY: Skip if edge no longer exists
824+
if (indexStore != null) {
825+
indexStore.indexInView(edge, this);
826+
}
827+
if (timeIndexStore != null) {
828+
timeIndexStore.indexInView(edge, this);
829+
}
801830
}
802831
}
803832
}
@@ -817,6 +846,10 @@ private void bulkRemoveEdgesForNot(BitSet edgesToRemove) {
817846
// Update type counts and mutual edge counts
818847
for (int i = edgesToRemove.nextSetBit(0); i >= 0; i = edgesToRemove.nextSetBit(i + 1)) {
819848
EdgeImpl edge = getEdge(i);
849+
if (edge == null) {
850+
continue; // SAFETY: Skip if edge no longer exists in store
851+
}
852+
820853
int type = edge.type;
821854
ensureTypeCountArrayCapacity(type);
822855
typeCounts[type]--;

0 commit comments

Comments
 (0)