Skip to content

Commit 8d75384

Browse files
Add the root_key to the MissingEntries error. (#4916)
## Motivation We have some error of `MissingEntries` occurring in the logs. We do not know what is the relevant root key. So, we add it here. ## Proposal The following has been done: * The `fn root_key(&self) -> Result<Vec<u8>, Self::Error>` is added to the trait definition. We need a `Result` because of the deserialization of the keys in RocksDB and StorageService. * For RocksDB, ScyllaDB, DynamoDB, and StorageService, this did not add any new data. * The key is not added to the error since this would force some clone operation. ## Test Plan The CI. ## Release Plan The change could be backported to TestNet Conway. ## Links None.
1 parent e92fd4f commit 8d75384

File tree

20 files changed

+117
-22
lines changed

20 files changed

+117
-22
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
@@ -369,7 +369,7 @@ where
369369
ViewError::KeyTooLong | ViewError::ArithmeticError(_) => {
370370
Status::out_of_range(err.to_string())
371371
}
372-
ViewError::NotFound(_) | ViewError::MissingEntries => {
372+
ViewError::NotFound(_) | ViewError::MissingEntries(_) => {
373373
Status::not_found(err.to_string())
374374
}
375375
};

linera-storage-service/src/client.rs

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

101+
fn root_key(&self) -> Result<Vec<u8>, StorageServiceStoreError> {
102+
let root_key = bcs::from_bytes(&self.start_key[self.prefix_len..])?;
103+
Ok(root_key)
104+
}
105+
101106
async fn read_value_bytes(
102107
&self,
103108
key: &[u8],

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
@@ -803,6 +803,11 @@ impl ReadableKeyValueStore for DynamoDbStoreInternal {
803803
self.max_stream_queries
804804
}
805805

806+
fn root_key(&self) -> Result<Vec<u8>, DynamoDbStoreInternalError> {
807+
assert!(self.start_key.starts_with(EMPTY_ROOT_KEY));
808+
Ok(self.start_key[EMPTY_ROOT_KEY.len()..].to_vec())
809+
}
810+
806811
async fn read_value_bytes(
807812
&self,
808813
key: &[u8],

linera-views/src/backends/indexed_db.rs

Lines changed: 7 additions & 1 deletion
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 = bcs::from_bytes(&self.start_key[ROOT_KEY_DOMAIN.len()..])?;
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());
@@ -285,7 +291,7 @@ impl KeyValueDatabase for IndexedDbDatabase {
285291

286292
fn open_shared(&self, root_key: &[u8]) -> Result<Self::Store, IndexedDbStoreError> {
287293
let mut start_key = ROOT_KEY_DOMAIN.to_vec();
288-
start_key.extend(root_key);
294+
start_key.extend(bcs::to_bytes(&root_key)?);
289295
Ok(self.open_internal(start_key))
290296
}
291297

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
@@ -157,6 +157,10 @@ where
157157
self.store.max_stream_queries()
158158
}
159159

160+
fn root_key(&self) -> Result<Vec<u8>, Self::Error> {
161+
self.store.root_key()
162+
}
163+
160164
async fn read_value_bytes(&self, key: &[u8]) -> Result<Option<Vec<u8>>, Self::Error> {
161165
let Some(cache) = &self.cache else {
162166
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
}

linera-views/src/backends/metering.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,10 @@ where
312312
self.store.max_stream_queries()
313313
}
314314

315+
fn root_key(&self) -> Result<Vec<u8>, Self::Error> {
316+
self.store.root_key()
317+
}
318+
315319
async fn read_value_bytes(&self, key: &[u8]) -> Result<Option<Vec<u8>>, Self::Error> {
316320
let _latency = self.counter.read_value_bytes_latency.measure_latency();
317321
self.counter

0 commit comments

Comments
 (0)