pub struct PrefixIndex { /* private fields */ }Expand description
Concurrent prefix → nodes index. The internal map is DashMap keyed by
the 32-byte digest. Per-prefix node lists are guarded by a RwLock to
avoid lock contention on hot keys.
Implementations§
Source§impl PrefixIndex
impl PrefixIndex
pub fn new(ttl: Duration) -> Self
Sourcepub fn insert(&self, digest: [u8; 32], node_id: &str)
pub fn insert(&self, digest: [u8; 32], node_id: &str)
Record that node_id currently holds digest.
Sourcepub fn forget_node(&self, node_id: &str)
pub fn forget_node(&self, node_id: &str)
Drop a node from the index entirely (invoked on graceful drain).
Sourcepub fn lookup(&self, digest: &[u8; 32]) -> Vec<String>
pub fn lookup(&self, digest: &[u8; 32]) -> Vec<String>
Look up the live nodes that currently hold digest.
Sourcepub fn overlap(&self, digests: &[[u8; 32]]) -> HashMap<String, usize>
pub fn overlap(&self, digests: &[[u8; 32]]) -> HashMap<String, usize>
Compute, for every node, how many of digests it holds. Returns a
hash map of node_id -> count. The router uses this to score nodes
by content overlap.
This counts every matching digest regardless of position. Use
Self::longest_prefix_overlap when the digests are
sequence-chained (hash_seq_chunks) and you want the actual
length of the cached prefix the node can serve without a prefill.
Sourcepub fn longest_prefix_overlap(
&self,
digests: &[[u8; 32]],
) -> HashMap<String, usize>
pub fn longest_prefix_overlap( &self, digests: &[[u8; 32]], ) -> HashMap<String, usize>
For each node, report the length of the longest contiguous prefix
of digests (starting at index 0) that the node holds.
digests MUST be sequence-chained — i.e. produced by
crate::hash::hash_seq_chunks — otherwise the result is
meaningless. With sequence-chained digests, “node X holds chunks
0..K in the right order” reduces to “node X has digest_i for
every i in 0..K”, because the chained hash already encodes
positional dependency.
Returns node_id -> prefix_length_in_chunks for every node that
holds at least chunk 0. Nodes with no prefix overlap are absent
from the map.
pub fn is_empty(&self) -> bool
Trait Implementations§
Source§impl Default for PrefixIndex
impl Default for PrefixIndex
Source§fn default() -> PrefixIndex
fn default() -> PrefixIndex
Auto Trait Implementations§
impl !RefUnwindSafe for PrefixIndex
impl Freeze for PrefixIndex
impl Send for PrefixIndex
impl Sync for PrefixIndex
impl Unpin for PrefixIndex
impl UnsafeUnpin for PrefixIndex
impl UnwindSafe for PrefixIndex
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> 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> 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