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(())
}