9 releases

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

#251 in Algorithms

Download history 131/week @ 2024-10-30 947/week @ 2024-11-06 1060/week @ 2024-11-13 1915/week @ 2024-11-20 885/week @ 2024-11-27 811/week @ 2024-12-04 814/week @ 2024-12-11 1091/week @ 2024-12-18 839/week @ 2024-12-25 1148/week @ 2025-01-01 920/week @ 2025-01-08 580/week @ 2025-01-15 325/week @ 2025-01-22 154/week @ 2025-01-29 730/week @ 2025-02-05 562/week @ 2025-02-12

1,878 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