Skip to content

Commit ce10c4f

Browse files
authored
Implement LogDb count api (opendata-oss#449)
Implements the count API for LogDb. I've removed the approximate count option, which seems kind of useless. Although there are opportunities for higher-level caching, this first pass just relis on the block cache. Each count query is divided into one portion which uses slatedb BlockStats on the written SSTs, and one portion which scans keys in memtables and does a direct count using a range scan.
1 parent 2791aac commit ce10c4f

16 files changed

Lines changed: 1291 additions & 196 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ mixtrics.workspace = true
2929
tokio.workspace = true
3030
tokio-util.workspace = true
3131
tracing.workspace = true
32+
ulid.workspace = true
3233
uuid.workspace = true
3334
serde.workspace = true
3435
arc-swap = { version = "1", optional = true }

common/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub use storage::factory::{
1818
create_object_store, create_storage_read,
1919
};
2020
pub use storage::loader::{LoadMetadata, LoadResult, LoadSpec, Loadable, Loader};
21+
pub use storage::sst_blocks::{BlockOpCounts, CountResult, count_in_range};
2122
pub use storage::{
2223
CheckpointInfo, MergeRecordOp, PutRecordOp, Record, Storage, StorageError, StorageIterator,
2324
StorageRead, StorageResult, Ttl, WriteOptions, WriteResult,

common/src/storage/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ pub mod in_memory;
44
pub mod loader;
55
pub mod metrics_recorder;
66
pub mod slate;
7+
pub mod sst_blocks;
78
pub mod util;
89

910
use std::sync::Arc;

common/src/storage/slate.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,10 @@ mod tests {
495495
storage.flush().await.unwrap();
496496

497497
// Create reader and verify data
498-
let reader = DbReader::builder(path, object_store).build().await.unwrap();
498+
let reader = DbReader::builder(path, object_store.clone())
499+
.build()
500+
.await
501+
.unwrap();
499502
let storage_reader = SlateDbStorageReader::new(Arc::new(reader));
500503

501504
let record = storage_reader.get(Bytes::from("key1")).await.unwrap();
@@ -535,7 +538,10 @@ mod tests {
535538
storage.flush().await.unwrap();
536539

537540
// Create reader and scan data
538-
let reader = DbReader::builder(path, object_store).build().await.unwrap();
541+
let reader = DbReader::builder(path, object_store.clone())
542+
.build()
543+
.await
544+
.unwrap();
539545
let storage_reader = SlateDbStorageReader::new(Arc::new(reader));
540546

541547
let mut iter = storage_reader
@@ -577,7 +583,10 @@ mod tests {
577583
storage.flush().await.unwrap();
578584

579585
// Create reader while writer is still open - this should NOT cause fencing error
580-
let reader = DbReader::builder(path, object_store).build().await.unwrap();
586+
let reader = DbReader::builder(path, object_store.clone())
587+
.build()
588+
.await
589+
.unwrap();
581590
let storage_reader = SlateDbStorageReader::new(Arc::new(reader));
582591

583592
// Reader can read the data
@@ -604,7 +613,7 @@ mod tests {
604613
let path = "/test/ttl_db";
605614
let clock = Arc::new(MockSystemClock::new());
606615

607-
let db = DbBuilder::new(path, object_store)
616+
let db = DbBuilder::new(path, object_store.clone())
608617
.with_settings(Settings {
609618
default_ttl: Some(30_000),
610619
..Default::default()
@@ -681,7 +690,7 @@ mod tests {
681690

682691
let merge_op: Arc<dyn MergeOperator> = Arc::new(ConcatMergeOperator);
683692
let slate_merge_op = SlateDbStorage::merge_operator_adapter(merge_op);
684-
let db = DbBuilder::new(path, object_store)
693+
let db = DbBuilder::new(path, object_store.clone())
685694
.with_settings(Settings {
686695
default_ttl: Some(30_000),
687696
..Default::default()

0 commit comments

Comments
 (0)