Raft::Log::File
On-disk log storage backend with crash recovery.
Stores log entries in an append-only binary file (log.bin), metadata in
metadata.bin, and snapshots in snapshot.bin. All multi-byte integers
use big-endian encoding. Metadata and snapshot files are written atomically
via tmp+rename.
Entry record format: [Index:8B][Term:8B][Type:1B][DataLen:4B][Data:NB]
By default every write is followed by an fsync(2) syscall so that entries
are durable against power loss or kernel panics. Pass fsync: false to skip
the syscall and rely on OS page-cache writeback instead — acceptable when an
external restore path exists (replicated block storage, periodic backups, or
a peer that always holds the full log).
log = Raft::Log::File.new("/var/lib/raft/node-1") # fsync on (default)
log = Raft::Log::File.new("/var/lib/raft/node-1", fsync: false) # page-cache only
Constructors
Instance methods
Appends a single entry to the log with conflict detection.
If an existing entry at the same index has a different term, all entries from that index onward are truncated before appending. An entry with matching index and term is skipped (idempotent).
Appends multiple entries to the log with conflict detection.
The default implementation delegates to the single-entry overload. Subclasses may override for batch optimizations (e.g., deferred fsync).
Yields each entry in the inclusive range [from, to] without
allocating an intermediate array. Preferred over slice on hot paths.
Returns the entry at the given 1-based index, or nil if not present.
Loads the most recent snapshot, or returns nil if none exists.
Returns a tuple of {last_included_index, last_included_term, snapshot_data}.
Saves a snapshot and compacts the log up to last_index.
All entries with index <= last_index are removed from the log.
Returns entries in the inclusive range [from, to].
Returns the term of the entry at index, or nil if not present.