mindb 0.1.2

Lightweight embedded key–value store with write-ahead log and zstd compression.
Documentation
use std::error::Error;
use std::time::{Duration, Instant};

use mindb::observe::OperationObserver;
use mindb::storage::CompressionCodec;
use mindb::write::flush::FlushCoordinator;
use mindb::write::wal::{Wal, WalOptions};
use mindb::write::{GroupCommitConfig, GroupCommitController, Mutation, Transaction};

#[test]
fn sequential_puts_are_not_delayed() -> Result<(), Box<dyn Error>> {
    let tempdir = tempfile::tempdir()?;
    let wal_path = tempdir.path().join("wal.log");
    let wal = Wal::open(WalOptions {
        path: wal_path,
        direct_io: false,
    })?;

    let flush_dir = tempdir.path().join("segments");
    let flush = FlushCoordinator::new(&flush_dir, CompressionCodec::None);

    let min_interval = Duration::from_millis(100);
    let controller = GroupCommitController::new(
        wal,
        flush,
        GroupCommitConfig {
            max_batch_ops: 1024,
            min_interval,
            max_interval: Duration::from_millis(200),
            fsync_on_commit: true,
        },
        OperationObserver::new(),
    );

    let first = Transaction::new(vec![Mutation::Put {
        key: b"first".to_vec(),
        value: b"alpha".to_vec(),
    }]);
    let second = Transaction::new(vec![Mutation::Put {
        key: b"second".to_vec(),
        value: b"beta".to_vec(),
    }]);

    let start = Instant::now();
    controller.submit(first)?;
    controller.submit(second)?;
    let elapsed = start.elapsed();

    assert!(
        elapsed < min_interval,
        "sequential puts should complete faster than min_interval: {:?}",
        elapsed
    );

    drop(controller);

    Ok(())
}