9 releases

0.2.7 Feb 21, 2025
0.2.6 Dec 12, 2024
0.2.5 Nov 20, 2024
0.1.0 Oct 31, 2024

#1 in #vote

Download history 1458/week @ 2024-11-17 1360/week @ 2024-11-24 746/week @ 2024-12-01 950/week @ 2024-12-08 980/week @ 2024-12-15 889/week @ 2024-12-22 725/week @ 2024-12-29 1289/week @ 2025-01-05 699/week @ 2025-01-12 483/week @ 2025-01-19 182/week @ 2025-01-26 645/week @ 2025-02-02 535/week @ 2025-02-09 627/week @ 2025-02-16 559/week @ 2025-02-23 460/week @ 2025-03-02

2,269 downloads per month

MIT/Apache

175KB
4K SLoC

raft-log

Log Storage for raft

A high-performance, reliable local disk-based log storage implementation for the raft consensus protocol.

Features

  • Type-safe API with generic types for log entries, vote information, and user data
  • Asynchronous write operations with callback support
  • Efficient batch processing and disk I/O
  • Core raft operations support:
    • Vote persistence for election safety
    • Log entry append for replication
    • Commit index management
    • Log entry reads for state machine application

Example

See basic usage example for a complete demonstration of core functionality, including:

  • Creating and opening a raft log store
  • Saving vote information during elections
  • Appending log entries (as a leader or follower)
  • Updating commit index
  • Reading committed entries
  • Getting current log state
  • Using asynchronous flush with callbacks

Basic usage:

use raft_log::{RaftLog, Config};

// Define your application-specific types
impl Types for MyTypes {
    type LogId = (u64, u64);        // (term, index)
    type LogPayload = String;        // Log entry data
    type Vote = (u64, u64);         // (term, voted_for)
    type UserData = String;         // Custom user data
    type Callback = SyncSender<io::Result<()>>;
}

// Open a RaftLog instance
let config = Arc::new(Config::default());
let mut raft_log = RaftLog::<MyTypes>::open(config)?;

// Save vote information
raft_log.save_vote((1, 2))?;  // Voted for node-2 in term 1

// Append log entries
let entries = vec![
    ((1, 1), "first entry".to_string()),
    ((1, 2), "second entry".to_string()),
];
raft_log.append(entries)?;

// Update commit index
raft_log.commit((1, 2))?;

// Flush changes to disk with callback
let (tx, rx) = sync_channel(1);
raft_log.flush(tx)?;
rx.recv().unwrap()?;

For more examples and detailed documentation, see the examples directory.

License

This project is licensed under the Apache License, Version 2.0.

Dependencies

~1.7–2.7MB
~48K SLoC