Search in sources :

Example 1 with AppendFailureResponse

use of com.hazelcast.cp.internal.raft.impl.dto.AppendFailureResponse in project hazelcast by hazelcast.

the class InstallSnapshotHandlerTask method innerRun.

@Override
protected void innerRun() {
    if (logger.isFineEnabled()) {
        logger.fine("Received " + req);
    }
    RaftState state = raftNode.state();
    SnapshotEntry snapshot = req.snapshot();
    // Reply false if term < currentTerm (§5.1)
    if (req.term() < state.term()) {
        if (logger.isFineEnabled()) {
            logger.warning("Stale snapshot: " + req + " received in current term: " + state.term());
        }
        raftNode.send(new AppendFailureResponse(localMember(), state.term(), snapshot.index() + 1), req.leader());
        return;
    }
    // Transform into follower if a newer term is seen or another node wins the election of the current term
    if (req.term() > state.term() || state.role() != FOLLOWER) {
        // If RPC request or response contains term T > currentTerm: set currentTerm = T, convert to follower (§5.1)
        logger.info("Demoting to FOLLOWER from current role: " + state.role() + ", term: " + state.term() + " to new term: " + req.term() + " and leader: " + req.leader());
        raftNode.toFollower(req.term());
    }
    if (!req.leader().equals(state.leader())) {
        logger.info("Setting leader: " + req.leader());
        raftNode.leader(req.leader());
    }
    raftNode.updateLastAppendEntriesTimestamp();
    if (raftNode.installSnapshot(snapshot)) {
        raftNode.send(new AppendSuccessResponse(localMember(), req.term(), snapshot.index(), req.queryRound()), req.leader());
    }
}
Also used : AppendSuccessResponse(com.hazelcast.cp.internal.raft.impl.dto.AppendSuccessResponse) RaftState(com.hazelcast.cp.internal.raft.impl.state.RaftState) SnapshotEntry(com.hazelcast.cp.internal.raft.impl.log.SnapshotEntry) AppendFailureResponse(com.hazelcast.cp.internal.raft.impl.dto.AppendFailureResponse)

Aggregations

AppendFailureResponse (com.hazelcast.cp.internal.raft.impl.dto.AppendFailureResponse)1 AppendSuccessResponse (com.hazelcast.cp.internal.raft.impl.dto.AppendSuccessResponse)1 SnapshotEntry (com.hazelcast.cp.internal.raft.impl.log.SnapshotEntry)1 RaftState (com.hazelcast.cp.internal.raft.impl.state.RaftState)1