pub struct PlainMmapBacking { /* private fields */ }Expand description
Zero-copy VectorSegmentBacking backed by a plaintext NDVS mmap segment.
Vectors and surrogate IDs are served as slices directly into the mmap region — no allocation on the read path.
§Send + Sync rationale
MmapVectorSegment is declared !Send + !Sync because it holds a
*const u8 field (base) pointing into the mmap region. Raw pointers are
conservative: the compiler cannot know whether the pointee is safe to share.
The mmap region behind base is:
- mapped with
PROT_READ | MAP_PRIVATE— never mutated through this pointer after construction, - valid for exactly the lifetime of the
MmapVectorSegment(the descriptor_fdkeeps the file open;munmapruns inDrop), - not thread-affine — the OS virtual-memory subsystem treats it as a process-global read-only region.
All access to base goes through get_vector / get_surrogate /
prefetch, which derive shared borrows (&[f32], &[u8]) that live no
longer than &self. No &mut path exists. Multiple threads reading
distinct vectors concurrently is safe for the same reason &[T] is Sync.
The Arc<MmapVectorSegment> wrapper ensures the segment (and therefore
the mmap region) outlives any &[f32] slice handed out through this type.
SAFETY: given the above invariants, treating PlainMmapBacking as
Send + Sync is correct.
Implementations§
Source§impl PlainMmapBacking
impl PlainMmapBacking
Sourcepub fn new(seg: MmapVectorSegment) -> Self
pub fn new(seg: MmapVectorSegment) -> Self
Wrap a MmapVectorSegment that is not yet reference-counted.
MmapVectorSegment holds a *const u8 raw pointer which makes it
!Send + !Sync by default. The unsafe impl Send + Sync on
PlainMmapBacking (see struct-level doc comment) establishes the safety
invariants; clippy cannot see through the Arc to the impl, so we
suppress the lint here.
Sourcepub fn from_arc(seg: Arc<MmapVectorSegment>) -> Self
pub fn from_arc(seg: Arc<MmapVectorSegment>) -> Self
Wrap an already reference-counted segment.
Useful when the same segment is shared with other consumers (e.g. a
crate::collection::VectorCollection that also owns the segment for
direct SIMD scan).
Sourcepub fn segment(&self) -> &Arc<MmapVectorSegment>
pub fn segment(&self) -> &Arc<MmapVectorSegment>
Access the underlying segment.
Trait Implementations§
impl Send for PlainMmapBacking
impl Sync for PlainMmapBacking
Source§impl VectorSegmentBacking for PlainMmapBacking
impl VectorSegmentBacking for PlainMmapBacking
Auto Trait Implementations§
impl Freeze for PlainMmapBacking
impl RefUnwindSafe for PlainMmapBacking
impl Unpin for PlainMmapBacking
impl UnsafeUnpin for PlainMmapBacking
impl UnwindSafe for PlainMmapBacking
Blanket Implementations§
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
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> 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> 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.