Skip to content

Commit 9a4c985

Browse files
MathieuDutSikafck
andauthored
[testnet] Backport the "fn root_key" and the MissingEntries change (#4916) (#4926)
Backport #4916. ## Motivation The "fn root_key(&self)" function and the "MissingEntries(Vec<u8>)" are of interest to TestNet usage. ## Proposal Backport the change. It is not completely straightforward, since the handling of `root_key` has changed in main for RocksDB and StorageService (see #4859 and #4858). ## Test Plan The same test function has been added. ## Release Plan To TestNet Conway. ## Links None. --------- Signed-off-by: Mathieu Dutour Sikiric <[email protected]> Co-authored-by: Andreas Fackler <[email protected]>
1 parent aaa9818 commit 9a4c985

File tree

21 files changed

+128
-34
lines changed

21 files changed

+128
-34
lines changed

linera-sdk/src/views/system_api.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ impl ReadableKeyValueStore for KeyValueStore {
111111
1
112112
}
113113

114+
fn root_key(&self) -> Result<Vec<u8>, KeyValueStoreError> {
115+
Ok(Vec::new())
116+
}
117+
114118
async fn contains_key(&self, key: &[u8]) -> Result<bool, KeyValueStoreError> {
115119
ensure!(
116120
key.len() <= Self::MAX_KEY_SIZE,

linera-service/src/proxy/grpc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ where
361361
}
362362
ViewError::NotFound(_)
363363
| ViewError::CannotAcquireCollectionEntry
364-
| ViewError::MissingEntries => Status::not_found(err.to_string()),
364+
| ViewError::MissingEntries(_) => Status::not_found(err.to_string()),
365365
};
366366
status.set_source(Arc::new(err));
367367
status

linera-storage-service/src/client.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ impl ReadableKeyValueStore for StorageServiceStoreInternal {
9898
self.max_stream_queries
9999
}
100100

101+
fn root_key(&self) -> Result<Vec<u8>, StorageServiceStoreError> {
102+
Ok(self.start_key[self.prefix_len..].to_vec())
103+
}
104+
101105
async fn read_value_bytes(
102106
&self,
103107
key: &[u8],

linera-storage/src/migration.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ where
135135
.await?;
136136
let mut batch = MultiPartitionBatch::new();
137137
for (base_key, value) in chunk_base_keys.iter().zip(values) {
138-
let value = value.ok_or(ViewError::MissingEntries)?;
138+
let value = value.ok_or(ViewError::MissingEntries(Vec::new()))?;
139139
let (root_key, key) = map_base_key(base_key)?;
140140
batch.put_key_value(root_key, key, value);
141141
}
@@ -169,7 +169,7 @@ where
169169
return Ok(());
170170
}
171171
let result = self.migrate_v0_to_v1().await;
172-
if let Err(ViewError::MissingEntries) = result {
172+
if let Err(ViewError::MissingEntries(_)) = result {
173173
tracing::warn!(
174174
"It looks like a migration is already in progress on this database. \
175175
I will wait for {:?} minutes and retry.",

linera-views/src/backends/dual.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,13 @@ where
9696
}
9797
}
9898

99+
fn root_key(&self) -> Result<Vec<u8>, Self::Error> {
100+
Ok(match self {
101+
Self::First(store) => store.root_key().map_err(DualStoreError::First)?,
102+
Self::Second(store) => store.root_key().map_err(DualStoreError::Second)?,
103+
})
104+
}
105+
99106
async fn read_value_bytes(&self, key: &[u8]) -> Result<Option<Vec<u8>>, Self::Error> {
100107
let result = match self {
101108
Self::First(store) => store

linera-views/src/backends/dynamo_db.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,11 @@ impl ReadableKeyValueStore for DynamoDbStoreInternal {
719719
self.max_stream_queries
720720
}
721721

722+
fn root_key(&self) -> Result<Vec<u8>, DynamoDbStoreInternalError> {
723+
assert!(self.start_key.starts_with(EMPTY_ROOT_KEY));
724+
Ok(self.start_key[EMPTY_ROOT_KEY.len()..].to_vec())
725+
}
726+
722727
async fn read_value_bytes(
723728
&self,
724729
key: &[u8],

linera-views/src/backends/indexed_db.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,12 @@ impl ReadableKeyValueStore for IndexedDbStore {
119119
self.max_stream_queries
120120
}
121121

122+
fn root_key(&self) -> Result<Vec<u8>, IndexedDbStoreError> {
123+
assert!(self.start_key.starts_with(&ROOT_KEY_DOMAIN));
124+
let root_key = self.start_key[ROOT_KEY_DOMAIN.len()..].to_vec();
125+
Ok(root_key)
126+
}
127+
122128
async fn read_value_bytes(&self, key: &[u8]) -> Result<Option<Vec<u8>>, IndexedDbStoreError> {
123129
let key = self.full_key(key);
124130
let key = js_sys::Uint8Array::from(key.as_slice());

linera-views/src/backends/journaling.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ where
123123
self.store.max_stream_queries()
124124
}
125125

126+
fn root_key(&self) -> Result<Vec<u8>, Self::Error> {
127+
self.store.root_key()
128+
}
129+
126130
async fn read_value_bytes(&self, key: &[u8]) -> Result<Option<Vec<u8>>, Self::Error> {
127131
self.store.read_value_bytes(key).await
128132
}

linera-views/src/backends/lru_caching.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,10 @@ where
291291
self.store.max_stream_queries()
292292
}
293293

294+
fn root_key(&self) -> Result<Vec<u8>, Self::Error> {
295+
self.store.root_key()
296+
}
297+
294298
async fn read_value_bytes(&self, key: &[u8]) -> Result<Option<Vec<u8>>, Self::Error> {
295299
let Some(cache) = &self.cache else {
296300
return self.store.read_value_bytes(key).await;

linera-views/src/backends/memory.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ impl MemoryDatabases {
7373
let map = store.clone();
7474
Ok(MemoryStore {
7575
map,
76+
root_key: root_key.to_vec(),
7677
max_stream_queries,
7778
})
7879
}
@@ -111,6 +112,8 @@ static MEMORY_DATABASES: LazyLock<Mutex<MemoryDatabases>> =
111112
pub struct MemoryStore {
112113
/// The map used for storing the data.
113114
map: Arc<RwLock<MemoryStoreMap>>,
115+
/// The root key.
116+
root_key: Vec<u8>,
114117
/// The maximum number of queries used for a stream.
115118
max_stream_queries: usize,
116119
}
@@ -130,6 +133,10 @@ impl ReadableKeyValueStore for MemoryStore {
130133
self.max_stream_queries
131134
}
132135

136+
fn root_key(&self) -> Result<Vec<u8>, MemoryStoreError> {
137+
Ok(self.root_key.clone())
138+
}
139+
133140
async fn read_value_bytes(&self, key: &[u8]) -> Result<Option<Vec<u8>>, MemoryStoreError> {
134141
let map = self
135142
.map
@@ -247,6 +254,7 @@ impl MemoryStore {
247254
pub fn new_for_testing() -> Self {
248255
Self {
249256
map: Arc::default(),
257+
root_key: Vec::new(),
250258
max_stream_queries: TEST_MEMORY_MAX_STREAM_QUERIES,
251259
}
252260
}

0 commit comments

Comments
 (0)