Add slot info to Bank::get_signature_confirmation_status (#9018)
This commit is contained in:
parent
4b4819cd07
commit
a0ffcc61ae
@ -19,7 +19,7 @@ use solana_ledger::{
|
|||||||
bank_forks::BankForks, blockstore::Blockstore, rooted_slot_iterator::RootedSlotIterator,
|
bank_forks::BankForks, blockstore::Blockstore, rooted_slot_iterator::RootedSlotIterator,
|
||||||
};
|
};
|
||||||
use solana_perf::packet::PACKET_DATA_SIZE;
|
use solana_perf::packet::PACKET_DATA_SIZE;
|
||||||
use solana_runtime::bank::Bank;
|
use solana_runtime::{bank::Bank, status_cache::SignatureConfirmationStatus};
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
clock::{Slot, UnixTimestamp},
|
clock::{Slot, UnixTimestamp},
|
||||||
commitment_config::{CommitmentConfig, CommitmentLevel},
|
commitment_config::{CommitmentConfig, CommitmentLevel},
|
||||||
@ -203,7 +203,9 @@ impl JsonRpcRequestProcessor {
|
|||||||
Ok(sig) => {
|
Ok(sig) => {
|
||||||
let status = bank.get_signature_confirmation_status(&sig);
|
let status = bank.get_signature_confirmation_status(&sig);
|
||||||
match status {
|
match status {
|
||||||
Some((_, result)) => new_response(bank, result.is_ok()),
|
Some(SignatureConfirmationStatus { status, .. }) => {
|
||||||
|
new_response(bank, status.is_ok())
|
||||||
|
}
|
||||||
None => new_response(bank, false),
|
None => new_response(bank, false),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -227,10 +229,16 @@ impl JsonRpcRequestProcessor {
|
|||||||
) -> Option<RpcSignatureConfirmation> {
|
) -> Option<RpcSignatureConfirmation> {
|
||||||
self.bank(commitment)
|
self.bank(commitment)
|
||||||
.get_signature_confirmation_status(&signature)
|
.get_signature_confirmation_status(&signature)
|
||||||
.map(|(confirmations, status)| RpcSignatureConfirmation {
|
.map(
|
||||||
|
|SignatureConfirmationStatus {
|
||||||
confirmations,
|
confirmations,
|
||||||
status,
|
status,
|
||||||
})
|
..
|
||||||
|
}| RpcSignatureConfirmation {
|
||||||
|
confirmations,
|
||||||
|
status,
|
||||||
|
},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_slot(&self, commitment: Option<CommitmentConfig>) -> Result<u64> {
|
fn get_slot(&self, commitment: Option<CommitmentConfig>) -> Result<u64> {
|
||||||
|
@ -11,7 +11,9 @@ use rand::{Rng, SeedableRng};
|
|||||||
use rand_chacha::ChaChaRng;
|
use rand_chacha::ChaChaRng;
|
||||||
use solana_chacha_cuda::chacha_cuda::chacha_cbc_encrypt_file_many_keys;
|
use solana_chacha_cuda::chacha_cuda::chacha_cbc_encrypt_file_many_keys;
|
||||||
use solana_ledger::{bank_forks::BankForks, blockstore::Blockstore};
|
use solana_ledger::{bank_forks::BankForks, blockstore::Blockstore};
|
||||||
use solana_runtime::{bank::Bank, storage_utils::archiver_accounts};
|
use solana_runtime::{
|
||||||
|
bank::Bank, status_cache::SignatureConfirmationStatus, storage_utils::archiver_accounts,
|
||||||
|
};
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
account::Account,
|
account::Account,
|
||||||
account_utils::StateMut,
|
account_utils::StateMut,
|
||||||
@ -343,8 +345,13 @@ impl StorageStage {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.working_bank()
|
.working_bank()
|
||||||
.get_signature_confirmation_status(signature);
|
.get_signature_confirmation_status(signature);
|
||||||
if let Some((confirmations, res)) = response {
|
if let Some(SignatureConfirmationStatus {
|
||||||
if res.is_ok() {
|
confirmations,
|
||||||
|
status,
|
||||||
|
..
|
||||||
|
}) = response
|
||||||
|
{
|
||||||
|
if status.is_ok() {
|
||||||
if confirmed_blocks != confirmations {
|
if confirmed_blocks != confirmations {
|
||||||
now = Instant::now();
|
now = Instant::now();
|
||||||
confirmed_blocks = confirmations;
|
confirmed_blocks = confirmations;
|
||||||
|
@ -13,7 +13,7 @@ use crate::{
|
|||||||
deserialize_atomicbool, deserialize_atomicu64, serialize_atomicbool, serialize_atomicu64,
|
deserialize_atomicbool, deserialize_atomicu64, serialize_atomicbool, serialize_atomicu64,
|
||||||
},
|
},
|
||||||
stakes::Stakes,
|
stakes::Stakes,
|
||||||
status_cache::{SlotDelta, StatusCache},
|
status_cache::{SignatureConfirmationStatus, SlotDelta, StatusCache},
|
||||||
storage_utils,
|
storage_utils,
|
||||||
storage_utils::StorageAccounts,
|
storage_utils::StorageAccounts,
|
||||||
system_instruction_processor::{get_system_account_kind, SystemAccountKind},
|
system_instruction_processor::{get_system_account_kind, SystemAccountKind},
|
||||||
@ -1826,14 +1826,14 @@ impl Bank {
|
|||||||
pub fn get_signature_confirmation_status(
|
pub fn get_signature_confirmation_status(
|
||||||
&self,
|
&self,
|
||||||
signature: &Signature,
|
signature: &Signature,
|
||||||
) -> Option<(usize, Result<()>)> {
|
) -> Option<SignatureConfirmationStatus<Result<()>>> {
|
||||||
let rcache = self.src.status_cache.read().unwrap();
|
let rcache = self.src.status_cache.read().unwrap();
|
||||||
rcache.get_signature_status_slow(signature, &self.ancestors)
|
rcache.get_signature_status_slow(signature, &self.ancestors)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_signature_status(&self, signature: &Signature) -> Option<Result<()>> {
|
pub fn get_signature_status(&self, signature: &Signature) -> Option<Result<()>> {
|
||||||
self.get_signature_confirmation_status(signature)
|
self.get_signature_confirmation_status(signature)
|
||||||
.map(|v| v.1)
|
.map(|v| v.status)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn has_signature(&self, signature: &Signature) -> bool {
|
pub fn has_signature(&self, signature: &Signature) -> bool {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use crate::bank::Bank;
|
use crate::{bank::Bank, status_cache::SignatureConfirmationStatus};
|
||||||
use solana_sdk::{
|
use solana_sdk::{
|
||||||
account::Account,
|
account::Account,
|
||||||
client::{AsyncClient, Client, SyncClient},
|
client::{AsyncClient, Client, SyncClient},
|
||||||
@ -188,8 +188,13 @@ impl SyncClient for BankClient {
|
|||||||
let mut confirmed_blocks = 0;
|
let mut confirmed_blocks = 0;
|
||||||
loop {
|
loop {
|
||||||
let response = self.bank.get_signature_confirmation_status(signature);
|
let response = self.bank.get_signature_confirmation_status(signature);
|
||||||
if let Some((confirmations, res)) = response {
|
if let Some(SignatureConfirmationStatus {
|
||||||
if res.is_ok() {
|
confirmations,
|
||||||
|
status,
|
||||||
|
..
|
||||||
|
}) = response
|
||||||
|
{
|
||||||
|
if status.is_ok() {
|
||||||
if confirmed_blocks != confirmations {
|
if confirmed_blocks != confirmations {
|
||||||
now = Instant::now();
|
now = Instant::now();
|
||||||
confirmed_blocks = confirmations;
|
confirmed_blocks = confirmations;
|
||||||
|
@ -32,6 +32,13 @@ type SlotDeltaMap<T> = HashMap<Slot, SignatureStatus<T>>;
|
|||||||
// construct a new one. Usually derived from a status cache's `SlotDeltaMap`
|
// construct a new one. Usually derived from a status cache's `SlotDeltaMap`
|
||||||
pub type SlotDelta<T> = (Slot, bool, SignatureStatus<T>);
|
pub type SlotDelta<T> = (Slot, bool, SignatureStatus<T>);
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq)]
|
||||||
|
pub struct SignatureConfirmationStatus<T> {
|
||||||
|
pub slot: Slot,
|
||||||
|
pub confirmations: usize,
|
||||||
|
pub status: T,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct StatusCache<T: Serialize + Clone> {
|
pub struct StatusCache<T: Serialize + Clone> {
|
||||||
cache: StatusMap<T>,
|
cache: StatusMap<T>,
|
||||||
@ -100,7 +107,7 @@ impl<T: Serialize + Clone> StatusCache<T> {
|
|||||||
&self,
|
&self,
|
||||||
sig: &Signature,
|
sig: &Signature,
|
||||||
ancestors: &HashMap<Slot, usize>,
|
ancestors: &HashMap<Slot, usize>,
|
||||||
) -> Option<(usize, T)> {
|
) -> Option<SignatureConfirmationStatus<T>> {
|
||||||
trace!("get_signature_status_slow");
|
trace!("get_signature_status_slow");
|
||||||
let mut keys = vec![];
|
let mut keys = vec![];
|
||||||
let mut val: Vec<_> = self.cache.iter().map(|(k, _)| *k).collect();
|
let mut val: Vec<_> = self.cache.iter().map(|(k, _)| *k).collect();
|
||||||
@ -112,8 +119,18 @@ impl<T: Serialize + Clone> StatusCache<T> {
|
|||||||
trace!("get_signature_status_slow: got {}", forkid);
|
trace!("get_signature_status_slow: got {}", forkid);
|
||||||
return ancestors
|
return ancestors
|
||||||
.get(&forkid)
|
.get(&forkid)
|
||||||
.map(|id| (*id, res.clone()))
|
.map(|id| SignatureConfirmationStatus {
|
||||||
.or_else(|| Some((ancestors.len(), res)));
|
slot: forkid,
|
||||||
|
confirmations: *id,
|
||||||
|
status: res.clone(),
|
||||||
|
})
|
||||||
|
.or_else(|| {
|
||||||
|
Some(SignatureConfirmationStatus {
|
||||||
|
slot: forkid,
|
||||||
|
confirmations: ancestors.len(),
|
||||||
|
status: res,
|
||||||
|
})
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
@ -272,7 +289,11 @@ mod tests {
|
|||||||
);
|
);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
status_cache.get_signature_status_slow(&sig, &ancestors),
|
status_cache.get_signature_status_slow(&sig, &ancestors),
|
||||||
Some((1, ()))
|
Some(SignatureConfirmationStatus {
|
||||||
|
slot: 0,
|
||||||
|
confirmations: 1,
|
||||||
|
status: ()
|
||||||
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,7 +338,11 @@ mod tests {
|
|||||||
status_cache.add_root(0);
|
status_cache.add_root(0);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
status_cache.get_signature_status_slow(&sig, &ancestors),
|
status_cache.get_signature_status_slow(&sig, &ancestors),
|
||||||
Some((ancestors.len(), ()))
|
Some(SignatureConfirmationStatus {
|
||||||
|
slot: 0,
|
||||||
|
confirmations: ancestors.len(),
|
||||||
|
status: ()
|
||||||
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user