From 09e7782d76afb917996a67a2dcdcd67e5d93da60 Mon Sep 17 00:00:00 2001 From: sakridge Date: Wed, 13 Oct 2021 00:55:19 -0700 Subject: [PATCH] Refactor code to get block signatures in get_confirmed_signatures_for_address2 (#20575) * Refactor get_confirmed_signatures_for_address2 * Move blockstore benches to ledger where they belong --- core/Cargo.toml | 3 - ledger/Cargo.toml | 3 + {core => ledger}/benches/blockstore.rs | 0 ledger/src/blockstore.rs | 83 ++++++++++---------------- 4 files changed, 34 insertions(+), 55 deletions(-) rename {core => ledger}/benches/blockstore.rs (100%) diff --git a/core/Cargo.toml b/core/Cargo.toml index 1d2f79b90a..63604b019e 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -84,9 +84,6 @@ rustc_version = "0.4" [[bench]] name = "banking_stage" -[[bench]] -name = "blockstore" - [[bench]] name = "cluster_info" diff --git a/ledger/Cargo.toml b/ledger/Cargo.toml index 8c26165bde..05fef1404f 100644 --- a/ledger/Cargo.toml +++ b/ledger/Cargo.toml @@ -80,5 +80,8 @@ name = "solana_ledger" [[bench]] name = "sigverify_shreds" +[[bench]] +name = "blockstore" + [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] diff --git a/core/benches/blockstore.rs b/ledger/benches/blockstore.rs similarity index 100% rename from core/benches/blockstore.rs rename to ledger/benches/blockstore.rs diff --git a/ledger/src/blockstore.rs b/ledger/src/blockstore.rs index f385c1b65b..d60fcda6ba 100644 --- a/ledger/src/blockstore.rs +++ b/ledger/src/blockstore.rs @@ -2396,6 +2396,35 @@ impl Blockstore { .map(|signatures| signatures.iter().map(|(_, signature)| *signature).collect()) } + fn get_sorted_block_signatures(&self, slot: Slot) -> Result> { + let block = self.get_complete_block(slot, false).map_err(|err| { + BlockstoreError::Io(IoError::new( + ErrorKind::Other, + format!("Unable to get block: {}", err), + )) + })?; + + // Load all signatures for the block + let mut slot_signatures: Vec<_> = block + .transactions + .into_iter() + .filter_map(|transaction_with_meta| { + transaction_with_meta + .transaction + .signatures + .into_iter() + .next() + }) + .collect(); + + // Reverse sort signatures as a way to entire a stable ordering within a slot, as + // the AddressSignatures column is ordered by signatures within a slot, + // not by block ordering + slot_signatures.sort_unstable_by(|a, b| b.cmp(a)); + + Ok(slot_signatures) + } + pub fn get_confirmed_signatures_for_address2( &self, address: Pubkey, @@ -2429,32 +2458,7 @@ impl Blockstore { match transaction_status { None => return Ok(vec![]), Some((slot, _)) => { - let block = self.get_complete_block(slot, false).map_err(|err| { - BlockstoreError::Io(IoError::new( - ErrorKind::Other, - format!("Unable to get block: {}", err), - )) - })?; - - // Load all signatures for the block - let mut slot_signatures: Vec<_> = block - .transactions - .into_iter() - .filter_map(|transaction_with_meta| { - transaction_with_meta - .transaction - .signatures - .into_iter() - .next() - }) - .collect(); - - // Sort signatures as a way to entire a stable ordering within a slot, as - // the AddressSignatures column is ordered by signatures within a slot, - // not by block ordering - slot_signatures.sort(); - slot_signatures.reverse(); - + let mut slot_signatures = self.get_sorted_block_signatures(slot)?; if let Some(pos) = slot_signatures.iter().position(|&x| x == before) { slot_signatures.truncate(pos + 1); } @@ -2480,32 +2484,7 @@ impl Blockstore { match transaction_status { None => (0, HashSet::new()), Some((slot, _)) => { - let block = self.get_complete_block(slot, false).map_err(|err| { - BlockstoreError::Io(IoError::new( - ErrorKind::Other, - format!("Unable to get block: {}", err), - )) - })?; - - // Load all signatures for the block - let mut slot_signatures: Vec<_> = block - .transactions - .into_iter() - .filter_map(|transaction_with_meta| { - transaction_with_meta - .transaction - .signatures - .into_iter() - .next() - }) - .collect(); - - // Sort signatures as a way to entire a stable ordering within a slot, as - // the AddressSignatures column is ordered by signatures within a slot, - // not by block ordering - slot_signatures.sort(); - slot_signatures.reverse(); - + let mut slot_signatures = self.get_sorted_block_signatures(slot)?; if let Some(pos) = slot_signatures.iter().position(|&x| x == until) { slot_signatures = slot_signatures.split_off(pos); }