in accord-core/src/main/java/accord/local/Commands.java [398:441]
public static ApplyOutcome apply(SafeCommandStore safeStore, TxnId txnId, long untilEpoch, Route<?> route, Timestamp executeAt, @Nullable PartialDeps partialDeps, Writes writes, Result result)
{
SafeCommand safeCommand = safeStore.command(txnId);
Command command = safeCommand.current();
if (command.hasBeen(PreApplied) && executeAt.equals(command.executeAt()))
{
logger.trace("{}: skipping apply - already executed ({})", txnId, command.status());
return ApplyOutcome.Redundant;
}
else if (command.hasBeen(PreCommitted) && !executeAt.equals(command.executeAt()))
{
safeStore.agent().onInconsistentTimestamp(command, command.executeAt(), executeAt);
}
Ranges coordinateRanges = coordinateRanges(safeStore, txnId);
Ranges acceptRanges = acceptRanges(safeStore, txnId, executeAt, coordinateRanges);
Ranges executeRanges = executeRanges(safeStore, executeAt);
if (untilEpoch < safeStore.latestEpoch())
{
Ranges expectedRanges = safeStore.ranges().allBetween(executeAt.epoch(), untilEpoch);
Invariants.checkState(expectedRanges.containsAll(executeRanges));
}
CommonAttributes attrs = updateHomeAndProgressKeys(safeStore, command.txnId(), command, route, coordinateRanges);
ProgressShard shard = progressShard(attrs, coordinateRanges);
if (!validate(command.status(), attrs, acceptRanges, executeRanges, shard, route, Check, null, Check, partialDeps, command.hasBeen(Committed) ? Add : TrySet))
{
safeCommand.updateAttributes(attrs);
return ApplyOutcome.Insufficient; // TODO (expected, consider): this should probably be an assertion failure if !TrySet
}
WaitingOn waitingOn = !command.hasBeen(Committed) ? populateWaitingOn(safeStore, txnId, executeAt, partialDeps) : command.asCommitted().waitingOn();
attrs = set(safeStore, command, attrs, acceptRanges, executeRanges, shard, route, null, Check, partialDeps, command.hasBeen(Committed) ? Add : TrySet);
safeCommand.preapplied(attrs, executeAt, waitingOn, writes, result);
safeStore.notifyListeners(safeCommand);
logger.trace("{}: apply, status set to Executed with executeAt: {}, deps: {}", txnId, executeAt, partialDeps);
maybeExecute(safeStore, safeCommand, shard, true, true);
safeStore.progressLog().executed(safeCommand.current(), shard);
return ApplyOutcome.Success;
}