From 246eec8b77daa8c5e0ba6669b9a38405e6c0d185 Mon Sep 17 00:00:00 2001 From: leventov Date: Wed, 23 Dec 2015 16:29:08 +0300 Subject: [PATCH] Fix a bug in SegmentStages.unlinkFromSegmentContextsChain() -- didn't account for exceptional exit from nested context --- .../chronicle/hash/impl/stage/entry/SegmentStages.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/SegmentStages.java b/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/SegmentStages.java index 68c99bf5b..e750ba20d 100644 --- a/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/SegmentStages.java +++ b/src/main/java/net/openhft/chronicle/hash/impl/stage/entry/SegmentStages.java @@ -350,7 +350,7 @@ public abstract class SegmentStages implements SegmentLock, LocksInterface { public void checkNestedContextsQueryDifferentKeys( LocksInterface innermostContextOnThisSegment) { - // TODO Spoon doesn't replace RHS instanceof occurances + // TODO Spoon doesn't replace RHS instanceof occurrences if (innermostContextOnThisSegment.getClass() == this.getClass()) { Data key = ((KeySearch) innermostContextOnThisSegment).inputKey; if (Objects.equals(key, ((KeySearch) (Object) this).inputKey)) { @@ -364,10 +364,12 @@ public abstract class SegmentStages implements SegmentLock, LocksInterface { private void unlinkFromSegmentContextsChain() { LocksInterface prevContext = rootContextLockedOnThisSegment; while (true) { - assert prevContext.nextNode() != null; - if (prevContext.nextNode() == this) + LocksInterface nextNode = prevContext.nextNode(); + // nextNode could be null, if this context failed initLocks() in + // checkNestedContextsQueryDifferentKeys() + if (nextNode == this || nextNode == null) break; - prevContext = prevContext.nextNode(); + prevContext = nextNode; } // i. e. structured unlocking verifyInnermostContext();