Skip to main content

HypertableRegistry

Struct HypertableRegistry 

Source
pub struct HypertableRegistry { /* private fields */ }
Expand description

In-memory catalog of hypertables and their chunks. Thread-safe because INSERTs can land from multiple writers simultaneously.

Implementations§

Source§

impl HypertableRegistry

Source

pub fn new() -> Self

Source

pub fn register(&self, spec: HypertableSpec)

Register a new hypertable. Replaces the previous spec if one existed with the same name; chunks for that name are kept — the operator is assumed to know what they’re doing when they redefine (e.g. widening chunk_interval_ns).

Source

pub fn get(&self, name: &str) -> Option<HypertableSpec>

Source

pub fn list(&self) -> Vec<HypertableSpec>

Source

pub fn unregister(&self, name: &str) -> Option<HypertableSpec>

Drop a hypertable from the registry. Returns the removed spec when present, or None for unknown names. Callers drop the backing collection separately — this is registry housekeeping only.

Source

pub fn route(&self, hypertable: &str, timestamp_ns: u64) -> Option<ChunkId>

Route a write: returns the ChunkId the row belongs in, allocating the chunk on first write. None when the hypertable is unknown.

Source

pub fn show_chunks(&self, hypertable: &str) -> Vec<ChunkMeta>

Return every chunk for hypertable, oldest-first.

Source

pub fn drop_chunks_before( &self, hypertable: &str, cutoff_ns: u64, ) -> Vec<ChunkMeta>

Drop every chunk of hypertable whose max_ts_ns is at or below cutoff_ns. Returns the count dropped — the physical storage release is the caller’s responsibility (this module only owns the metadata).

Source

pub fn sweep_expired(&self, hypertable: &str, now_ns: u64) -> Vec<ChunkMeta>

Sweep chunks whose effective TTL has fired. A chunk is droppable when now_ns ≥ max_ts_ns + effective_ttl_ns — the registry hands back every removed ChunkMeta so the physical-storage callback can release bytes + indexes. Chunks without an effective TTL (neither per-chunk override nor hypertable default) are never touched.

This is the “TTL applied at the partition level” primitive: one O(1) metadata sweep reclaims every row of every expired chunk, instead of scanning rows individually like an entity-level TTL would. Empty hypertables stay empty.

Source

pub fn sweep_all_expired(&self, now_ns: u64) -> Vec<(String, ChunkMeta)>

Sweep every registered hypertable in one shot — the loop the retention daemon runs every cycle. Returns a flat list of (hypertable_name, chunk_dropped) pairs.

Source

pub fn set_default_ttl_ns(&self, hypertable: &str, ttl_ns: Option<u64>) -> bool

Install / replace the hypertable-wide default TTL. None disables automatic expiry — chunks live until explicit drop_chunks / per-chunk override fires.

Source

pub fn set_chunk_ttl_ns(&self, id: &ChunkId, ttl_ns: Option<u64>) -> bool

Override the TTL for a single chunk. Useful for “keep this specific chunk longer because it contains an incident replay” or “expire this one faster because it was filled from a backfill we’re about to redo”. None removes the override and falls back to the hypertable default.

Source

pub fn chunks_expiring_within( &self, hypertable: &str, now_ns: u64, horizon_ns: u64, ) -> Vec<ChunkMeta>

Inspect the list of chunks that are about to expire within horizon_ns. Powers preview endpoints (“what will the next sweep drop?”) without actually dropping anything.

Source

pub fn seal_chunk(&self, id: &ChunkId) -> bool

Seal a chunk — future writes to the same start_ns bucket will still land (open-ended), but the sealed flag signals the maintenance layer that the chunk can now be compressed / uploaded / migrated. Returns true if the chunk existed.

Source

pub fn seal_chunk_columnar( &self, id: &ChunkId, page: PageLocation, bytes: Vec<u8>, ) -> bool

Seal a chunk columnar (PRD #850, #911): mark it sealed, record where its RDCC ColumnBlock lives in ChunkMeta.columnar_page, and stash the block bytes so the columnar read path can decode them. The columnar counterpart of seal_chunk — the production caller (seal_chunk_with_config’s columnar arm) hands the sealed bytes here. Returns true if the chunk existed.

Source

pub fn columnar_block(&self, id: &ChunkId) -> Option<Vec<u8>>

Fetch the RDCC ColumnBlock bytes recorded for a columnar-sealed chunk by seal_chunk_columnar. None for row-sealed chunks or chunks whose bytes are not RAM-resident (e.g. after a restart, pending the durable page-write bridge).

Source

pub fn total_rows(&self, hypertable: &str) -> u64

Total row count across every chunk of hypertable. Used by catalog views + benchmark harnesses.

Source

pub fn names(&self) -> Vec<String>

List the hypertables the retention daemon should sweep.

Source

pub fn is_empty(&self) -> bool

True when no hypertable is registered and no chunk is tracked. Lets the durability layer skip the persist step entirely for workloads that never declared a hypertable (zero overhead).

Source

pub fn snapshot_chunks(&self) -> Vec<ChunkMeta>

Snapshot every chunk across all hypertables, ordered by (hypertable, start_ns) so the persisted form is deterministic. Pairs with [restore_chunk] on boot. Specs are snapshotted via [list].

Source

pub fn restore_chunk(&self, meta: ChunkMeta)

Reinstate a chunk verbatim during recovery. Overwrites any existing entry for the same (hypertable, start_ns).

Unlike [route], this does not observe a timestamp — it restores the persisted counters (row_count, min_ts_ns, max_ts_ns, sealed, ttl_override_ns) exactly so the post-restart registry is identical to the pre-restart one. The caller is expected to [register] the owning spec first; a chunk whose hypertable has no spec is still tracked (routing falls back to the spec once it is registered), matching the pre-restart invariant that chunks outlive a missing spec only transiently.

Source

pub fn drop_hypertable(&self, name: &str) -> usize

Drop the whole hypertable (spec + every chunk). Returns the number of chunks removed.

Source

pub fn select_compaction_candidates( &self, hypertable: &str, max_rows_per_group: u64, min_chunks: usize, ) -> Vec<Vec<ChunkId>>

Select groups of small sealed columnar chunks that are candidates for compaction. Returns a list of groups; each group is a list of ChunkIds that together hold at most max_rows_total rows. Groups with fewer than min_chunks chunks are not returned (no-op merges).

Chunks are considered in oldest-first order within each hypertable. The caller decides the merge policy (threshold sizes, timing).

Source

pub fn compact_columnar_chunks( &self, hypertable: &str, source_ids: &[ChunkId], merged_chunk_id: u64, schema_ref: u64, granule_size: u32, ) -> Result<ChunkId, CompactionError>

Merge N sealed columnar chunks into one larger sealed columnar chunk.

§Crash safety

The merge is computed entirely in memory before any registry state is touched. The final registry update (insert merged entry + remove source entries) happens atomically under one Mutex lock acquisition. If the process is killed before the lock is taken, all source chunks remain intact — no committed data is lost. A torn merge (crash mid-computation, before the atomic commit) is safe because the registry never saw the partial output.

§Arguments
  • hypertable — name of the owning hypertable.
  • source_ids — the ChunkIds of the chunks to merge (must all be sealed, columnar, and have their blocks RAM-resident).
  • merged_chunk_id — the chunk_id header field for the output RDCC block; the caller assigns this (e.g. min(source start_ns) cast).
  • schema_ref — the catalog schema id written into the output header.
  • granule_size — sparse-granule-index stride for the merged block. Pass DEFAULT_GRANULE_SIZE for the standard 8 192-row marks.

Returns the ChunkId of the newly inserted merged chunk on success.

Trait Implementations§

Source§

impl Clone for HypertableRegistry

Source§

fn clone(&self) -> HypertableRegistry

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for HypertableRegistry

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for HypertableRegistry

Source§

fn default() -> HypertableRegistry

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromRef<T> for T
where T: Clone,

Source§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<L> LayerExt<L> for L

Source§

fn named_layer<S>(&self, service: S) -> Layered<<L as Layer<S>>::Service, S>
where L: Layer<S>,

Applies the layer to a service and wraps it in Layered.
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more