From b90db8e676c877f18f2d342241a0d59a311e3bd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Blankfors?= Date: Wed, 30 Oct 2024 10:46:03 +0100 Subject: [PATCH 1/2] perf: Change `kv_store::Value` to be Arc<[u8]> instead of Arc> --- CHANGELOG.md | 1 + Cargo.lock | 2 +- benches/src/db_lookup_times_utils/seed.rs | 12 +++--- benches/src/db_lookup_times_utils/utils.rs | 9 ++--- .../service/adapters/graphql_api/off_chain.rs | 2 +- .../fuel-core/src/state/historical_rocksdb.rs | 2 +- .../src/state/in_memory/memory_store.rs | 7 ++-- crates/fuel-core/src/state/rocks_db.rs | 40 +++++++++---------- .../upgradable-executor/src/instance.rs | 2 +- crates/storage/src/codec.rs | 2 +- crates/storage/src/iter.rs | 2 +- crates/storage/src/kv_store.rs | 2 +- crates/storage/src/structured_storage.rs | 3 +- crates/storage/src/transactional.rs | 34 ++++++++-------- 14 files changed, 59 insertions(+), 61 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3870ca84e02..31a3b3847d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - [2389](https://github.com/FuelLabs/fuel-core/pull/2258): Updated the `messageProof` GraphQL schema to return a non-nullable `MessageProof`. - [2154](https://github.com/FuelLabs/fuel-core/pull/2154): Transaction graphql endpoints use `TransactionType` instead of `fuel_tx::Transaction`. - [2446](https://github.com/FuelLabs/fuel-core/pull/2446): Use graphiql instead of graphql-playground due to known vulnerability and stale development. +- [2379](https://github.com/FuelLabs/fuel-core/issues/2379): Change `kv_store::Value` to be `Arc<[u8]>` instead of `Arc>`. ## [Version 0.40.0] diff --git a/Cargo.lock b/Cargo.lock index 1ed9dd67683..07022867482 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6958,7 +6958,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.87", + "syn 2.0.89", ] [[package]] diff --git a/benches/src/db_lookup_times_utils/seed.rs b/benches/src/db_lookup_times_utils/seed.rs index e5d68c4450f..cd8089a2c03 100644 --- a/benches/src/db_lookup_times_utils/seed.rs +++ b/benches/src/db_lookup_times_utils/seed.rs @@ -91,13 +91,13 @@ pub fn insert_compressed_block( let compressed_block = block.compress(&ChainId::default()); let height_key = height_key(height); - let raw_compressed_block = postcard::to_allocvec(&compressed_block)?.to_vec(); + let raw_compressed_block = postcard::to_allocvec(&compressed_block)?; let raw_transactions: Vec<(Bytes32, Vec)> = block .transactions() .iter() .map(|tx| -> DbLookupBenchResult<(Bytes32, Vec)> { let tx_id = tx.id(&ChainId::default()); - let raw_tx = postcard::to_allocvec(tx)?.to_vec(); + let raw_tx = postcard::to_allocvec(tx)?; Ok((tx_id, raw_tx)) }) .try_collect()?; @@ -106,14 +106,14 @@ pub fn insert_compressed_block( database.put( height_key.as_slice(), BenchDbColumn::FuelBlocks, - Value::new(raw_compressed_block), + Value::from(raw_compressed_block), )?; // 2. insert into Transactions table for (tx_id, tx) in raw_transactions { database.put( tx_id.as_slice(), BenchDbColumn::Transactions, - Value::new(tx), + Value::from(tx), )?; } @@ -130,13 +130,13 @@ pub fn insert_full_block( let block = insert_compressed_block(database, height, tx_count)?; let height_key = height_key(height); - let raw_full_block = postcard::to_allocvec(&block)?.to_vec(); + let raw_full_block = postcard::to_allocvec(&block)?; database .put( height_key.as_slice(), BenchDbColumn::FullFuelBlocks, - Value::new(raw_full_block), + Value::from(raw_full_block), ) .map_err(|err| anyhow!(err))?; diff --git a/benches/src/db_lookup_times_utils/utils.rs b/benches/src/db_lookup_times_utils/utils.rs index 4db547a5094..72f376e1e7e 100644 --- a/benches/src/db_lookup_times_utils/utils.rs +++ b/benches/src/db_lookup_times_utils/utils.rs @@ -75,7 +75,7 @@ fn get_block_full_block_method( .get(&height_key, BenchDbColumn::FullFuelBlocks)? .ok_or(anyhow!("empty raw full block"))?; - let block: Block = postcard::from_bytes(raw_block.as_slice())?; + let block: Block = postcard::from_bytes(&raw_block)?; Ok(block) } @@ -88,7 +88,7 @@ fn get_block_multi_get_method( let raw_block = database .get(&height_key, BenchDbColumn::FuelBlocks)? .ok_or(anyhow!("empty raw block"))?; - let block: CompressedBlock = postcard::from_bytes(raw_block.as_slice())?; + let block: CompressedBlock = postcard::from_bytes(&raw_block)?; let tx_ids = block.transactions().iter(); let raw_txs = database.multi_get(BenchDbColumn::Transactions.id(), tx_ids)?; let txs: Vec = raw_txs @@ -109,7 +109,7 @@ fn get_block_headers_and_tx_method( let raw_block = database .get(&height_key, BenchDbColumn::FuelBlocks)? .ok_or(anyhow!("empty raw block"))?; - let block: CompressedBlock = postcard::from_bytes(raw_block.as_slice())?; + let block: CompressedBlock = postcard::from_bytes(&raw_block)?; let txs: Vec = block .transactions() @@ -118,8 +118,7 @@ fn get_block_headers_and_tx_method( let raw_tx = database .get(tx_id.as_slice(), BenchDbColumn::Transactions)? .ok_or(anyhow!("empty transaction"))?; - postcard::from_bytes::(raw_tx.as_slice()) - .map_err(|err| anyhow!(err)) + postcard::from_bytes::(&raw_tx).map_err(|err| anyhow!(err)) }) .try_collect()?; diff --git a/crates/fuel-core/src/service/adapters/graphql_api/off_chain.rs b/crates/fuel-core/src/service/adapters/graphql_api/off_chain.rs index d554c7ddc45..2caf033e2c8 100644 --- a/crates/fuel-core/src/service/adapters/graphql_api/off_chain.rs +++ b/crates/fuel-core/src/service/adapters/graphql_api/off_chain.rs @@ -82,7 +82,7 @@ impl OffChainDatabase for OffChainIterableKeyValueView { self.get(encoder.as_ref(), column)? .ok_or_else(|| not_found!(DaCompressedBlocks)) - .map(|value| value.as_ref().clone()) + .map(|value| value.to_vec()) } fn tx_status(&self, tx_id: &TxId) -> StorageResult { diff --git a/crates/fuel-core/src/state/historical_rocksdb.rs b/crates/fuel-core/src/state/historical_rocksdb.rs index 48335ed9a39..a0bd39b2801 100644 --- a/crates/fuel-core/src/state/historical_rocksdb.rs +++ b/crates/fuel-core/src/state/historical_rocksdb.rs @@ -145,7 +145,7 @@ where ); } (Some(old_value), WriteOperation::Insert(new_value)) => { - if old_value.as_slice() != new_value.as_slice() { + if *old_value != **new_value { entry.insert( key.clone(), WriteOperation::Insert(old_value.into()), diff --git a/crates/fuel-core/src/state/in_memory/memory_store.rs b/crates/fuel-core/src/state/in_memory/memory_store.rs index c23eafe48e3..17ee7f9ea5b 100644 --- a/crates/fuel-core/src/state/in_memory/memory_store.rs +++ b/crates/fuel-core/src/state/in_memory/memory_store.rs @@ -223,7 +223,6 @@ mod tests { kv_store::KeyValueMutate, transactional::ReadTransaction, }; - use std::sync::Arc; impl KeyValueMutate for MemoryStore where @@ -256,7 +255,7 @@ mod tests { let key = vec![0x00]; let mut db = MemoryStore::::default(); - let expected = Arc::new(vec![]); + let expected = Value::from([]); db.put(&key.to_vec(), Column::Metadata, expected.clone()) .unwrap(); @@ -281,7 +280,7 @@ mod tests { let key: Vec = Vec::with_capacity(0); let mut db = MemoryStore::::default(); - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); db.put(&key, Column::Metadata, expected.clone()).unwrap(); assert_eq!(db.get(&key, Column::Metadata).unwrap().unwrap(), expected); @@ -305,7 +304,7 @@ mod tests { let key: Vec = Vec::with_capacity(0); let mut db = MemoryStore::::default(); - let expected = Arc::new(vec![]); + let expected = Value::from([]); db.put(&key, Column::Metadata, expected.clone()).unwrap(); assert_eq!(db.get(&key, Column::Metadata).unwrap().unwrap(), expected); diff --git a/crates/fuel-core/src/state/rocks_db.rs b/crates/fuel-core/src/state/rocks_db.rs index 513a7feaf2c..dfb8d7a9832 100644 --- a/crates/fuel-core/src/state/rocks_db.rs +++ b/crates/fuel-core/src/state/rocks_db.rs @@ -706,7 +706,7 @@ impl ExtractItem for KeyAndValue { { raw_iterator .item() - .map(|(key, value)| (key.to_vec(), Arc::new(value.to_vec()))) + .map(|(key, value)| (key.to_vec(), Value::from(value))) } fn size(item: &Self::Item) -> u64 { @@ -754,7 +754,7 @@ where self.metrics.bytes_read.inc_by(value.len() as u64); } - Ok(value.map(Arc::new)) + Ok(value.map(Arc::from)) } fn read( @@ -949,7 +949,7 @@ mod tests { let key = vec![0xA, 0xB, 0xC]; let (mut db, _tmp) = create_db(); - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); db.put(&key, Column::Metadata, expected.clone()).unwrap(); assert_eq!(db.get(&key, Column::Metadata).unwrap().unwrap(), expected) @@ -960,10 +960,10 @@ mod tests { let key = vec![0xA, 0xB, 0xC]; let (mut db, _tmp) = create_db(); - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); db.put(&key, Column::Metadata, expected.clone()).unwrap(); let prev = db - .replace(&key, Column::Metadata, Arc::new(vec![2, 4, 6])) + .replace(&key, Column::Metadata, Arc::new([2, 4, 6])) .unwrap(); assert_eq!(prev, Some(expected)); @@ -974,7 +974,7 @@ mod tests { let key = vec![0xA, 0xB, 0xC]; let (mut db, _tmp) = create_db(); - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); db.put(&key, Column::Metadata, expected.clone()).unwrap(); assert_eq!(db.get(&key, Column::Metadata).unwrap().unwrap(), expected); @@ -987,7 +987,7 @@ mod tests { let key = vec![0xA, 0xB, 0xC]; let (mut db, _tmp) = create_db(); - let expected = Arc::new(vec![1, 2, 3]); + let expected = Arc::new([1, 2, 3]); db.put(&key, Column::Metadata, expected).unwrap(); assert!(db.exists(&key, Column::Metadata).unwrap()); } @@ -995,7 +995,7 @@ mod tests { #[test] fn commit_changes_inserts() { let key = vec![0xA, 0xB, 0xC]; - let value = Arc::new(vec![1, 2, 3]); + let value = Value::from([1, 2, 3]); let (db, _tmp) = create_db(); let ops = vec![( @@ -1013,7 +1013,7 @@ mod tests { #[test] fn commit_changes_removes() { let key = vec![0xA, 0xB, 0xC]; - let value = Arc::new(vec![1, 2, 3]); + let value = Arc::new([1, 2, 3]); let (mut db, _tmp) = create_db(); db.put(&key, Column::Metadata, value).unwrap(); @@ -1032,7 +1032,7 @@ mod tests { let key = vec![0x00]; let (mut db, _tmp) = create_db(); - let expected = Arc::new(vec![]); + let expected = Value::from([]); db.put(&key, Column::Metadata, expected.clone()).unwrap(); assert_eq!(db.get(&key, Column::Metadata).unwrap().unwrap(), expected); @@ -1056,7 +1056,7 @@ mod tests { let key: Vec = Vec::with_capacity(0); let (mut db, _tmp) = create_db(); - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); db.put(&key, Column::Metadata, expected.clone()).unwrap(); assert_eq!(db.get(&key, Column::Metadata).unwrap().unwrap(), expected); @@ -1080,7 +1080,7 @@ mod tests { let key: Vec = Vec::with_capacity(0); let (mut db, _tmp) = create_db(); - let expected = Arc::new(vec![]); + let expected = Value::from([]); db.put(&key, Column::Metadata, expected.clone()).unwrap(); assert_eq!(db.get(&key, Column::Metadata).unwrap().unwrap(), expected); @@ -1159,7 +1159,7 @@ mod tests { #[test] fn snapshot_allows_get_entry_after_it_was_removed() { let (mut db, _tmp) = create_db(); - let value = Arc::new(vec![1, 2, 3]); + let value = Value::from([1, 2, 3]); // Given let key_1 = [1; 32]; @@ -1180,12 +1180,12 @@ mod tests { #[test] fn snapshot_allows_correct_iteration_even_after_all_elements_where_removed() { let (mut db, _tmp) = create_db(); - let value = Arc::new(vec![1, 2, 3]); + let value = Value::from([1, 2, 3]); // Given - let key_1 = [1; 32]; - let key_2 = [2; 32]; - let key_3 = [3; 32]; + let key_1 = vec![1; 32]; + let key_2 = vec![2; 32]; + let key_3 = vec![3; 32]; db.put(&key_1, Column::Metadata, value.clone()).unwrap(); db.put(&key_2, Column::Metadata, value.clone()).unwrap(); db.put(&key_3, Column::Metadata, value.clone()).unwrap(); @@ -1208,9 +1208,9 @@ mod tests { assert_eq!( snapshot_iter, vec![ - Ok((key_1.to_vec(), value.clone())), - Ok((key_2.to_vec(), value.clone())), - Ok((key_3.to_vec(), value)) + Ok((key_1, value.clone())), + Ok((key_2, value.clone())), + Ok((key_3, value)) ] ); } diff --git a/crates/services/upgradable-executor/src/instance.rs b/crates/services/upgradable-executor/src/instance.rs index 6c2983b73fd..fc0aa0532ee 100644 --- a/crates/services/upgradable-executor/src/instance.rs +++ b/crates/services/upgradable-executor/src/instance.rs @@ -384,7 +384,7 @@ impl Instance { )); } - caller.write(out_ptr, value.as_slice())?; + caller.write(out_ptr, &value)?; Ok(0) } else { Ok(1) diff --git a/crates/storage/src/codec.rs b/crates/storage/src/codec.rs index 9154112fe55..751a8bf1727 100644 --- a/crates/storage/src/codec.rs +++ b/crates/storage/src/codec.rs @@ -37,7 +37,7 @@ pub trait Encode { /// Returns the serialized object as an [`Value`]. fn encode_as_value(t: &T) -> Value { - Value::new(Self::encode(t).as_bytes().into_owned()) + Value::from(Self::encode(t).as_bytes()) } } diff --git a/crates/storage/src/iter.rs b/crates/storage/src/iter.rs index 35c550851fb..e6d0d2a78e2 100644 --- a/crates/storage/src/iter.rs +++ b/crates/storage/src/iter.rs @@ -219,7 +219,7 @@ where .map_err(|e| crate::Error::Codec(anyhow::anyhow!(e)))?; let value = >::ValueCodec::decode( - value.as_slice(), + &value, ) .map_err(|e| crate::Error::Codec(anyhow::anyhow!(e)))?; Ok((key, value)) diff --git a/crates/storage/src/kv_store.rs b/crates/storage/src/kv_store.rs index 67ab9493c7f..3e7c1359114 100644 --- a/crates/storage/src/kv_store.rs +++ b/crates/storage/src/kv_store.rs @@ -18,7 +18,7 @@ use core::ops::Deref; /// The key of the storage. pub type Key = Vec; /// The value of the storage. It is wrapped into the `Arc` to provide less cloning of massive objects. -pub type Value = alloc::sync::Arc>; +pub type Value = alloc::sync::Arc<[u8]>; /// The pair of key and value from the storage. pub type KVItem = StorageResult<(Key, Value)>; diff --git a/crates/storage/src/structured_storage.rs b/crates/storage/src/structured_storage.rs index 9a76595bdf8..122792cbf8f 100644 --- a/crates/storage/src/structured_storage.rs +++ b/crates/storage/src/structured_storage.rs @@ -44,7 +44,6 @@ use crate::{ StorageSize, StorageWrite, }; -use core::ops::Deref; #[cfg(feature = "std")] use std::{ @@ -382,7 +381,7 @@ where self.inner .get(key_bytes.as_ref(), ::column()) // TODO: Return `Value` instead of cloned `Vec`. - .map(|value| value.map(|value| value.deref().clone())) + .map(|value| value.map(|value| value.to_vec())) } } diff --git a/crates/storage/src/transactional.rs b/crates/storage/src/transactional.rs index 34fd040f512..4494393ad33 100644 --- a/crates/storage/src/transactional.rs +++ b/crates/storage/src/transactional.rs @@ -468,7 +468,7 @@ where self.changes .entry(column.id()) .or_default() - .insert(k, WriteOperation::Insert(Value::new(buf.to_vec()))); + .insert(k, WriteOperation::Insert(Value::from(buf))); Ok(buf.len()) } @@ -661,7 +661,7 @@ mod test { let storage = InMemoryStorage::::default(); let mut view = storage.read_transaction(); let key = vec![0xA, 0xB, 0xC]; - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); view.put(&key, Column::Metadata, expected.clone()).unwrap(); // test let ret = view.get(&key, Column::Metadata).unwrap(); @@ -675,7 +675,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); let key = vec![0xA, 0xB, 0xC]; - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); write.put(&key, Column::Metadata, expected.clone()).unwrap(); write.commit().unwrap(); @@ -692,7 +692,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); let key = vec![0xA, 0xB, 0xC]; - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); write.put(&key, Column::Metadata, expected.clone()).unwrap(); write.commit().unwrap(); @@ -713,13 +713,13 @@ mod test { // setup let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); write .put(&[0xA, 0xB, 0xC], Column::Metadata, expected.clone()) .unwrap(); // test let ret = write - .replace(&[0xA, 0xB, 0xC], Column::Metadata, Arc::new(vec![2, 4, 6])) + .replace(&[0xA, 0xB, 0xC], Column::Metadata, Value::from([2, 4, 6])) .unwrap(); // verify assert_eq!(ret, Some(expected)) @@ -731,7 +731,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); let key = vec![0xA, 0xB, 0xC]; - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); write.put(&key, Column::Metadata, expected.clone()).unwrap(); // test let ret = write.take(&key, Column::Metadata).unwrap(); @@ -747,7 +747,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); let key = vec![0xA, 0xB, 0xC]; - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); write.put(&key, Column::Metadata, expected.clone()).unwrap(); write.commit().unwrap(); @@ -766,7 +766,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); let key = vec![0xA, 0xB, 0xC]; - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); write.put(&key, Column::Metadata, expected.clone()).unwrap(); write.commit().unwrap(); @@ -787,7 +787,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); let key = vec![0xA, 0xB, 0xC]; - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); write.put(&key, Column::Metadata, expected).unwrap(); // test let ret = write.exists(&key, Column::Metadata).unwrap(); @@ -801,7 +801,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); let key = vec![0xA, 0xB, 0xC]; - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); write.put(&key, Column::Metadata, expected).unwrap(); write.commit().unwrap(); @@ -818,7 +818,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); let key = vec![0xA, 0xB, 0xC]; - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); write.put(&key, Column::Metadata, expected).unwrap(); write.commit().unwrap(); @@ -840,7 +840,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); let key = vec![0xA, 0xB, 0xC]; - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); write.put(&key, Column::Metadata, expected.clone()).unwrap(); // test write.commit().unwrap(); @@ -855,7 +855,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); let key = vec![0xA, 0xB, 0xC]; - let expected = Arc::new(vec![1, 2, 3]); + let expected = Value::from([1, 2, 3]); write.put(&key, Column::Metadata, expected).unwrap(); write.commit().unwrap(); @@ -874,7 +874,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); - let expected = Arc::new(vec![]); + let expected = Value::from([]); write.put(&key, Column::Metadata, expected.clone()).unwrap(); assert_eq!( @@ -912,7 +912,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); - let expected = Arc::new(vec![]); + let expected = Value::from([]); write.put(&key, Column::Metadata, expected.clone()).unwrap(); assert_eq!( @@ -950,7 +950,7 @@ mod test { let mut storage = InMemoryStorage::::default(); let mut write = storage.write_transaction(); - let expected = Arc::new(vec![]); + let expected = Value::from([]); write.put(&key, Column::Metadata, expected.clone()).unwrap(); assert_eq!( From b994b8041fb8a68375b1c0668be109d3e594f443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Blankfors?= Date: Fri, 29 Nov 2024 09:15:24 +0100 Subject: [PATCH 2/2] fix: Refactor new test cases after merge --- crates/fuel-core/src/state/rocks_db.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/crates/fuel-core/src/state/rocks_db.rs b/crates/fuel-core/src/state/rocks_db.rs index dfb8d7a9832..8434fb09a6b 100644 --- a/crates/fuel-core/src/state/rocks_db.rs +++ b/crates/fuel-core/src/state/rocks_db.rs @@ -1252,7 +1252,7 @@ mod tests { fn iter_store__reverse_iterator__no_target_prefix() { // Given let (mut db, _tmp) = create_db(); - let value = Arc::new(Vec::new()); + let value = Value::from([]); let key_1 = [1, 1]; let key_2 = [2, 2]; let key_3 = [9, 3]; @@ -1281,7 +1281,7 @@ mod tests { fn iter_store__reverse_iterator__target_prefix_at_the_middle() { // Given let (mut db, _tmp) = create_db(); - let value = Arc::new(Vec::new()); + let value = Value::from([]); let key_1 = [1, 1]; let key_2 = [2, 2]; let key_3 = [2, 3]; @@ -1310,7 +1310,7 @@ mod tests { fn iter_store__reverse_iterator__target_prefix_at_the_end() { // Given let (mut db, _tmp) = create_db(); - let value = Arc::new(Vec::new()); + let value = Value::from([]); let key_1 = [1, 1]; let key_2 = [2, 2]; let key_3 = [2, 3]; @@ -1337,7 +1337,7 @@ mod tests { fn iter_store__reverse_iterator__target_prefix_at_the_end__overflow() { // Given let (mut db, _tmp) = create_db(); - let value = Arc::new(Vec::new()); + let value = Value::from([]); let key_1 = [1, 1]; let key_2 = [255, 254]; let key_3 = [255, 255];