Exit early on BigTable error (#22200)

This commit is contained in:
Tyera Eulberg 2021-12-31 13:36:57 -07:00 committed by GitHub
parent 8a43e2d889
commit 0b1b36f088
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 41 additions and 29 deletions

View File

@ -73,10 +73,12 @@ use {
send_transaction_service::{SendTransactionService, TransactionInfo}, send_transaction_service::{SendTransactionService, TransactionInfo},
tpu_info::NullTpuInfo, tpu_info::NullTpuInfo,
}, },
solana_storage_bigtable::Error as StorageError,
solana_streamer::socket::SocketAddrSpace, solana_streamer::socket::SocketAddrSpace,
solana_transaction_status::{ solana_transaction_status::{
ConfirmedBlock, EncodedConfirmedTransaction, Reward, RewardType, ConfirmedBlock, ConfirmedTransactionStatusWithSignature, EncodedConfirmedTransaction,
TransactionConfirmationStatus, TransactionStatus, UiConfirmedBlock, UiTransactionEncoding, Reward, RewardType, TransactionConfirmationStatus, TransactionStatus, UiConfirmedBlock,
UiTransactionEncoding,
}, },
solana_vote_program::vote_state::{VoteState, MAX_LOCKOUT_HISTORY}, solana_vote_program::vote_state::{VoteState, MAX_LOCKOUT_HISTORY},
spl_token::{ spl_token::{
@ -1470,6 +1472,29 @@ impl JsonRpcRequestProcessor {
.get_confirmed_signatures_for_address2(address, highest_slot, before, until, limit) .get_confirmed_signatures_for_address2(address, highest_slot, before, until, limit)
.map_err(|err| Error::invalid_params(format!("{}", err)))?; .map_err(|err| Error::invalid_params(format!("{}", err)))?;
let map_results = |results: Vec<ConfirmedTransactionStatusWithSignature>| {
results
.into_iter()
.map(|x| {
let mut item: RpcConfirmedTransactionStatusWithSignature = x.into();
if item.slot <= highest_confirmed_root {
item.confirmation_status =
Some(TransactionConfirmationStatus::Finalized);
} else {
item.confirmation_status =
Some(TransactionConfirmationStatus::Confirmed);
if item.block_time.is_none() {
let r_bank_forks = self.bank_forks.read().unwrap();
item.block_time = r_bank_forks
.get(item.slot)
.map(|bank| bank.clock().unix_timestamp);
}
}
item
})
.collect()
};
if results.len() < limit { if results.len() < limit {
if let Some(bigtable_ledger_storage) = &self.bigtable_ledger_storage { if let Some(bigtable_ledger_storage) = &self.bigtable_ledger_storage {
let mut bigtable_before = before; let mut bigtable_before = before;
@ -1481,16 +1506,20 @@ impl JsonRpcRequestProcessor {
// If the oldest address-signature found in Blockstore has not yet been // If the oldest address-signature found in Blockstore has not yet been
// uploaded to long-term storage, modify the storage query to return all latest // uploaded to long-term storage, modify the storage query to return all latest
// signatures to prevent erroring on RowNotFound. This can race with upload. // signatures to prevent erroring on RowNotFound. This can race with upload.
if found_before if found_before && bigtable_before.is_some() {
&& bigtable_before.is_some() match bigtable_ledger_storage
&& bigtable_ledger_storage .get_signature_status(&bigtable_before.unwrap())
.get_confirmed_transaction(&bigtable_before.unwrap())
.await .await
.ok() {
.flatten() Err(StorageError::SignatureNotFound) => {
.is_none() bigtable_before = None;
{ }
bigtable_before = None; Err(err) => {
warn!("{:?}", err);
return Ok(map_results(results));
}
Ok(_) => {}
}
} }
let bigtable_results = bigtable_ledger_storage let bigtable_results = bigtable_ledger_storage
@ -1523,24 +1552,7 @@ impl JsonRpcRequestProcessor {
} }
} }
Ok(results Ok(map_results(results))
.into_iter()
.map(|x| {
let mut item: RpcConfirmedTransactionStatusWithSignature = x.into();
if item.slot <= highest_confirmed_root {
item.confirmation_status = Some(TransactionConfirmationStatus::Finalized);
} else {
item.confirmation_status = Some(TransactionConfirmationStatus::Confirmed);
if item.block_time.is_none() {
let r_bank_forks = self.bank_forks.read().unwrap();
item.block_time = r_bank_forks
.get(item.slot)
.map(|bank| bank.clock().unix_timestamp);
}
}
item
})
.collect())
} else { } else {
Err(RpcCustomError::TransactionHistoryNotAvailable.into()) Err(RpcCustomError::TransactionHistoryNotAvailable.into())
} }