feat(blob): add embedded KV storage engine for email archiving

This commit is contained in:
rustmailer
2026-06-23 21:38:31 +08:00
parent 6fcc9e0e8e
commit 04745458bc
30 changed files with 4976 additions and 38 deletions
+3 -3
View File
@@ -1,4 +1,4 @@
use memdb::{DbError, MemDb, Page};
use bichon_memdb::{DbError, MemDb, Page};
use serde::{Deserialize, Serialize};
use tempfile::TempDir;
@@ -458,7 +458,7 @@ fn test_wal_seq_skips_already_snapshotted_entries() {
// Verify WAL only contains seq=3.
let wal_path = dir.path().join("wal.jsonl");
let entries = memdb::wal::read_after(&wal_path, 2).unwrap();
let entries = bichon_memdb::wal::read_after(&wal_path, 2).unwrap();
assert_eq!(entries.len(), 1);
assert_eq!(entries[0].seq, 3);
@@ -696,7 +696,7 @@ async fn test_concurrent_writes_wal_seq_monotonic() {
// Verify WAL seq is strictly monotonic.
let wal_path = dir.path().join("wal.jsonl");
let entries = memdb::wal::read_after(&wal_path, 0).unwrap();
let entries = bichon_memdb::wal::read_after(&wal_path, 0).unwrap();
assert_eq!(entries.len(), 50);
let mut last = 0u64;
for e in &entries {
+4 -4
View File
@@ -1,4 +1,4 @@
use memdb::{Durability, MemDb, Page};
use bichon_memdb::{Durability, MemDb, Page};
use serde::{Deserialize, Serialize};
use std::sync::Arc;
use std::time::{Duration, Instant};
@@ -548,7 +548,7 @@ fn stress_wal_seq_monotonic_under_load() {
}
let wal_path = dir.path().join("wal.jsonl");
let entries = memdb::wal::read_after(&wal_path, 0).unwrap();
let entries = bichon_memdb::wal::read_after(&wal_path, 0).unwrap();
assert_eq!(entries.len(), n);
let mut last = 0u64;
for e in &entries {
@@ -842,7 +842,7 @@ async fn wal_concurrent_persistent_writes() {
// Verify strict seq ordering in WAL under concurrent load.
let wal_path = db_path.join("wal.jsonl");
let entries = memdb::wal::read_after(&wal_path, 0).unwrap();
let entries = bichon_memdb::wal::read_after(&wal_path, 0).unwrap();
assert_eq!(entries.len(), total as usize);
let mut last = 0u64;
for e in &entries {
@@ -1153,7 +1153,7 @@ fn wal_large_transaction_batch() {
// The entire transaction should be a single WAL entry.
let wal_path = dir.path().join("wal.jsonl");
let entries = memdb::wal::read_after(&wal_path, 0).unwrap();
let entries = bichon_memdb::wal::read_after(&wal_path, 0).unwrap();
assert_eq!(entries.len(), 1);
assert_eq!(entries[0].ops.len(), n as usize);