5 releases
0.1.7 | Feb 26, 2025 |
---|---|
0.1.6 | Oct 29, 2024 |
#500 in Database interfaces
152 downloads per month
Used in block-db
40KB
885 lines
walr
Ergonomic Write Ahead Log(WAL) using tokio
Requirements
Installation
cargo add walr
Usage
A WAL has three generics:
-
Log
: The type of the Log to write to disk -
State
: The state wanting to be persisted -
ReplayContext
: Optional context that can be provided toWAL::replay
to use inside thereplay_handler
Generally, you construct a WAL, call WAL::replay
to replay the State
from disk,
start applying logs via WAL::log
and WAL::log_many
; then when WAL::should_checkpoint
is true
, you checkpoint the in-memory State via WAL::checkpoint
. If your mutable action
on State
in not infallible, WAL::undo
will undo the last log or log many operation.
Example (Persisting a basic Cache)
Log
= CacheLog
State
= Cache
ReplayContext
= ()
type Cache = HashMap<String, String>;
#[derive(Serialize, Deserialize)]
enum CacheLog {
Remove(String),
Insert { key: String, value: String },
}
type ReplayContext = ();
Where the Log
type captures all enumerates of mutable actions on State
. Then, using these logs through replay
with a replay handler, you can replay the State
with the option to provide ReplayContext
to aid in the replay process.
fn replay_handler(
logs: Vec<CacheLog>,
checkpoint: Arc<Mutex<Cache>>,
context: Option<ReplayContext>,
) -> ReplayHandlerResult {
Box::pin(async move {
let mut checkpoint = checkpoint.lock().await;
for log in logs {
match log {
CacheLog::Insert { key, value } => checkpoint.insert(key, value),
CacheLog::Remove(key) => checkpoint.remove(&key),
};
}
Ok(())
})
}
See exmaple.rs
for the full example.
See Full crate documentation here at docs.rs for all available functionality.
Roadmap
- Optimizations
Contributing
Open to contributions, please just create a PR/issue or reach out to me to discuss what you would like to add/change.
License
MIT License
Copyright (c) 2024 Robert Lopez
See LICENSE.md
Dependencies
~2.7–8.5MB
~77K SLoC