97 lines
2.9 KiB
Rust
97 lines
2.9 KiB
Rust
use wal::{WalBuilder, WritePayload};
|
|
|
|
#[macro_use]
|
|
mod helpers;
|
|
use crate::helpers::*;
|
|
|
|
#[test]
|
|
#[allow(clippy::cognitive_complexity)]
|
|
fn delete_up_to() -> Result {
|
|
let dir = test_helpers::tmp_dir()?;
|
|
|
|
// Set the file rollover size limit low to test interaction with file rollover
|
|
let builder = WalBuilder::new(dir.as_ref()).file_rollover_size(100);
|
|
let mut wal = builder.clone().wal()?;
|
|
|
|
create_and_sync_batch!(
|
|
wal,
|
|
[
|
|
"some data within the file limit",
|
|
"some more data that puts the file over the limit"
|
|
]
|
|
);
|
|
|
|
// Write one WAL entry, and because the existing file is over the size limit,
|
|
// this entry should end up in a new WAL file
|
|
create_and_sync_batch!(
|
|
wal,
|
|
["some more data, this should now be rolled over into the next WAL file"]
|
|
);
|
|
|
|
// Write two WAL entries, one that could fit in the existing file but puts the
|
|
// file over the limit. Because the two entries are in one sync batch, they
|
|
// both will end up in the existing file even though it's over the limit
|
|
// after the first entry.
|
|
create_and_sync_batch!(
|
|
wal,
|
|
[
|
|
"one entry that puts the existing file over the limit",
|
|
"another entry"
|
|
]
|
|
);
|
|
|
|
// There should be two existing WAL files
|
|
assert_filenames_for_sequence_numbers!(dir, [0, 2]);
|
|
|
|
// Should be able to read the entries back out
|
|
let wal_entries = all_entries(&builder)?;
|
|
assert_eq!(5, wal_entries.len());
|
|
assert_entry!(wal_entries[0], 0, b"some data within the file limit");
|
|
assert_entry!(
|
|
wal_entries[1],
|
|
1,
|
|
b"some more data that puts the file over the limit"
|
|
);
|
|
assert_entry!(
|
|
wal_entries[2],
|
|
2,
|
|
b"some more data, this should now be rolled over into the next WAL file"
|
|
);
|
|
assert_entry!(
|
|
wal_entries[3],
|
|
3,
|
|
b"one entry that puts the existing file over the limit"
|
|
);
|
|
assert_entry!(wal_entries[4], 4, b"another entry");
|
|
|
|
// Not including 3!
|
|
wal.delete_up_to_entry(3)?;
|
|
|
|
// There should be one existing WAL file
|
|
assert_filenames_for_sequence_numbers!(dir, [2]);
|
|
|
|
// Add another entry; the sequence numbers continue
|
|
create_and_sync_batch!(wal, ["entry after deletion"]);
|
|
|
|
// Should be able to read the entries back out
|
|
let wal_entries = all_entries(&builder)?;
|
|
assert_eq!(4, wal_entries.len());
|
|
|
|
// 2 is still readable, because we asked to delete it but couldn't because it
|
|
// was in a file with 3.
|
|
assert_entry!(
|
|
wal_entries[0],
|
|
2,
|
|
b"some more data, this should now be rolled over into the next WAL file"
|
|
);
|
|
assert_entry!(
|
|
wal_entries[1],
|
|
3,
|
|
b"one entry that puts the existing file over the limit"
|
|
);
|
|
assert_entry!(wal_entries[2], 4, b"another entry");
|
|
assert_entry!(wal_entries[3], 5, b"entry after deletion");
|
|
|
|
Ok(())
|
|
}
|