3个版本 (破坏性更新)
0.3.0 | 2020年10月25日 |
---|---|
0.2.0 | 2020年10月25日 |
0.1.0 | 2020年10月25日 |
#233 在 数据库实现
每月97次下载
在 5 个crate中使用了(直接使用4个)
20KB
382 行
simple_wal
一个简单的Rust预写日志crate。
功能
- 优化了顺序读取和写入
- 简单的原子日志压缩
- 建议锁定
- CRC32校验和
- 范围扫描
- 持久的日志条目索引
lib.rs
:
一个简单的预写日志crate。
功能
- 优化了顺序读取和写入
- 简单的原子日志压缩
- 建议锁定
- CRC32校验和
- 范围扫描
- 持久的日志条目索引
启动时整个日志将被扫描以检测并清理中断的写入,并确定日志的长度。建议当旧的条目不再可能被使用时压缩日志。
用法
use simple_wal::LogFile;
let path = std::path::Path::new("./wal-log");
{
let mut log = LogFile::open(path).unwrap();
// write to log
log.write(&mut b"log entry".to_vec()).unwrap();
log.write(&mut b"foobar".to_vec()).unwrap();
log.write(&mut b"123".to_vec()).unwrap();
// flush to disk
log.flush().unwrap();
}
{
let mut log = LogFile::open(path).unwrap();
// Iterate through the log
let mut iter = log.iter(..).unwrap();
assert_eq!(iter.next().unwrap().unwrap(), b"log entry".to_vec());
assert_eq!(iter.next().unwrap().unwrap(), b"foobar".to_vec());
assert_eq!(iter.next().unwrap().unwrap(), b"123".to_vec());
assert!(iter.next().is_none());
}
{
let mut log = LogFile::open(path).unwrap();
// Compact the log
log.compact(1).unwrap();
// Iterate through the log
let mut iter = log.iter(..).unwrap();
assert_eq!(iter.next().unwrap().unwrap(), b"foobar".to_vec());
assert_eq!(iter.next().unwrap().unwrap(), b"123".to_vec());
assert!(iter.next().is_none());
}
日志格式
00 01 02 03 04 05 06 07|08 09 10 11 12 13 14 15|.......|-4 -3 -2 -1|
-----------------------|-----------------------|-------|-----------|
starting index |entry length | entry | crc32 |
unsigned 64 bit int le |unsigned 64 bit int le | data | 32bit, le |
数字以小端格式存储。
WAL中的前8个字节是起始索引。
每个条目遵循以下格式
- 一个64位无符号整数表示条目大小。
- 条目数据
- 一个32位crc32校验和。
依赖项
~1–1.6MB
~31K SLoC