influxdb/write_buffer/tests/delete-up-to.rs

101 lines
3.2 KiB
Rust
Raw Normal View History

use write_buffer::{WriteBufferBuilder, 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 = WriteBufferBuilder::new(dir.as_ref()).file_rollover_size(100);
let mut write_buffer = builder.clone().write_buffer()?;
create_and_sync_batch!(
write_buffer,
[
feat: Initial prototype of WriteBuffer and WAL (#271) This is the initial prototype of the WriteBuffer and WAL. This does the following: * accepts a slice of ParsedLine into the DB * writes those into an in memory structure with tags represented as u32 dictionaries and all field types supported * persists those writes into the WAL as Flatbuffer blobs (one WAL entry per slice of lines written, or WriteBatch) * has a method to return a table from the buffer as an Arrow RecordBatch * recovers the WAL after the database is closed and opened back up again * has a single test that covers the end-to-end from the DB side * It doesn't include partitioning yet. Although the write_lines method does actually try to do partitions on time. That'll get changed to be something more general defined by a per database configuration. * hooked up to the v2 HTTP write API * hooked up to a read API which will execute a SQL query against the data in the buffer This includes a refactor of the WAL: Refactors the WAL to remove async and threading so that it can be moved higher up. This simplifies the API while keeping just about the same amount of code in ParitionStore to handle the asynchronous writes. This also modifies the WAL to remove the SideFile implementation, which was causing significant performance problems and write amplification. The downside is that WAL writes are no longer guarranteed atomic. Further, this modifies the WAL to keep the active segement file handle open. Appends now don't have to list the directory contents and look for the latest file and open the file handle to do appends, which should also improve performance and reduce iops.
2020-09-08 18:12:16 +00:00
"some data within the file limit",
"some more data that puts the file over the limit"
]
);
// Write one Write Buffer entry, and because the existing file is over the size
// limit, this entry should end up in a new Write Buffer file
create_and_sync_batch!(
write_buffer,
["some more data, this should now be rolled over into the next Write Buffer file"]
);
// Write two Write Buffer 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!(
write_buffer,
[
feat: Initial prototype of WriteBuffer and WAL (#271) This is the initial prototype of the WriteBuffer and WAL. This does the following: * accepts a slice of ParsedLine into the DB * writes those into an in memory structure with tags represented as u32 dictionaries and all field types supported * persists those writes into the WAL as Flatbuffer blobs (one WAL entry per slice of lines written, or WriteBatch) * has a method to return a table from the buffer as an Arrow RecordBatch * recovers the WAL after the database is closed and opened back up again * has a single test that covers the end-to-end from the DB side * It doesn't include partitioning yet. Although the write_lines method does actually try to do partitions on time. That'll get changed to be something more general defined by a per database configuration. * hooked up to the v2 HTTP write API * hooked up to a read API which will execute a SQL query against the data in the buffer This includes a refactor of the WAL: Refactors the WAL to remove async and threading so that it can be moved higher up. This simplifies the API while keeping just about the same amount of code in ParitionStore to handle the asynchronous writes. This also modifies the WAL to remove the SideFile implementation, which was causing significant performance problems and write amplification. The downside is that WAL writes are no longer guarranteed atomic. Further, this modifies the WAL to keep the active segement file handle open. Appends now don't have to list the directory contents and look for the latest file and open the file handle to do appends, which should also improve performance and reduce iops.
2020-09-08 18:12:16 +00:00
"one entry that puts the existing file over the limit",
"another entry"
]
);
// There should be two existing Write Buffer files
assert_filenames_for_sequence_numbers!(dir, [0, 2]);
// Should be able to read the entries back out
let write_buffer_entries = all_entries(&builder)?;
assert_eq!(5, write_buffer_entries.len());
assert_entry!(
write_buffer_entries[0],
0,
b"some data within the file limit"
);
assert_entry!(
write_buffer_entries[1],
1,
b"some more data that puts the file over the limit"
);
assert_entry!(
write_buffer_entries[2],
2,
b"some more data, this should now be rolled over into the next Write Buffer file"
);
assert_entry!(
write_buffer_entries[3],
3,
b"one entry that puts the existing file over the limit"
);
assert_entry!(write_buffer_entries[4], 4, b"another entry");
// Not including 3!
write_buffer.delete_up_to_entry(3)?;
// There should be one existing Write Buffer file
assert_filenames_for_sequence_numbers!(dir, [2]);
// Add another entry; the sequence numbers continue
create_and_sync_batch!(write_buffer, ["entry after deletion"]);
// Should be able to read the entries back out
let write_buffer_entries = all_entries(&builder)?;
assert_eq!(4, write_buffer_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!(
write_buffer_entries[0],
2,
b"some more data, this should now be rolled over into the next Write Buffer file"
);
assert_entry!(
write_buffer_entries[1],
3,
b"one entry that puts the existing file over the limit"
);
assert_entry!(write_buffer_entries[2], 4, b"another entry");
assert_entry!(write_buffer_entries[3], 5, b"entry after deletion");
Ok(())
}