class
Raft::Log::File
- Raft::Log::File
- Raft::Log
- Reference
- Object
Overview
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
Defined in:
raft/log/file.crConstructors
-
.new(data_dir : String, fsync : Bool = true)
Creates a new file-backed log in the given data_dir.
Instance Method Summary
-
#append(entries : Array(Entry)) : Nil
Appends entries to the log with conflict detection.
-
#close : Nil
Releases any resources held by the log (e.g., file handles).
-
#get(index : UInt64) : Entry | Nil
Returns the entry at the given 1-based index, or
nilif not present. -
#last_index : UInt64
Returns the index of the last entry, or
0if the log is empty. -
#last_term : UInt64
Returns the term of the last entry, or
0if the log is empty. -
#load_metadata : Metadata
Loads the persisted metadata, or returns defaults (term 0, no vote).
-
#load_snapshot : Tuple(UInt64, UInt64, Bytes) | Nil
Loads the most recent snapshot, or returns
nilif none exists. -
#save_metadata(meta : Metadata) : Nil
Persists the node's current term and voted-for state.
-
#save_snapshot(last_index : UInt64, last_term : UInt64, data : Bytes) : Nil
Saves a snapshot and compacts the log up to last_index.
-
#slice(from : UInt64, to : UInt64) : Array(Entry)
Returns entries in the inclusive range [from, to].
-
#term_at(index : UInt64) : UInt64 | Nil
Returns the term of the entry at index, or
nilif not present. -
#truncate_from(index : UInt64) : Nil
Removes all entries at index and beyond (inclusive).
Instance methods inherited from class Raft::Log
append(entries : Array(Entry)) : Nil
append,
close : Nil
close,
get(index : UInt64) : Entry | Nil
get,
last_index : UInt64
last_index,
last_term : UInt64
last_term,
load_metadata : Metadata
load_metadata,
load_snapshot : Tuple(UInt64, UInt64, Bytes) | Nil
load_snapshot,
save_metadata(meta : Metadata) : Nil
save_metadata,
save_snapshot(last_index : UInt64, last_term : UInt64, data : Bytes) : Nil
save_snapshot,
slice(from : UInt64, to : UInt64) : Array(Entry)
slice,
term_at(index : UInt64) : UInt64 | Nil
term_at,
truncate_from(index : UInt64) : Nil
truncate_from
Constructor Detail
Creates a new file-backed log in the given data_dir.
The directory is created if it doesn't exist. On startup, the log file is scanned to rebuild the in-memory offset index.
Instance Method Detail
Appends entries 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. Entries with matching index and term are skipped (idempotent).
Releases any resources held by the log (e.g., file handles).
Returns the entry at the given 1-based index, or nil if not present.
Returns the index of the last entry, or 0 if the log is empty.
Returns the term of the last entry, or 0 if the log is empty.
Loads the persisted metadata, or returns defaults (term 0, no vote).
Loads the most recent snapshot, or returns nil if none exists.
Returns a tuple of {last_included_index, last_included_term, snapshot_data}.
Persists the node's current term and voted-for state.
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.