Skip to main content

uqa_storage/key_value/diskann/source/
owned.rs

1//
2// Unified Query Algebra
3//
4// Copyright (c) 2023-2026 Cognica, Inc.
5//
6
7//! Private publication retains the read itself, so its build lease travels with that read.
8
9use std::sync::Arc;
10
11use uqa_core::memory::Budgeted;
12
13use crate::key_value::{KeyValueRead, KeyValueReadRevision};
14use crate::mvcc::ResourceLease;
15use crate::read_control::{
16    KeyReadVisitor, KeyValueReadVisitor, StorageReadControl, ValueReadVisitor,
17};
18use crate::StorageBackendResult;
19
20pub(super) struct OwnedRead {
21    read: Arc<dyn KeyValueRead + Send + Sync>,
22    lease: ResourceLease,
23}
24
25impl OwnedRead {
26    pub(super) fn retain(
27        read: Arc<dyn KeyValueRead + Send + Sync>,
28        lease: ResourceLease,
29        control: &StorageReadControl,
30    ) -> StorageBackendResult<Arc<dyn KeyValueRead + Send + Sync>> {
31        Ok(
32            Budgeted::new(Self { read, lease }, control.memory().empty_reservation())
33                .into_shared()?,
34        )
35    }
36}
37
38impl KeyValueRead for Budgeted<OwnedRead> {
39    fn control(&self) -> &StorageReadControl {
40        self.read.control()
41    }
42    fn revision(&self, prefixes: &[&[u8]]) -> StorageBackendResult<KeyValueReadRevision> {
43        self.read.revision(prefixes)
44    }
45    fn record_revision(&self, key: &[u8]) -> StorageBackendResult<Option<KeyValueReadRevision>> {
46        self.read.record_revision(key)
47    }
48    fn retained_source(
49        &self,
50        key: &[u8],
51    ) -> StorageBackendResult<Option<Arc<dyn KeyValueRead + Send + Sync>>> {
52        self.read.retained_source(key)
53    }
54    fn retain(
55        &self,
56        prefixes: &[&[u8]],
57    ) -> StorageBackendResult<Arc<dyn KeyValueRead + Send + Sync>> {
58        OwnedRead::retain(
59            self.read.retain(prefixes)?,
60            self.lease.clone(),
61            self.control(),
62        )
63    }
64    fn visit_value(
65        &self,
66        key: &[u8],
67        visit: &mut ValueReadVisitor<'_>,
68    ) -> StorageBackendResult<()> {
69        self.read.visit_value(key, visit)
70    }
71    fn visit_prefix(
72        &self,
73        prefix: &[u8],
74        visit: &mut KeyValueReadVisitor<'_>,
75    ) -> StorageBackendResult<()> {
76        self.read.visit_prefix(prefix, visit)
77    }
78    fn visit_value_budgeted(
79        &self,
80        key: &[u8],
81        control: &StorageReadControl,
82        visit: &mut ValueReadVisitor<'_>,
83    ) -> StorageBackendResult<()> {
84        self.read.visit_value_budgeted(key, control, visit)
85    }
86    fn visit_value_bounded(
87        &self,
88        key: &[u8],
89        max_bytes: usize,
90        control: &StorageReadControl,
91        visit: &mut ValueReadVisitor<'_>,
92    ) -> StorageBackendResult<()> {
93        self.read
94            .visit_value_bounded(key, max_bytes, control, visit)
95    }
96    fn visit_prefix_after(
97        &self,
98        prefix: &[u8],
99        after: Option<&[u8]>,
100        limit: usize,
101        control: &StorageReadControl,
102        visit: &mut KeyValueReadVisitor<'_>,
103    ) -> StorageBackendResult<()> {
104        self.read
105            .visit_prefix_after(prefix, after, limit, control, visit)
106    }
107    fn visit_keys_after(
108        &self,
109        prefix: &[u8],
110        after: Option<&[u8]>,
111        limit: usize,
112        control: &StorageReadControl,
113        visit: &mut KeyReadVisitor<'_>,
114    ) -> StorageBackendResult<()> {
115        self.read
116            .visit_keys_after(prefix, after, limit, control, visit)
117    }
118    fn contains_prefix_budgeted(
119        &self,
120        prefix: &[u8],
121        control: &StorageReadControl,
122    ) -> StorageBackendResult<bool> {
123        self.read.contains_prefix_budgeted(prefix, control)
124    }
125}