in accord-core/src/main/java/accord/local/Commands.java [553:611]
private static boolean maybeExecute(SafeCommandStore safeStore, SafeCommand safeCommand, ProgressShard shard, boolean alwaysNotifyListeners, boolean notifyWaitingOn)
{
Command command = safeCommand.current();
if (logger.isTraceEnabled())
logger.trace("{}: Maybe executing with status {}. Will notify listeners on noop: {}", command.txnId(), command.status(), alwaysNotifyListeners);
if (command.status() != Committed && command.status() != PreApplied)
{
if (alwaysNotifyListeners)
safeStore.notifyListeners(safeCommand);
return false;
}
if (command.asCommitted().isWaitingOnDependency())
{
if (alwaysNotifyListeners)
safeStore.notifyListeners(safeCommand);
if (notifyWaitingOn)
new NotifyWaitingOn(safeCommand).accept(safeStore);
return false;
}
// FIXME: need to communicate to caller that we didn't execute if we take one of the above paths
switch (command.status())
{
case Committed:
// TODO (desirable, efficiency): maintain distinct ReadyToRead and ReadyToWrite states
command = safeCommand.readyToExecute();
logger.trace("{}: set to ReadyToExecute", command.txnId());
safeStore.progressLog().readyToExecute(command, shard);
safeStore.notifyListeners(safeCommand);
return true;
case PreApplied:
Ranges executeRanges = executeRanges(safeStore, command.executeAt());
Command.Executed executed = command.asExecuted();
boolean intersects = executed.writes().keys.intersects(executeRanges);
if (intersects)
{
logger.trace("{}: applying", command.txnId());
apply(safeStore, executed);
return true;
}
else
{
// TODO (desirable, performance): This could be performed immediately upon Committed
// but: if we later support transitive dependency elision this could be dangerous
logger.trace("{}: applying no-op", command.txnId());
safeCommand.applied();
safeStore.notifyListeners(safeCommand);
return true;
}
default:
throw new IllegalStateException();
}
}