@@ -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