From abd7f6b090c92bd6fd315a7abfdff6b6f4b931fc Mon Sep 17 00:00:00 2001 From: carllin Date: Wed, 15 May 2019 18:28:23 -0700 Subject: [PATCH] Change slot_meta_iterator() to return an iterator not a cursor (#4303) automerge --- core/src/blocktree.rs | 16 ++++++++++------ core/src/repair_service.rs | 10 +++++----- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/core/src/blocktree.rs b/core/src/blocktree.rs index b4faccad39..0d00c9d6de 100644 --- a/core/src/blocktree.rs +++ b/core/src/blocktree.rs @@ -1,7 +1,6 @@ //! The `block_tree` module provides functions for parallel verification of the //! Proof of History ledger as well as iterative read, append write, and random //! access read to a persistent file-based ledger. - use crate::entry::Entry; use crate::erasure::{self, Session}; use crate::packet::{Blob, SharedBlob, BLOB_HEADER_SIZE}; @@ -47,7 +46,7 @@ macro_rules! db_imports { pub use db::columns; pub type Database = db::Database<$db>; - pub type Cursor = db::Cursor<$db, C>; + pub type Cursor = db::Cursor<$db, C>; pub type LedgerColumn = db::LedgerColumn<$db, C>; pub type WriteBatch = db::WriteBatch<$db>; type BatchProcessor = db::BatchProcessor<$db>; @@ -183,10 +182,15 @@ impl Blocktree { self.orphans_cf.get(slot) } - pub fn slot_meta_iterator(&self, slot: u64) -> Result> { - let mut db_iterator = self.db.cursor::()?; - db_iterator.seek(slot); - Ok(db_iterator) + pub fn slot_meta_iterator(&self, slot: u64) -> Result> { + let meta_iter = self.db.iter::(Some(slot))?; + Ok(meta_iter.map(|(slot, slot_meta_bytes)| { + ( + slot, + deserialize(&slot_meta_bytes) + .unwrap_or_else(|_| panic!("Could not deserialize SlotMeta for slot {}", slot)), + ) + })) } pub fn slot_data_iterator( diff --git a/core/src/repair_service.rs b/core/src/repair_service.rs index 8b34f99e4f..3d7dc7cc91 100644 --- a/core/src/repair_service.rs +++ b/core/src/repair_service.rs @@ -285,17 +285,17 @@ impl RepairService { let last_confirmed_epoch = epoch_schedule.get_stakers_epoch(root); let last_epoch_slot = epoch_schedule.get_last_slot_in_epoch(last_confirmed_epoch); - let mut meta_iter = blocktree + let meta_iter = blocktree .slot_meta_iterator(root + 1) .expect("Couldn't get db iterator"); - while meta_iter.valid() && meta_iter.key().unwrap() <= last_epoch_slot { - let current_slot = meta_iter.key().unwrap(); - let meta = meta_iter.value().unwrap(); + for (current_slot, meta) in meta_iter { + if current_slot > last_epoch_slot { + break; + } if meta.is_full() { slots_in_gossip.insert(current_slot); } - meta_iter.next(); } }