pub struct TimeseriesEngine { /* private fields */ }Expand description
Lite timeseries engine.
Not Send — owned by a single task. The NodeDbLite wrapper handles
async bridging.
Implementations§
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn compact_partitions(
&mut self,
collection: &str,
) -> Option<CompactionResult>
pub fn compact_partitions( &mut self, collection: &str, ) -> Option<CompactionResult>
Compact partitions in a collection by merging small adjacent partitions.
Triggers when:
- Partition count >
compaction_partition_threshold(default 20), OR - Total size < 50% of expected size after merge
Merges consecutive sealed partitions in time order. The merged partition contains all rows sorted by timestamp.
Sourcepub fn should_append_to_current_partition(&self, collection: &str) -> bool
pub fn should_append_to_current_partition(&self, collection: &str) -> bool
Check if a collection should use size-based partitioning.
When partition_size_target_bytes > 0, flush appends to the current
(last) partition if it hasn’t reached the target size. Otherwise,
creates a new partition.
Returns true if the current partition should continue receiving data
(i.e., don’t create a new partition on this flush).
Sourcepub fn run_maintenance(&mut self, collection: &str) -> MaintenanceResult
pub fn run_maintenance(&mut self, collection: &str) -> MaintenanceResult
Run all maintenance tasks for a collection: compaction + KV store compaction.
Call this during idle periods (no active queries, no active ingestion).
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn with_config(config: TieredPartitionConfig) -> Self
pub fn with_config(config: TieredPartitionConfig) -> Self
Create with custom config.
Sourcepub fn set_battery_state(&mut self, state: BatteryState)
pub fn set_battery_state(&mut self, state: BatteryState)
Update battery state (called by host application).
pub fn collection_names(&self) -> Vec<&str>
pub fn row_count(&self, collection: &str) -> usize
pub fn memory_bytes(&self, collection: &str) -> usize
pub fn partition_count(&self, collection: &str) -> usize
pub fn catalog(&self) -> &SeriesCatalog
pub fn config(&self) -> &TieredPartitionConfig
Sourcepub fn decode_timestamps(block: &[u8]) -> Vec<i64>
pub fn decode_timestamps(block: &[u8]) -> Vec<i64>
Decode a flushed timestamp block (Gorilla-encoded).
Sourcepub fn decode_values(block: &[u8]) -> Vec<f64>
pub fn decode_values(block: &[u8]) -> Vec<f64>
Decode a flushed value block (Gorilla-encoded).
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn flush(&mut self, collection: &str) -> Option<FlushResult>
pub fn flush(&mut self, collection: &str) -> Option<FlushResult>
Flush a collection’s memtable to Gorilla-compressed KV entries.
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn ingest_metric(
&mut self,
collection: &str,
metric_name: &str,
tags: Vec<(String, String)>,
sample: MetricSample,
) -> bool
pub fn ingest_metric( &mut self, collection: &str, metric_name: &str, tags: Vec<(String, String)>, sample: MetricSample, ) -> bool
Ingest a metric sample.
Returns true if the memtable needs flushing (memory pressure).
Features:
- Pre-sync downsampling: if
sync_resolution_ms > 0, accumulates samples per resolution window and emits one averaged sample per window. - WAL append: if
wal_enabled, appends raw sample to WAL for crash safety. - Battery-aware: if
battery_awareand battery is low, doubles the flush threshold to defer I/O. - Burst detection: if ingestion rate > 10x baseline for > 30s, enters bulk import mode with higher flush threshold.
Sourcepub fn ingest_batch(
&mut self,
collection: &str,
metric_name: &str,
tags: Vec<(String, String)>,
samples: &[MetricSample],
) -> bool
pub fn ingest_batch( &mut self, collection: &str, metric_name: &str, tags: Vec<(String, String)>, samples: &[MetricSample], ) -> bool
Ingest a batch of samples for one series.
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn enforce_storage_budget(
&mut self,
budget_bytes: u64,
policy: BudgetPolicy,
) -> BudgetCheckResult
pub fn enforce_storage_budget( &mut self, budget_bytes: u64, policy: BudgetPolicy, ) -> BudgetCheckResult
Check and enforce the storage budget.
Steps (in order, stop when within budget):
- Compact fragmented partitions (lossless)
- If still over: downsample oldest data (lossy)
- Last resort: surface
StorageBudgetExceededwarning
Never silently purges data in Pattern C.
Sourcepub fn total_storage_bytes(&self) -> u64
pub fn total_storage_bytes(&self) -> u64
Total storage bytes across all collections (partition metadata sizes).
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn plan_downsample(&self) -> Vec<DownsamplePlan>
pub fn plan_downsample(&self) -> Vec<DownsamplePlan>
Plan which partitions should be downsampled to save space.
Returns the oldest partitions sorted by min_ts. The caller reads
each partition’s data from the KV store, calls downsample_data(), and
writes the result back.
Sourcepub fn downsample_data(
timestamps: &[i64],
values: &[f64],
interval_ms: i64,
) -> (Vec<i64>, Vec<f64>)
pub fn downsample_data( timestamps: &[i64], values: &[f64], interval_ms: i64, ) -> (Vec<i64>, Vec<f64>)
Downsample raw timestamp+value data into coarser resolution.
The caller provides the decoded data from the KV store. This function
averages values within each interval_ms bucket and returns
the downsampled (timestamp, value) pairs.
This is a pure function — no side effects on the engine state.
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn effective_sync_resolution(&self) -> u64
pub fn effective_sync_resolution(&self) -> u64
Compute the effective sync resolution based on battery state and configured adaptive behavior.
Normal: use sync_resolution_ms from config (0 = raw).
Low battery: increase to 60_000 ms (1-minute averages).
Charging: use config default.
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn export_csv(
&self,
collection: &str,
output_path: &Path,
) -> Result<BackupResult, Error>
pub fn export_csv( &self, collection: &str, output_path: &Path, ) -> Result<BackupResult, Error>
Export a collection’s data as CSV (lightweight backup for Lite-C).
Writes timestamps and values from all flushed partitions and the current memtable to a CSV file. The caller provides the output path.
For full Parquet export, use the DataFusion integration layer.
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn verify_retention_codec_compat(&self) -> bool
pub fn verify_retention_codec_compat(&self) -> bool
Verify that retention works correctly with cascading codec metadata.
Checks that:
- Partitions with codec chain metadata (column_stats with cascade codecs) can be retained by sync status.
- Codec metadata survives the retain-then-purge lifecycle.
Returns true if all partitions have valid metadata.
Source§impl TimeseriesEngine
impl TimeseriesEngine
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn purge_before_ms(
&mut self,
collection: &str,
cutoff_ms: i64,
) -> Vec<String>
pub fn purge_before_ms( &mut self, collection: &str, cutoff_ms: i64, ) -> Vec<String>
Drop the partitions of collection whose max_ts < cutoff_ms.
Unlike apply_retention, this method takes an explicit cutoff rather than
reading it from config.retention_period_ms. Used by EnforceTimeseriesRetention,
which names one collection and its cutoff. Other collections are untouched.
Sourcepub fn apply_retention(&mut self, now_ms: i64) -> Vec<String>
pub fn apply_retention(&mut self, now_ms: i64) -> Vec<String>
Drop partitions older than the retention period.
Sourcepub fn apply_retention_with_sync(
&mut self,
now_ms: i64,
) -> (Vec<String>, Vec<UnsyncedDropWarning>)
pub fn apply_retention_with_sync( &mut self, now_ms: i64, ) -> (Vec<String>, Vec<UnsyncedDropWarning>)
Apply retention with sync-awareness.
Default behavior (retain_until_synced = false): drops by age.
Guarded behavior (retain_until_synced = true): keeps unsynced data.
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn sync_watermark(&self, series_id: SeriesId) -> u64
pub fn sync_watermark(&self, series_id: SeriesId) -> u64
Get the sync watermark for a series.
Sourcepub fn acknowledge_sync(&mut self, collection: &str, max_synced_ts: u64)
pub fn acknowledge_sync(&mut self, collection: &str, max_synced_ts: u64)
Update sync watermark after Origin acknowledges a push.
Sourcepub fn export_watermarks(&self) -> &HashMap<SeriesId, u64>
pub fn export_watermarks(&self) -> &HashMap<SeriesId, u64>
Get all current sync watermarks (for persistence).
Sourcepub fn import_watermarks(&mut self, watermarks: HashMap<SeriesId, u64>)
pub fn import_watermarks(&mut self, watermarks: HashMap<SeriesId, u64>)
Import watermarks from the KV store (cold start restore).
Sourcepub fn dirty_collections(&self) -> Vec<&str>
pub fn dirty_collections(&self) -> Vec<&str>
Get collections that have unsynced data.
Sourcepub fn assign_sync_lsn(&mut self) -> u64
pub fn assign_sync_lsn(&mut self) -> u64
Assign a sync LSN and advance the counter.
Sourcepub fn build_sync_payload(
&mut self,
collection: &str,
lite_id: &str,
) -> Option<TimeseriesPushMsg>
pub fn build_sync_payload( &mut self, collection: &str, lite_id: &str, ) -> Option<TimeseriesPushMsg>
Build a sync push payload for a collection.
Sourcepub fn sync_interval_ms(&self) -> u64
pub fn sync_interval_ms(&self) -> u64
Get the configured sync interval in milliseconds.
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn truncate_collection(&mut self, collection: &str) -> usize
pub fn truncate_collection(&mut self, collection: &str) -> usize
Remove every sample of collection: the memtable, every flushed
partition, the pending downsample windows, and the WAL entries that
have not reached the flush watermark. The series catalog is shared
across collections and stays as it is. Returns the number of rows
that existed across the memtable and partitions; a collection the
engine never saw reports zero.
Source§impl TimeseriesEngine
impl TimeseriesEngine
Sourcepub fn pending_wal_entries(&self, since_seq: u64) -> &[WalEntry]
pub fn pending_wal_entries(&self, since_seq: u64) -> &[WalEntry]
Get pending WAL entries (for persistence to the KV store by the caller).
Sourcepub fn advance_wal_watermark(&mut self, watermark: u64)
pub fn advance_wal_watermark(&mut self, watermark: u64)
Advance the WAL watermark after successful persistence.
Sourcepub fn compact_wal(&mut self)
pub fn compact_wal(&mut self)
Compact the WAL by removing entries below the flush watermark.
Sourcepub fn replay_wal(&mut self, entries: &[WalEntry])
pub fn replay_wal(&mut self, entries: &[WalEntry])
Replay WAL entries after a crash. Called on cold start.
Sourcepub fn wal_watermark(&self) -> u64
pub fn wal_watermark(&self) -> u64
Current WAL flush watermark.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for TimeseriesEngine
impl RefUnwindSafe for TimeseriesEngine
impl Send for TimeseriesEngine
impl Sync for TimeseriesEngine
impl Unpin for TimeseriesEngine
impl UnsafeUnpin for TimeseriesEngine
impl UnwindSafe for TimeseriesEngine
Blanket Implementations§
impl<T> Allocation for T
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
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
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
impl<T> ErasedDestructor for Twhere
T: 'static,
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> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.impl<T> NodeDbMarker for T
Source§impl<T> Paint for Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
Source§fn fg(&self, value: Color) -> Painted<&T>
fn fg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the foreground set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like red() and
green(), which have the same functionality but are
pithier.
§Example
Set foreground color to white using fg():
use yansi::{Paint, Color};
painted.fg(Color::White);Set foreground color to white using white().
use yansi::Paint;
painted.white();Source§fn bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
Source§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
Source§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
Source§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
Source§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
Source§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
Source§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
Source§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
Source§fn bg(&self, value: Color) -> Painted<&T>
fn bg(&self, value: Color) -> Painted<&T>
Returns a styled value derived from self with the background set to
value.
This method should be used rarely. Instead, prefer to use color-specific
builder methods like on_red() and
on_green(), which have the same functionality but
are pithier.
§Example
Set background color to red using fg():
use yansi::{Paint, Color};
painted.bg(Color::Red);Set background color to red using on_red().
use yansi::Paint;
painted.on_red();Source§fn on_primary(&self) -> Painted<&T>
fn on_primary(&self) -> Painted<&T>
Source§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
Source§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
Source§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
Source§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
Source§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
Source§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
Source§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
Source§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
Source§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
Source§fn attr(&self, value: Attribute) -> Painted<&T>
fn attr(&self, value: Attribute) -> Painted<&T>
Enables the styling Attribute value.
This method should be used rarely. Instead, prefer to use
attribute-specific builder methods like bold() and
underline(), which have the same functionality
but are pithier.
§Example
Make text bold using attr():
use yansi::{Paint, Attribute};
painted.attr(Attribute::Bold);Make text bold using using bold().
use yansi::Paint;
painted.bold();Source§fn rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
Source§fn quirk(&self, value: Quirk) -> Painted<&T>
fn quirk(&self, value: Quirk) -> Painted<&T>
Enables the yansi Quirk value.
This method should be used rarely. Instead, prefer to use quirk-specific
builder methods like mask() and
wrap(), which have the same functionality but are
pithier.
§Example
Enable wrapping using .quirk():
use yansi::{Paint, Quirk};
painted.quirk(Quirk::Wrap);Enable wrapping using wrap().
use yansi::Paint;
painted.wrap();Source§fn clear(&self) -> Painted<&T>
👎Deprecated since 1.0.1: renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
Source§fn whenever(&self, value: Condition) -> Painted<&T>
fn whenever(&self, value: Condition) -> Painted<&T>
Conditionally enable styling based on whether the Condition value
applies. Replaces any previous condition.
See the crate level docs for more details.
§Example
Enable styling painted only when both stdout and stderr are TTYs:
use yansi::{Paint, Condition};
painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);Source§impl<T> Pointable for T
impl<T> Pointable for T
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.