in accord-core/src/main/java/accord/local/Commands.java [761:799]
private static boolean updateWaitingOn(SafeCommand dependencySafeCommand, WaitingOn.Update waitingOn, SafeCommand safeDependency)
{
Command.Committed command = dependencySafeCommand.current().asCommitted();
Command dependency = safeDependency.current();
Invariants.checkState(dependency.hasBeen(PreCommitted));
if (dependency.hasBeen(Invalidated))
{
logger.trace("{}: {} is invalidated. Stop listening and removing from waiting on commit set.", command.txnId(), dependency.txnId());
safeDependency.removeListener(command.asListener());
waitingOn.removeWaitingOnCommit(dependency.txnId());
return true;
}
else if (dependency.executeAt().compareTo(command.executeAt()) > 0)
{
// dependency cannot be a predecessor if it executes later
logger.trace("{}: {} executes after us. Stop listening and removing from waiting on apply set.", command.txnId(), dependency.txnId());
waitingOn.removeWaitingOn(dependency.txnId(), dependency.executeAt());
safeDependency.removeListener(command.asListener());
return true;
}
else if (dependency.hasBeen(Applied))
{
logger.trace("{}: {} has been applied. Stop listening and removing from waiting on apply set.", command.txnId(), dependency.txnId());
waitingOn.removeWaitingOn(dependency.txnId(), dependency.executeAt());
safeDependency.removeListener(command.asListener());
return true;
}
else if (command.isWaitingOnDependency())
{
logger.trace("{}: adding {} to waiting on apply set.", command.txnId(), dependency.txnId());
waitingOn.addWaitingOnApply(dependency.txnId(), dependency.executeAt());
waitingOn.removeWaitingOnCommit(dependency.txnId());
return false;
}
else
{
throw new IllegalStateException();
}
}