diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index bfaa593ae402e5..e83b2ee4d43a8c 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -5377,7 +5377,7 @@ pub mod tests { for (i, key) in keys.iter_mut().enumerate().take(TEST_PUT_ENTRY_COUNT) { *key = u64::try_from(i).unwrap(); } - let values = blockstore.meta_cf.multi_get(keys.into_iter()); + let values = blockstore.meta_cf.multi_get(keys); for (i, value) in values.iter().enumerate().take(TEST_PUT_ENTRY_COUNT) { let k = u64::try_from(i).unwrap(); assert_eq!( diff --git a/ledger/src/blockstore_db.rs b/ledger/src/blockstore_db.rs index cefa0ec1db0664..76e777c2d8513c 100644 --- a/ledger/src/blockstore_db.rs +++ b/ledger/src/blockstore_db.rs @@ -650,21 +650,15 @@ impl Rocks { &self, cf: &ColumnFamily, keys: I, - ) -> Vec>> + ) -> impl Iterator>> where K: AsRef<[u8]> + 'a + ?Sized, I: IntoIterator, { - let values = self - .db - .batched_multi_get_cf(cf, keys, false) + self.db + .batched_multi_get_cf(cf, keys, /*sorted_input:*/ false) .into_iter() - .map(|result| match result { - Ok(opt) => Ok(opt), - Err(e) => Err(BlockstoreError::RocksDb(e)), - }) - .collect::>(); - values + .map(|out| out.map_err(BlockstoreError::RocksDb)) } fn delete_cf(&self, cf: &ColumnFamily, key: &[u8]) -> Result<()> { @@ -1574,11 +1568,11 @@ where result } - pub fn multi_get_bytes( - &self, - keys: impl Iterator, - ) -> Vec>>> { - let rocks_keys: Vec<_> = keys.map(|key| C::key(key)).collect(); + pub(crate) fn multi_get_bytes(&self, keys: I) -> Vec>>> + where + I: IntoIterator, + { + let keys: Vec<_> = keys.into_iter().map(C::key).collect(); { let is_perf_enabled = maybe_enable_rocksdb_perf( self.column_options.rocks_perf_sample_interval, @@ -1586,15 +1580,8 @@ where ); let result = self .backend - .multi_get_cf(self.handle(), rocks_keys.iter()) - .into_iter() - .map(|r| match r { - Ok(opt) => match opt { - Some(pinnable_slice) => Ok(Some(pinnable_slice.as_ref().to_vec())), - None => Ok(None), - }, - Err(e) => Err(e), - }) + .multi_get_cf(self.handle(), &keys) + .map(|out| Ok(out?.as_deref().map(<[u8]>::to_vec))) .collect::>>>(); if let Some(op_start_instant) = is_perf_enabled { // use multi-get instead @@ -1693,8 +1680,11 @@ impl LedgerColumn where C: TypedColumn + ColumnName, { - pub fn multi_get(&self, keys: impl Iterator) -> Vec>> { - let rocks_keys: Vec<_> = keys.map(|key| C::key(key)).collect(); + pub(crate) fn multi_get(&self, keys: I) -> Vec>> + where + I: IntoIterator, + { + let keys: Vec<_> = keys.into_iter().map(C::key).collect(); { let is_perf_enabled = maybe_enable_rocksdb_perf( self.column_options.rocks_perf_sample_interval, @@ -1702,15 +1692,8 @@ where ); let result = self .backend - .multi_get_cf(self.handle(), rocks_keys.iter()) - .into_iter() - .map(|r| match r { - Ok(opt) => match opt { - Some(pinnable_slice) => Ok(Some(deserialize(pinnable_slice.as_ref())?)), - None => Ok(None), - }, - Err(e) => Err(e), - }) + .multi_get_cf(self.handle(), &keys) + .map(|out| Ok(out?.as_deref().map(deserialize).transpose()?)) .collect::>>>(); if let Some(op_start_instant) = is_perf_enabled { // use multi-get instead