uqa_storage/key_value/diskann/source/
owned.rs1use 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}