in accord-core/src/main/java/accord/messages/BeginRecovery.java [110:175]
public RecoverReply apply(SafeCommandStore safeStore)
{
StoreParticipants participants = StoreParticipants.update(safeStore, route, minEpoch, txnId, executeAtOrTxnIdEpoch);
SafeCommand safeCommand = safeStore.get(txnId, participants);
Commands.AcceptOutcome outcome = Commands.recover(safeStore, safeCommand, participants, txnId, partialTxn, ballot);
switch (outcome)
{
default: throw UnhandledEnum.unknown(outcome);
case Redundant: throw UnhandledEnum.invalid(outcome);
case Truncated: return new RecoverNack(Truncated, null);
case Retired: return new RecoverNack(Retired, null);
case RejectedBallot: return new RecoverNack(Reject, safeCommand.current().promised());
case Success:
}
Command command = safeCommand.current();
LatestDeps deps; {
PartialDeps coordinatedDeps = command.partialDeps();
Deps localDeps = null;
if (!command.known().deps().hasCommittedOrDecidedDeps())
{
localDeps = DepsCalculator.calculateDeps(safeStore, txnId, participants, minEpoch, txnId, false);
}
if (localDeps != null && coordinatedDeps != null && !participants.touches().equals(coordinatedDeps.covering))
{
deps = LatestDeps.create(coordinatedDeps.covering, command.known().deps(), command.acceptedOrCommitted(), coordinatedDeps, null);
deps = LatestDeps.merge(deps, LatestDeps.create(participants.touches(), DepsUnknown, Ballot.ZERO, null, localDeps));
}
else
{
Participants<?> knownFor = coordinatedDeps == null ? participants.touches() : coordinatedDeps.covering;
deps = LatestDeps.create(knownFor, command.known().deps(), command.acceptedOrCommitted(), coordinatedDeps, localDeps);
}
}
boolean supersedingRejects;
Deps earlierNoWait, earlierWait;
Deps laterCoordRejects;
if (command.hasBeen(AcceptedMedium))
{
supersedingRejects = false;
earlierNoWait = earlierWait = Deps.NONE;
laterCoordRejects = Deps.NONE;
}
else
{
try (Visitor visitor = new Visitor())
{
safeStore.visit(participants.owns(), txnId, txnId.witnessedBy(), ANY, txnId, EITHER, visitor);
supersedingRejects = visitor.supersedingRejects;
earlierNoWait = visitor.earlierNoWait == null ? Deps.NONE : visitor.earlierNoWait.build();
earlierWait = visitor.earlierWait == null ? Deps.NONE : visitor.earlierWait.build();
laterCoordRejects = visitor.laterCoordRejects == null ? Deps.NONE : visitor.laterCoordRejects.build();
}
}
SaveStatus saveStatus = command.saveStatus();
Ballot accepted = command.acceptedOrCommitted();
Timestamp executeAt = command.executeAt();
Writes writes = command.writes();
Result result = command.result();
Participants<?> coordinatorAcceptsFastPath = saveStatus.known.hasPrivilegedVote() ? participants.owns() : null;
boolean acceptsFastPath = acceptsFastPath(txnId, participants, saveStatus, executeAt);
return new RecoverOk(txnId, saveStatus.status, accepted, executeAt, deps, earlierWait, earlierNoWait, laterCoordRejects, acceptsFastPath, coordinatorAcceptsFastPath, supersedingRejects, writes, result);
}