public RecoverReply apply()

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);
    }