diff --git a/Cargo.lock b/Cargo.lock index 91a0c83b34..50dd6fe2f3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -587,6 +587,22 @@ dependencies = [ "tokio", ] +[[package]] +name = "cache_system" +version = "0.1.0" +dependencies = [ + "async-trait", + "criterion", + "futures", + "iox_time", + "observability_deps", + "parking_lot 0.12.0", + "proptest", + "rand", + "tokio", + "workspace-hack", +] + [[package]] name = "cast" version = "0.2.7" @@ -4097,8 +4113,8 @@ dependencies = [ "assert_matches", "async-trait", "backoff 0.1.0", + "cache_system", "client_util", - "criterion", "data_types", "datafusion 0.1.0", "datafusion_util", @@ -4116,7 +4132,6 @@ dependencies = [ "parquet_file", "pin-project", "predicate", - "proptest", "query", "rand", "schema", diff --git a/Cargo.toml b/Cargo.toml index 4ad64c12e0..be999bcba4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ members = [ "arrow_util", "backoff", + "cache_system", "clap_blocks", "client_util", "compactor", diff --git a/cache_system/Cargo.toml b/cache_system/Cargo.toml new file mode 100644 index 0000000000..1264c139bf --- /dev/null +++ b/cache_system/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "cache_system" +version = "0.1.0" +edition = "2021" + +[dependencies] +async-trait = "0.1.53" +futures = "0.3" +iox_time = { path = "../iox_time" } +observability_deps = { path = "../observability_deps" } +parking_lot = "0.12" +tokio = { version = "1.18", features = ["macros", "parking_lot", "rt-multi-thread", "sync", "time"] } +workspace-hack = { path = "../workspace-hack"} + +[dev-dependencies] +criterion = "0.3" +proptest = { version = "1", default_features = false, features = ["std"] } +rand = "0.8.3" + +[[bench]] +name = "addressable_heap" +harness = false diff --git a/querier/benches/addressable_heap.rs b/cache_system/benches/addressable_heap.rs similarity index 99% rename from querier/benches/addressable_heap.rs rename to cache_system/benches/addressable_heap.rs index 5656eb1aa3..0100647675 100644 --- a/querier/benches/addressable_heap.rs +++ b/cache_system/benches/addressable_heap.rs @@ -1,10 +1,10 @@ use std::mem::size_of; +use cache_system::backend::addressable_heap::AddressableHeap; use criterion::{ criterion_group, criterion_main, measurement::WallTime, AxisScale, BatchSize, BenchmarkGroup, BenchmarkId, Criterion, PlotConfiguration, SamplingMode, }; -use querier::AddressableHeap; use rand::{prelude::SliceRandom, thread_rng, Rng}; /// Payload (`V`) for testing. diff --git a/querier/src/cache_system/backend/addressable_heap.rs b/cache_system/src/backend/addressable_heap.rs similarity index 99% rename from querier/src/cache_system/backend/addressable_heap.rs rename to cache_system/src/backend/addressable_heap.rs index e8afd72dc8..36acc4eb56 100644 --- a/querier/src/cache_system/backend/addressable_heap.rs +++ b/cache_system/src/backend/addressable_heap.rs @@ -1,3 +1,4 @@ +//! Implementation of an [`AddressableHeap`]. use std::{ collections::{HashMap, VecDeque}, hash::Hash, diff --git a/querier/src/cache_system/backend/dual.rs b/cache_system/src/backend/dual.rs similarity index 98% rename from querier/src/cache_system/backend/dual.rs rename to cache_system/src/backend/dual.rs index 02ef66db8b..d112903166 100644 --- a/querier/src/cache_system/backend/dual.rs +++ b/cache_system/src/backend/dual.rs @@ -1,3 +1,4 @@ +//! Cross-populated two caches. use std::{any::Any, fmt::Debug, hash::Hash, sync::Arc}; use parking_lot::Mutex; @@ -310,7 +311,7 @@ mod tests { #[test] fn test_generic1() { - use crate::cache_system::backend::test_util::test_generic; + use crate::backend::test_util::test_generic; test_generic(|| { let backend1 = Box::new(HashMap::::new()); @@ -328,7 +329,7 @@ mod tests { #[test] fn test_generic2() { - use crate::cache_system::backend::test_util::test_generic; + use crate::backend::test_util::test_generic; test_generic(|| { let backend1 = Box::new(HashMap::::new()); diff --git a/querier/src/cache_system/backend/hash_map.rs b/cache_system/src/backend/hash_map.rs similarity index 89% rename from querier/src/cache_system/backend/hash_map.rs rename to cache_system/src/backend/hash_map.rs index 0ccf0e6c69..cb3c3028da 100644 --- a/querier/src/cache_system/backend/hash_map.rs +++ b/cache_system/src/backend/hash_map.rs @@ -1,3 +1,4 @@ +//! Implements [`CacheBackend`] for [`HashMap`]. use std::{ any::Any, collections::HashMap, @@ -43,7 +44,7 @@ mod tests { #[test] fn test_generic() { - use crate::cache_system::backend::test_util::test_generic; + use crate::backend::test_util::test_generic; test_generic(HashMap::new); } diff --git a/querier/src/cache_system/backend/lru.rs b/cache_system/src/backend/lru.rs similarity index 99% rename from querier/src/cache_system/backend/lru.rs rename to cache_system/src/backend/lru.rs index 7db5032d4b..b89c31cfd4 100644 --- a/querier/src/cache_system/backend/lru.rs +++ b/cache_system/src/backend/lru.rs @@ -9,7 +9,7 @@ //! sync::Arc, //! }; //! use iox_time::SystemProvider; -//! use querier::{ +//! use cache_system::backend::{ //! CacheBackend, //! lru::{LruBackend, ResourcePool}, //! resource_consumption::{Resource, ResourceEstimator}, @@ -1114,7 +1114,7 @@ mod tests { #[test] fn test_generic() { - use crate::cache_system::backend::test_util::test_generic; + use crate::backend::test_util::test_generic; #[derive(Debug)] struct ZeroSizeProvider {} diff --git a/querier/src/cache_system/backend/mod.rs b/cache_system/src/backend/mod.rs similarity index 95% rename from querier/src/cache_system/backend/mod.rs rename to cache_system/src/backend/mod.rs index adfa459db6..b19a6ab77a 100644 --- a/querier/src/cache_system/backend/mod.rs +++ b/cache_system/src/backend/mod.rs @@ -1,3 +1,4 @@ +//! Storage backends to keep and manage cached entries. use std::{any::Any, fmt::Debug, hash::Hash}; pub mod addressable_heap; diff --git a/querier/src/cache_system/backend/resource_consumption.rs b/cache_system/src/backend/resource_consumption.rs similarity index 100% rename from querier/src/cache_system/backend/resource_consumption.rs rename to cache_system/src/backend/resource_consumption.rs diff --git a/querier/src/cache_system/backend/test_util.rs b/cache_system/src/backend/test_util.rs similarity index 100% rename from querier/src/cache_system/backend/test_util.rs rename to cache_system/src/backend/test_util.rs diff --git a/querier/src/cache_system/backend/ttl.rs b/cache_system/src/backend/ttl.rs similarity index 99% rename from querier/src/cache_system/backend/ttl.rs rename to cache_system/src/backend/ttl.rs index 73ef28356d..f0ea22f65c 100644 --- a/querier/src/cache_system/backend/ttl.rs +++ b/cache_system/src/backend/ttl.rs @@ -1,3 +1,4 @@ +//! Time-to-live handling. use std::{any::Any, fmt::Debug, hash::Hash, marker::PhantomData, sync::Arc, time::Duration}; use iox_time::{Time, TimeProvider}; @@ -552,7 +553,7 @@ mod tests { #[test] fn test_generic() { - use crate::cache_system::backend::test_util::test_generic; + use crate::backend::test_util::test_generic; test_generic(|| { let ttl_provider = Arc::new(NeverTtlProvider::default()); diff --git a/querier/src/cache_system/driver.rs b/cache_system/src/driver.rs similarity index 99% rename from querier/src/cache_system/driver.rs rename to cache_system/src/driver.rs index d6d960f340..2ee34880d5 100644 --- a/querier/src/cache_system/driver.rs +++ b/cache_system/src/driver.rs @@ -1,3 +1,4 @@ +//! Main data structure, see [`Cache`]. use std::{collections::HashMap, hash::Hash, sync::Arc}; use futures::{ diff --git a/cache_system/src/lib.rs b/cache_system/src/lib.rs new file mode 100644 index 0000000000..ee0e69f152 --- /dev/null +++ b/cache_system/src/lib.rs @@ -0,0 +1,14 @@ +//! Flexible and modular cache system. +#![deny(rustdoc::broken_intra_doc_links, rust_2018_idioms)] +#![warn( + missing_copy_implementations, + missing_docs, + clippy::explicit_iter_loop, + clippy::future_not_send, + clippy::use_self, + clippy::clone_on_ref_ptr +)] + +pub mod backend; +pub mod driver; +pub mod loader; diff --git a/querier/src/cache_system/loader.rs b/cache_system/src/loader.rs similarity index 92% rename from querier/src/cache_system/loader.rs rename to cache_system/src/loader.rs index 46305ee6cf..0ef184aeab 100644 --- a/querier/src/cache_system/loader.rs +++ b/cache_system/src/loader.rs @@ -1,8 +1,9 @@ +//! How to load new cache entries. use async_trait::async_trait; use futures::{future::BoxFuture, FutureExt}; use std::future::Future; -/// Loader for missing [`Cache`](crate::cache_system::driver::Cache) entries. +/// Loader for missing [`Cache`](crate::driver::Cache) entries. #[async_trait] pub trait Loader: std::fmt::Debug + Send + Sync + 'static { /// Cache key. diff --git a/querier/Cargo.toml b/querier/Cargo.toml index a7e90e8bb0..ba380a4f92 100644 --- a/querier/Cargo.toml +++ b/querier/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" arrow = "13" async-trait = "0.1.53" backoff = { path = "../backoff" } +cache_system = { path = "../cache_system" } client_util = { path = "../client_util" } data_types = { path = "../data_types" } datafusion = { path = "../datafusion" } @@ -40,12 +41,6 @@ workspace-hack = { path = "../workspace-hack"} [dev-dependencies] arrow_util = { path = "../arrow_util" } assert_matches = "1.5" -criterion = "0.3" iox_tests = { path = "../iox_tests" } mutable_batch_lp = { path = "../mutable_batch_lp" } -proptest = { version = "1", default_features = false, features = ["std"] } test_helpers = { path = "../test_helpers" } - -[[bench]] -name = "addressable_heap" -harness = false diff --git a/querier/src/cache/namespace.rs b/querier/src/cache/namespace.rs index 689bd15005..95cce0ae46 100644 --- a/querier/src/cache/namespace.rs +++ b/querier/src/cache/namespace.rs @@ -1,6 +1,7 @@ //! Namespace cache. -use crate::cache_system::{ +use backoff::{Backoff, BackoffConfig}; +use cache_system::{ backend::{ dual::dual_backends, ttl::{OptionalValueTtlProvider, TtlBackend}, @@ -8,7 +9,6 @@ use crate::cache_system::{ driver::Cache, loader::FunctionLoader, }; -use backoff::{Backoff, BackoffConfig}; use data_types::{NamespaceId, NamespaceSchema}; use iox_catalog::interface::{get_schema_by_name, Catalog}; use iox_time::TimeProvider; diff --git a/querier/src/cache/partition.rs b/querier/src/cache/partition.rs index 0fe10d5306..e81e7b5373 100644 --- a/querier/src/cache/partition.rs +++ b/querier/src/cache/partition.rs @@ -1,7 +1,7 @@ //! Partition cache. -use crate::cache_system::{driver::Cache, loader::FunctionLoader}; use backoff::{Backoff, BackoffConfig}; +use cache_system::{driver::Cache, loader::FunctionLoader}; use data_types::{PartitionId, SequencerId}; use iox_catalog::interface::Catalog; use schema::sort::SortKey; diff --git a/querier/src/cache/processed_tombstones.rs b/querier/src/cache/processed_tombstones.rs index be4d15ba17..8440bbf21e 100644 --- a/querier/src/cache/processed_tombstones.rs +++ b/querier/src/cache/processed_tombstones.rs @@ -1,11 +1,11 @@ //! Processed tombstone cache. -use crate::cache_system::{ +use backoff::{Backoff, BackoffConfig}; +use cache_system::{ backend::ttl::{TtlBackend, TtlProvider}, driver::Cache, loader::FunctionLoader, }; -use backoff::{Backoff, BackoffConfig}; use data_types::{ParquetFileId, TombstoneId}; use iox_catalog::interface::Catalog; use iox_time::TimeProvider; diff --git a/querier/src/cache/table.rs b/querier/src/cache/table.rs index df8d3d5c4c..73ab1e47ad 100644 --- a/querier/src/cache/table.rs +++ b/querier/src/cache/table.rs @@ -1,6 +1,7 @@ //! Table cache. -use crate::cache_system::{ +use backoff::{Backoff, BackoffConfig}; +use cache_system::{ backend::{ dual::dual_backends, ttl::{OptionalValueTtlProvider, TtlBackend}, @@ -8,7 +9,6 @@ use crate::cache_system::{ driver::Cache, loader::FunctionLoader, }; -use backoff::{Backoff, BackoffConfig}; use data_types::{NamespaceId, Table, TableId}; use iox_catalog::interface::Catalog; use iox_time::TimeProvider; diff --git a/querier/src/cache_system/mod.rs b/querier/src/cache_system/mod.rs deleted file mode 100644 index fe368cd303..0000000000 --- a/querier/src/cache_system/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod backend; -pub mod driver; -pub mod loader; diff --git a/querier/src/lib.rs b/querier/src/lib.rs index c8b0568756..8abb6390d4 100644 --- a/querier/src/lib.rs +++ b/querier/src/lib.rs @@ -10,7 +10,6 @@ )] pub mod cache; -mod cache_system; pub mod chunk; mod database; mod handler; @@ -36,11 +35,3 @@ pub use ingester::{ }; pub use namespace::QuerierNamespace; pub use server::QuerierServer; - -// for benchmarks -pub use cache_system::backend::addressable_heap::AddressableHeap; - -// for doctests -pub use cache_system::backend::lru; -pub use cache_system::backend::resource_consumption; -pub use cache_system::backend::CacheBackend;