in saga-core/src/main/java/org/apache/servicecomb/saga/core/dag/ByLevelTraveller.java [52:75]
public void next() {
nodes.addAll(nodesBuffer);
nodesBuffer.clear();
boolean buffered = false;
while (!nodesWithoutParent.isEmpty() && !buffered) {
Node<T> node = nodesWithoutParent.poll();
nodes.add(node);
for (Node<T> child : traversalDirection.children(node)) {
// This is not thread safe
if (nodeParents.get(child.id()) == null) {
nodeParents.put(child.id(), new HashSet<>(traversalDirection.parents(child)));
}
nodeParents.get(child.id()).remove(node);
if (nodeParents.get(child.id()).isEmpty()) {
nodesWithoutParent.offer(child);
nodesBuffer.add(child);
buffered = true;
}
}
}
}