Github user dragonsinth commented on a diff in the pull request: https://github.com/apache/curator/pull/250#discussion_r167675994 --- Diff: curator-recipes/src/main/java/org/apache/curator/framework/recipes/cache/TreeCache.java --- @@ -436,41 +432,28 @@ else if ( event.getResultCode() == KeeperException.Code.NONODE.intValue() ) case GET_DATA: if ( event.getResultCode() == KeeperException.Code.OK.intValue() ) { - ChildData toPublish = new ChildData(event.getPath(), newStat, event.getData()); - ChildData oldChildData; - if ( cacheData ) - { - oldChildData = childDataUpdater.getAndSet(this, toPublish); - } - else - { - oldChildData = childDataUpdater.getAndSet(this, new ChildData(event.getPath(), newStat, null)); - } - - boolean added; - if (parent == null) { - // We're the singleton root. - added = nodeStateUpdater.getAndSet(this, NodeState.LIVE) != NodeState.LIVE; - } else { - added = nodeStateUpdater.compareAndSet(this, NodeState.PENDING, NodeState.LIVE); - if (!added) { - // Ordinary nodes are not allowed to transition from dead -> live; - // make sure this isn't a delayed response that came in after death. - if (nodeState != NodeState.LIVE) { - return; - } + String eventPath = event.getPath(); + ChildData toPublish = new ChildData(eventPath, newStat, event.getData()); + ChildData toUpdate = cacheData ? toPublish : new ChildData(eventPath, newStat, null); + while (true) { + final ChildData oldChildData = childData; + if ( (isLive(oldChildData) && newStat.getMzxid() <= oldChildData.getStat().getMzxid()) + // Ordinary nodes are not allowed to transition from dead -> live; + // make sure this isn't a delayed response that came in after death. + || (parent != null && oldChildData == DEAD) ) { + break; --- End diff -- Can we break up these cases for clarity? ``` final ChildData oldChildData = childData; // Ignore this event if we've already processed a newer update for this node. if ( (isLive(oldChildData) && newStat.getMzxid() <= oldChildData.getStat().getMzxid()) ) { break; } // Non-root nodes are not allowed to transition from dead -> live; // make sure this isn't a delayed response that came in after death. if ( parent != null && oldChildData == DEAD ) { break; } ```
---