pub struct RecordStore { /* private fields */ }Expand description
Receiver-side DHT record store.
Not internally synchronised — the handler owns it behind a Mutex /
RwLock, mirroring how RoutingTable is composed. The methods are
&mut self because every admission path touches multiple indexes
(the primary (hash → entries) map, the per-publisher quota count,
and the global LRU ordering); requiring exclusive access keeps those
invariants atomic without internal locking overhead.
Implementations§
Source§impl RecordStore
impl RecordStore
Sourcepub fn new(cfg: RecordStoreConfig) -> Self
pub fn new(cfg: RecordStoreConfig) -> Self
Construct an empty store.
Sourcepub const fn capacity(&self) -> usize
pub const fn capacity(&self) -> usize
Global record capacity — the configured
RecordStoreConfig::max_records_global ceiling. Paired with
Self::len to report store utilization in the
admin_v1_status health view (issue #741).
Sourcepub fn publisher_record_count(&self, holder: &NodeId) -> usize
pub fn publisher_record_count(&self, holder: &NodeId) -> usize
Record count for one publisher. Returns 0 for unknown publishers.
Sourcepub fn insert_at(
&mut self,
holder: NodeId,
hash: Hash,
coverage: Coverage,
receive_us: u64,
) -> InsertOutcome
pub fn insert_at( &mut self, holder: NodeId, hash: Hash, coverage: Coverage, receive_us: u64, ) -> InsertOutcome
Insert or refresh (holder, hash) with receive_us as the
receiver-anchored wall-clock at acceptance. Returns the outcome.
The caller is responsible for the upstream admission checks (rate
limit, holder == authenticated NodeId, StakerSet::is_active).
This method enforces only the storage-level invariants (per-publisher
quota with hard reject, global LRU with eviction, per-hash provider
cap with oldest-provider eviction).
Sourcepub fn providers_at(&mut self, hash: &Hash, now_us: u64) -> Vec<Provider>
pub fn providers_at(&mut self, hash: &Hash, now_us: u64) -> Vec<Provider>
Return the current holders for hash, dropping any whose
expiry_us <= now_us. The result is capped at the configured
per-hash provider count (which equals the wire
MAX_PROVIDERS_PER_HASH in production), so the handler can
serialise the return value directly into a
decdn_protocol::FindValueResponse.
now_us is the requester-side wall-clock — passed in rather
than read inline so the same store can be exercised under a
mock clock in tests.
Sourcepub fn gc(&mut self, now_us: u64) -> usize
pub fn gc(&mut self, now_us: u64) -> usize
Periodic GC sweep — drops every expired record across the store. Returns the number removed.
ttl_us is constant for all records, so global_lru (ordered by
receive_us) is ALSO ordered by expiry_us — the oldest entries
are always at the front. The sweep pops from global_lru.first()
until it sees a non-expired record and returns, which is
O(expired × log N) rather than the previous O(N) full scan.
Trait Implementations§
Auto Trait Implementations§
impl Freeze for RecordStore
impl RefUnwindSafe for RecordStore
impl Send for RecordStore
impl Sync for RecordStore
impl Unpin for RecordStore
impl UnsafeUnpin for RecordStore
impl UnwindSafe for RecordStore
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> 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::Request