Class NopRaftStore

  • All Implemented Interfaces:
    RaftStore

    public class NopRaftStore
    extends Object
    implements RaftStore
    Used when a Raft node works transiently (its state is not persisted).
    • Constructor Detail

      • NopRaftStore

        public NopRaftStore()
    • Method Detail

      • persistAndFlushLocalEndpoint

        public void persistAndFlushLocalEndpoint​(RaftEndpoint localEndpoint,
                                                 boolean localEndpointVoting)
        Description copied from interface: RaftStore
        Persists and flushes the given local Raft endpoint and its voting flag.

        When this method returns, all the provided data has become durable.

        Specified by:
        persistAndFlushLocalEndpoint in interface RaftStore
        Parameters:
        localEndpoint - the Raft endpoint of the local Raft node to persist
        localEndpointVoting - the flag that denotes whether if the local Raft node is a voting or non-voting member
      • persistAndFlushInitialGroupMembers

        public void persistAndFlushInitialGroupMembers​(@Nonnull
                                                       RaftGroupMembersView initialGroupMembers)
        Description copied from interface: RaftStore
        Persists and flushes the given initial Raft group members.

        When this method returns, all the provided data has become durable.

        Specified by:
        persistAndFlushInitialGroupMembers in interface RaftStore
        Parameters:
        initialGroupMembers - the initial Raft group member list to persist
      • persistAndFlushTerm

        public void persistAndFlushTerm​(int term,
                                        @Nullable
                                        RaftEndpoint votedFor)
        Description copied from interface: RaftStore
        Persists the term and the Raft endpoint that the local Raft node voted for in the given term.

        When this method returns, all the provided data has become durable.

        Specified by:
        persistAndFlushTerm in interface RaftStore
        Parameters:
        term - the term value to persist
        votedFor - the voted Raft endpoint to persist
      • persistLogEntry

        public void persistLogEntry​(@Nonnull
                                    LogEntry logEntry)
        Description copied from interface: RaftStore
        Persists the given log entry.

        Log entries are appended to the Raft log with sequential log indices. The first log index is 1.

        A block of consecutive log entries has no gaps in the indices, but a gap can appear between a snapshot entry and its preceding regular log entry. This happens in an edge case where a follower has fallen so far behind that the missing entries are no longer available from the leader. In that case the leader will send its snapshot entry instead.

        In another rare failure scenario, Raft must delete a range of the highest entries, rolling back the index of the next persisted entry. Consider the following case where Raft persists 3 log entries and then deletes entries from index=2:

        • persistLogEntry(1)
        • persistLogEntry(2)
        • persistLogEntry(3)
        • truncateLogEntriesFrom(2)
        After this call sequence log indices will remain sequential and the next persistLogEntry() call will be for index=2.
        Specified by:
        persistLogEntry in interface RaftStore
        Parameters:
        logEntry - the log entry object to persist
        See Also:
        RaftStore.flush(), RaftStore.persistSnapshotChunk(SnapshotChunk), RaftStore.truncateLogEntriesFrom(long), RaftConfig
      • persistSnapshotChunk

        public void persistSnapshotChunk​(@Nonnull
                                         SnapshotChunk snapshotChunk)
        Description copied from interface: RaftStore
        Persists the given snapshot chunk.

        A snapshot is persisted with at least 1 chunk. The number of chunks in a snapshot is provided via SnapshotChunk.getSnapshotChunkCount(). A snapshot is considered to be complete when all of its chunks are provided to this method in any order, and RaftStore.flush() could be called afterwards.

        After a snapshot is persisted at index=i and RaftStore.flush() is called, the log entry at index=i, all the preceding log entries, and all the preceding snapshots are no longer needed and can be evicted from storage. Failing to evict stale entries and snapshots do not cause a consistency problem, but can increase the time to recover after a crash or restart. Therefore eviction can be done in a background task.

        MicroRaft takes snapshots at a predetermined interval, controlled by RaftConfig.getCommitCountToTakeSnapshot(). For instance, if it is 100, snapshots will occur at indices 100, 200, 300, and so on.

        The snapshot index can lag behind the index of the highest log entry that was already persisted and flushed, but there is an upper bound to this difference, controlled by RaftConfig.getMaxPendingLogEntryCount(). For instance, if it is 10, and a persistSnapshot() call is made with snapshotIndex=100, the index of the preceding persistLogEntry() call can be at most 110.

        On the other hand, the snapshot index can also be ahead of the highest log entry. This can happen when a Raft follower has fallen so far behind the leader and the leader no longer holds the missing entries. In that case, the follower receives a snapshot from the leader. There is no upper-bound on the gap between the highest log entry and the index of the received snapshot.

        Specified by:
        persistSnapshotChunk in interface RaftStore
        Parameters:
        snapshotChunk - the snapshot chunk object to persist
        See Also:
        RaftStore.flush(), RaftStore.persistLogEntry(LogEntry), RaftConfig
      • truncateLogEntriesFrom

        public void truncateLogEntriesFrom​(long logIndexInclusive)
        Description copied from interface: RaftStore
        Rolls back the log by truncating all entries starting with the given index. A truncated log entry is no longer valid and must not be restored (or at least must be ignored during the restore process).

        There is an upper-bound on the number of persisted log entries that can be truncated afterwards, which is specified by RaftConfig.getMaxPendingLogEntryCount() + 1. Say that it is 5 and the highest persisted log entry index is 20. Then, at most 5 highest entries can be truncated, hence truncation can start at index=16 or higher.

        Specified by:
        truncateLogEntriesFrom in interface RaftStore
        Parameters:
        logIndexInclusive - the log index value from which the log entries must be truncated
        See Also:
        RaftStore.flush(), RaftStore.persistLogEntry(LogEntry), RaftConfig
      • truncateSnapshotChunksUntil

        public void truncateSnapshotChunksUntil​(long logIndexInclusive)
        Description copied from interface: RaftStore
        Rolls back the persisted snapshot chunks only when all of the expected snapshot chunks are not already persisted. A truncated snapshot chunk is no longer valid and must not be restored (or at least must be ignored during the restore process).
        Specified by:
        truncateSnapshotChunksUntil in interface RaftStore
        Parameters:
        logIndexInclusive - the log index value until which the log entries must be truncated
        See Also:
        RaftStore.persistSnapshotChunk(SnapshotChunk)