pub struct ChunkStoreConfig {
pub enable_changelog: bool,
pub chunk_max_bytes: u64,
pub chunk_max_rows: u64,
pub chunk_max_rows_if_unsorted: u64,
}Expand description
Everything needed to build custom ChunkStoreSubscribers.
Fields§
§enable_changelog: boolIf true (the default), the store will emit events when its contents are modified in
any way (insertion, GC), that can be subscribed to.
Leaving this disabled can lead to major performance improvements on the ingestion path in some workloads, provided that the subscribers aren’t needed (e.g. headless mode).
chunk_max_bytes: u64What is the threshold, in bytes, after which a Chunk cannot be compacted any further?
This is a multi-dimensional trade-off:
- Larger chunks lead to less fixed overhead introduced by metadata, indices and such. Good.
- Larger chunks lead to slower query execution on some unhappy paths. Bad.
- Larger chunks lead to slower and slower compaction as chunks grow larger. Bad.
- Larger chunks lead to coarser garbage collection. Good or bad depending on use case.
- Larger chunks lead to less precision in e.g. the time panel. Bad.
Empirical testing shows that the space overhead gains rapidly diminish beyond ~1000 rows, which is the default row threshold. The default byte threshold is set to 8MiB, which is a reasonable unit of work when e.g. sending chunks over the network.
chunk_max_rows: u64What is the threshold, in rows, after which a Chunk cannot be compacted any further?
This specifically applies to time-sorted chunks.
See also ChunkStoreConfig::chunk_max_rows_if_unsorted.
This is a multi-dimensional trade-off:
- Larger chunks lead to less fixed overhead introduced by metadata, indices and such. Good.
- Larger chunks lead to slower query execution on some unhappy paths. Bad.
- Larger chunks lead to slower and slower compaction as chunks grow larger. Bad.
- Larger chunks lead to coarser garbage collection. Good or bad depending on use case.
- Larger chunks lead to less precision in e.g. the time panel. Bad.
Empirical testing shows that the space overhead gains rapidly diminish beyond ~1000 rows, which is the default row threshold. The default byte threshold is set to 8MiB, which is a reasonable unit of work when e.g. sending chunks over the network.
chunk_max_rows_if_unsorted: u64What is the threshold, in rows, after which a Chunk cannot be compacted any further?
This specifically applies to non time-sorted chunks.
See also ChunkStoreConfig::chunk_max_rows.
This is a multi-dimensional trade-off:
- Larger chunks lead to less fixed overhead introduced by metadata, indices and such. Good.
- Larger chunks lead to slower query execution on some unhappy paths. Bad.
- Larger chunks lead to slower and slower compaction as chunks grow larger. Bad.
- Larger chunks lead to coarser garbage collection. Good or bad depending on use case.
- Larger chunks lead to less precision in e.g. the time panel. Bad.
Empirical testing shows that the space overhead gains rapidly diminish beyond ~1000 rows, which is the default row threshold. The default byte threshold is set to 8MiB, which is a reasonable unit of work when e.g. sending chunks over the network.
Implementations§
Source§impl ChunkStoreConfig
impl ChunkStoreConfig
Sourcepub const DEFAULT: ChunkStoreConfig
pub const DEFAULT: ChunkStoreConfig
Default configuration, applicable to most use cases, according to empirical testing.
Sourcepub const COMPACTION_DISABLED: ChunkStoreConfig
pub const COMPACTION_DISABLED: ChunkStoreConfig
Self::DEFAULT, but with compaction entirely disabled.
Sourcepub const CHANGELOG_DISABLED: ChunkStoreConfig
pub const CHANGELOG_DISABLED: ChunkStoreConfig
Self::DEFAULT, but with changelog disabled.
Sourcepub const ALL_DISABLED: ChunkStoreConfig
pub const ALL_DISABLED: ChunkStoreConfig
All features disabled.
Sourcepub const ENV_STORE_ENABLE_CHANGELOG: &'static str = "RERUN_STORE_ENABLE_CHANGELOG"
pub const ENV_STORE_ENABLE_CHANGELOG: &'static str = "RERUN_STORE_ENABLE_CHANGELOG"
Environment variable to configure Self::enable_changelog.
Sourcepub const ENV_CHUNK_MAX_BYTES: &'static str = "RERUN_CHUNK_MAX_BYTES"
pub const ENV_CHUNK_MAX_BYTES: &'static str = "RERUN_CHUNK_MAX_BYTES"
Environment variable to configure Self::chunk_max_bytes.
Sourcepub const ENV_CHUNK_MAX_ROWS: &'static str = "RERUN_CHUNK_MAX_ROWS"
pub const ENV_CHUNK_MAX_ROWS: &'static str = "RERUN_CHUNK_MAX_ROWS"
Environment variable to configure Self::chunk_max_rows.
Sourcepub const ENV_CHUNK_MAX_ROWS_IF_UNSORTED: &'static str = "RERUN_CHUNK_MAX_ROWS_IF_UNSORTED"
pub const ENV_CHUNK_MAX_ROWS_IF_UNSORTED: &'static str = "RERUN_CHUNK_MAX_ROWS_IF_UNSORTED"
Environment variable to configure Self::chunk_max_rows_if_unsorted.
Sourcepub fn from_env() -> Result<ChunkStoreConfig, ChunkStoreError>
pub fn from_env() -> Result<ChunkStoreConfig, ChunkStoreError>
Creates a new ChunkStoreConfig using the default values, optionally overridden
through the environment.
See Self::apply_env.
Sourcepub fn apply_env(&self) -> Result<ChunkStoreConfig, ChunkStoreError>
pub fn apply_env(&self) -> Result<ChunkStoreConfig, ChunkStoreError>
Returns a copy of self, overriding existing fields with values from the environment if
they are present.
See Self::ENV_STORE_ENABLE_CHANGELOG, Self::ENV_CHUNK_MAX_BYTES, Self::ENV_CHUNK_MAX_ROWS
and Self::ENV_CHUNK_MAX_ROWS_IF_UNSORTED.
Trait Implementations§
Source§impl Clone for ChunkStoreConfig
impl Clone for ChunkStoreConfig
Source§fn clone(&self) -> ChunkStoreConfig
fn clone(&self) -> ChunkStoreConfig
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ChunkStoreConfig
impl Debug for ChunkStoreConfig
Source§impl Default for ChunkStoreConfig
impl Default for ChunkStoreConfig
Source§fn default() -> ChunkStoreConfig
fn default() -> ChunkStoreConfig
Source§impl PartialEq for ChunkStoreConfig
impl PartialEq for ChunkStoreConfig
Source§impl SizeBytes for ChunkStoreConfig
impl SizeBytes for ChunkStoreConfig
Source§fn heap_size_bytes(&self) -> u64
fn heap_size_bytes(&self) -> u64
self uses on the heap. Read moreSource§fn total_size_bytes(&self) -> u64
fn total_size_bytes(&self) -> u64
self in bytes, accounting for both stack and heap space.Source§fn stack_size_bytes(&self) -> u64
fn stack_size_bytes(&self) -> u64
self on the stack, in bytes. Read moreimpl Eq for ChunkStoreConfig
impl StructuralPartialEq for ChunkStoreConfig
Auto Trait Implementations§
impl Freeze for ChunkStoreConfig
impl RefUnwindSafe for ChunkStoreConfig
impl Send for ChunkStoreConfig
impl Sync for ChunkStoreConfig
impl Unpin for ChunkStoreConfig
impl UnsafeUnpin for ChunkStoreConfig
impl UnwindSafe for ChunkStoreConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
Source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
Source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
Source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can
then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be
further downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<T> FutureExt for T
impl<T> FutureExt for T
Source§fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
fn with_context(self, otel_cx: Context) -> WithContext<Self> ⓘ
Source§fn with_current_context(self) -> WithContext<Self> ⓘ
fn with_current_context(self) -> WithContext<Self> ⓘ
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§impl<Src, Dst> LosslessTryInto<Dst> for Srcwhere
Dst: LosslessTryFrom<Src>,
impl<Src, Dst> LosslessTryInto<Dst> for Srcwhere
Dst: LosslessTryFrom<Src>,
Source§fn lossless_try_into(self) -> Option<Dst>
fn lossless_try_into(self) -> Option<Dst>
Source§impl<Src, Dst> LossyInto<Dst> for Srcwhere
Dst: LossyFrom<Src>,
impl<Src, Dst> LossyInto<Dst> for Srcwhere
Dst: LossyFrom<Src>,
Source§fn lossy_into(self) -> Dst
fn lossy_into(self) -> Dst
Source§impl<T> OverflowingAs for T
impl<T> OverflowingAs for T
Source§fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
Source§impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
Source§fn overflowing_cast_from(src: Src) -> (Dst, bool)
fn overflowing_cast_from(src: Src) -> (Dst, bool)
Source§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
Source§impl<T> SaturatingAs for T
impl<T> SaturatingAs for T
Source§fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
Source§impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
Source§fn saturating_cast_from(src: Src) -> Dst
fn saturating_cast_from(src: Src) -> Dst
Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.