Skip to content

Commit

Permalink
Plug getConfirmedSignaturesForAddress2 into bigtable storage
Browse files Browse the repository at this point in the history
  • Loading branch information
mvines committed Aug 6, 2020
1 parent 8d1400d commit 4222932
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 37 deletions.
27 changes: 24 additions & 3 deletions core/src/rpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -839,8 +839,8 @@ impl JsonRpcRequestProcessor {
pub fn get_confirmed_signatures_for_address2(
&self,
address: Pubkey,
before: Option<Signature>,
limit: usize,
mut before: Option<Signature>,
mut limit: usize,
) -> Result<Vec<RpcConfirmedTransactionStatusWithSignature>> {
if self.config.enable_rpc_transaction_history {
let highest_confirmed_root = self
Expand All @@ -849,7 +849,7 @@ impl JsonRpcRequestProcessor {
.unwrap()
.highest_confirmed_root();

let results = self
let mut results = self
.blockstore
.get_confirmed_signatures_for_address2(
address,
Expand All @@ -859,6 +859,27 @@ impl JsonRpcRequestProcessor {
)
.map_err(|err| Error::invalid_params(format!("{}", err)))?;

if results.len() < limit {
if let Some(bigtable_ledger_storage) = &self.bigtable_ledger_storage {
if !results.is_empty() {
limit -= results.len();
before = results.last().map(|x| x.signature);
}

let mut bigtable_results = self
.runtime_handle
.block_on(
bigtable_ledger_storage.get_confirmed_signatures_for_address(
&address,
before.as_ref(),
limit,
),
)
.map_err(|err| Error::invalid_params(format!("{}", err)))?;
results.append(&mut bigtable_results)
}
}

Ok(results.into_iter().map(|x| x.into()).collect())
} else {
Ok(vec![])
Expand Down
56 changes: 30 additions & 26 deletions ledger-tool/src/bigtable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -308,30 +308,39 @@ async fn confirm(signature: &Signature, verbose: bool) -> Result<(), Box<dyn std

pub async fn transaction_history(
address: &Pubkey,
limit: usize,
before: Option<&Signature>,
mut limit: usize,
mut before: Option<Signature>,
verbose: bool,
) -> Result<(), Box<dyn std::error::Error>> {
let bigtable = solana_storage_bigtable::LedgerStorage::new(true).await?;

let results = bigtable
.get_confirmed_signatures_for_address(address, before, limit)
.await?;
while limit > 0 {
let results = bigtable
.get_confirmed_signatures_for_address(address, before.as_ref(), limit.min(1000))
.await?;

for (signature, slot, memo, err) in results {
if verbose {
println!(
"{}, slot={}, memo=\"{}\", status={}",
signature,
slot,
memo.unwrap_or_else(|| "".to_string()),
match err {
None => "Confirmed".to_string(),
Some(err) => format!("Failed: {:?}", err),
}
);
} else {
println!("{}", signature);
if results.is_empty() {
break;
}
before = Some(results.last().unwrap().signature);
assert!(limit >= results.len());
limit = limit.saturating_sub(results.len());

for result in results {
if verbose {
println!(
"{}, slot={}, memo=\"{}\", status={}",
result.signature,
result.slot,
result.memo.unwrap_or_else(|| "".to_string()),
match result.err {
None => "Confirmed".to_string(),
Some(err) => format!("Failed: {:?}", err),
}
);
} else {
println!("{}", result.signature);
}
}
}
Ok(())
Expand Down Expand Up @@ -462,7 +471,7 @@ impl BigTableSubCommand for App<'_, '_> {
.value_name("LIMIT")
.validator(is_slot)
.index(2)
.default_value("1000")
.default_value("18446744073709551615")
.help("Maximum number of transaction signatures to return"),
)
.arg(
Expand Down Expand Up @@ -531,12 +540,7 @@ pub fn bigtable_process_command(ledger_path: &Path, matches: &ArgMatches<'_>) {
.map(|signature| signature.parse().expect("Invalid signature"));
let verbose = arg_matches.is_present("verbose");

runtime.block_on(transaction_history(
&address,
limit,
before.as_ref(),
verbose,
))
runtime.block_on(transaction_history(&address, limit, before, verbose))
}
_ => unreachable!(),
};
Expand Down
17 changes: 9 additions & 8 deletions storage-bigtable/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,9 @@ use solana_sdk::{
transaction::{Transaction, TransactionError},
};
use solana_transaction_status::{
ConfirmedBlock, ConfirmedTransaction, EncodedTransaction, Rewards, TransactionStatus,
TransactionWithStatusMeta, UiTransactionEncoding, UiTransactionStatusMeta,
ConfirmedBlock, ConfirmedTransaction, ConfirmedTransactionStatusWithSignature,
EncodedTransaction, Rewards, TransactionStatus, TransactionWithStatusMeta,
UiTransactionEncoding, UiTransactionStatusMeta,
};
use std::{
collections::HashMap,
Expand Down Expand Up @@ -365,7 +366,7 @@ impl LedgerStorage {
address: &Pubkey,
before_signature: Option<&Signature>,
limit: usize,
) -> Result<Vec<(Signature, Slot, Option<String>, Option<TransactionError>)>> {
) -> Result<Vec<ConfirmedTransactionStatusWithSignature>> {
let mut bigtable = self.connection.client();
let address_prefix = format!("{}/", address);

Expand Down Expand Up @@ -414,12 +415,12 @@ impl LedgerStorage {
.into_iter()
.skip(first_transaction_index as usize)
{
infos.push((
tx_by_addr_info.signature,
infos.push(ConfirmedTransactionStatusWithSignature {
signature: tx_by_addr_info.signature,
slot,
tx_by_addr_info.memo,
tx_by_addr_info.err,
));
err: tx_by_addr_info.err,
memo: tx_by_addr_info.memo,
});
if infos.len() >= limit {
break 'outer;
}
Expand Down

0 comments on commit 4222932

Please sign in to comment.