3个版本 (破坏性更新)

0.3.0 2020年10月25日
0.2.0 2020年10月25日
0.1.0 2020年10月25日

#233数据库实现

Download history 70/week @ 2024-04-06 50/week @ 2024-04-13 48/week @ 2024-04-20 33/week @ 2024-04-27 30/week @ 2024-05-04 36/week @ 2024-05-11 35/week @ 2024-05-18 40/week @ 2024-05-25 54/week @ 2024-06-01 31/week @ 2024-06-08 54/week @ 2024-06-15 37/week @ 2024-06-22 20/week @ 2024-06-29 18/week @ 2024-07-06 30/week @ 2024-07-13 21/week @ 2024-07-20

每月97次下载
5 个crate中使用了(直接使用4个)

MIT 许可证

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个字节是起始索引。

每个条目遵循以下格式

  1. 一个64位无符号整数表示条目大小。
  2. 条目数据
  3. 一个32位crc32校验和。

依赖项

~1–1.6MB
~31K SLoC