Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 0 additions & 48 deletions linera-views/src/views/key_value_store_view.rs
Original file line number Diff line number Diff line change
Expand Up @@ -290,8 +290,6 @@ impl<C: Context> View for KeyValueStoreView<C> {
fn rollback(&mut self) {
self.deletion_set.rollback();
self.updates.clear();
self.total_size = self.stored_total_size;
self.sizes.rollback();
*self.hash.get_mut().unwrap() = self.stored_hash;
}

Expand All @@ -302,12 +300,6 @@ impl<C: Context> View for KeyValueStoreView<C> {
if !self.updates.is_empty() {
return true;
}
if self.stored_total_size != self.total_size {
return true;
}
if self.sizes.has_pending_changes().await {
return true;
}
let hash = self.hash.lock().unwrap();
self.stored_hash != *hash
}
Expand Down Expand Up @@ -346,7 +338,6 @@ impl<C: Context> View for KeyValueStoreView<C> {
}
}
}
self.sizes.pre_save(batch)?;
let hash = *self.hash.lock().unwrap();
if self.stored_hash != hash {
let key = self.context.base_key().base_tag(KeyTag::Hash as u8);
Expand All @@ -355,28 +346,20 @@ impl<C: Context> View for KeyValueStoreView<C> {
Some(hash) => batch.put_key_value(key, &hash)?,
}
}
if self.stored_total_size != self.total_size {
let key = self.context.base_key().base_tag(KeyTag::TotalSize as u8);
batch.put_key_value(key, &self.total_size)?;
}
Ok(delete_view)
}

fn post_save(&mut self) {
self.deletion_set.delete_storage_first = false;
self.deletion_set.deleted_prefixes.clear();
self.updates.clear();
self.sizes.post_save();
let hash = *self.hash.lock().unwrap();
self.stored_hash = hash;
self.stored_total_size = self.total_size;
}

fn clear(&mut self) {
self.deletion_set.clear();
self.updates.clear();
self.total_size = SizeData::default();
self.sizes.clear();
*self.hash.get_mut().unwrap() = None;
}
}
Expand Down Expand Up @@ -891,14 +874,6 @@ impl<C: Context> KeyValueStoreView<C> {
match operation {
WriteOperation::Delete { key } => {
ensure!(key.len() <= max_key_size, ViewError::KeyTooLong);
if let Some(value) = self.sizes.get(&key).await? {
let entry_size = SizeData {
key: u32::try_from(key.len()).map_err(|_| ArithmeticError::Overflow)?,
value,
};
self.total_size.sub_assign(entry_size);
}
self.sizes.remove(key.clone());
if self.deletion_set.contains_prefix_of(&key) {
// Optimization: No need to mark `short_key` for deletion as we are going to remove all the keys at once.
self.updates.remove(&key);
Expand All @@ -908,19 +883,6 @@ impl<C: Context> KeyValueStoreView<C> {
}
WriteOperation::Put { key, value } => {
ensure!(key.len() <= max_key_size, ViewError::KeyTooLong);
let entry_size = SizeData {
key: key.len() as u32,
value: value.len() as u32,
};
self.total_size.add_assign(entry_size)?;
if let Some(value) = self.sizes.get(&key).await? {
let entry_size = SizeData {
key: key.len() as u32,
value,
};
self.total_size.sub_assign(entry_size);
}
self.sizes.insert(key.clone(), entry_size.value);
self.updates.insert(key, Update::Set(value));
}
WriteOperation::DeletePrefix { key_prefix } => {
Expand All @@ -933,16 +895,6 @@ impl<C: Context> KeyValueStoreView<C> {
for key in key_list {
self.updates.remove(&key);
}
let key_values = self.sizes.key_values_by_prefix(key_prefix.clone()).await?;
for (key, value) in key_values {
let entry_size = SizeData {
key: key.len() as u32,
value,
};
self.total_size.sub_assign(entry_size);
self.sizes.remove(key);
}
self.sizes.remove_by_prefix(key_prefix.clone());
self.deletion_set.insert_key_prefix(key_prefix);
}
}
Expand Down
21 changes: 4 additions & 17 deletions linera-views/tests/random_container_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
bucket_queue_view::HashedBucketQueueView,
collection_view::{CollectionView, HashedCollectionView},
context::{Context, MemoryContext},
key_value_store_view::{KeyValueStoreView, SizeData},
key_value_store_view::KeyValueStoreView,
map_view::{HashedByteMapView, MapView},
queue_view::HashedQueueView,
random::make_deterministic_rng,
Expand Down Expand Up @@ -140,19 +140,6 @@
map.retain(|key, _| !key.starts_with(&key_prefix));
}

fn total_size(vec: &Vec<(Vec<u8>, Vec<u8>)>) -> SizeData {
let mut total_key_size = 0;
let mut total_value_size = 0;
for (key, value) in vec {
total_key_size += key.len();
total_value_size += value.len();
}
SizeData {
key: total_key_size as u32,
value: total_value_size as u32,
}
}

#[tokio::test]
async fn key_value_store_view_mutability() -> Result<()> {
let context = MemoryContext::new_for_testing(());
Expand All @@ -164,9 +151,9 @@
let mut view = KeyValueStateView::load(context.clone()).await?;
let save = rng.gen::<bool>();
let read_state = view.store.index_values().await?;
let state_vec = state_map.clone().into_iter().collect::<Vec<_>>();

Check warning on line 154 in linera-views/tests/random_container_tests.rs

View workflow job for this annotation

GitHub Actions / lint-cargo-fmt

Diff in /home/runner/work/linera-protocol/linera-protocol/linera-views/tests/random_container_tests.rs
assert!(read_state.iter().map(|kv| (&kv.0, &kv.1)).eq(&state_map));
assert_eq!(total_size(&state_vec), view.store.total_size());


let count_oper = rng.gen_range(0..15);
let mut new_state_map = state_map.clone();
Expand All @@ -188,10 +175,10 @@
view.store.insert(key.clone(), value.clone()).await?;
new_state_map.insert(key, value);

new_state_vec = new_state_map.clone().into_iter().collect();

Check warning on line 178 in linera-views/tests/random_container_tests.rs

View workflow job for this annotation

GitHub Actions / lint-cargo-fmt

Diff in /home/runner/work/linera-protocol/linera-protocol/linera-views/tests/random_container_tests.rs
let new_key_values = view.store.index_values().await?;
assert_eq!(new_state_vec, new_key_values);
assert_eq!(total_size(&new_state_vec), view.store.total_size());

}
}
if choice == 1 && entry_count > 0 {
Expand Down Expand Up @@ -225,7 +212,7 @@
new_state_vec = new_state_map.clone().into_iter().collect();
let new_key_values = view.store.index_values().await?;
assert_eq!(new_state_vec, new_key_values);
assert_eq!(total_size(&new_state_vec), view.store.total_size());

let all_keys_vec = all_keys.clone().into_iter().collect::<Vec<_>>();
let tests_multi_get = view.store.multi_get(&all_keys_vec).await?;
for (i, key) in all_keys.clone().into_iter().enumerate() {
Expand Down
Loading