Clean up rpc module (#10812) (#10815)

* Clean up rpc module

* Simplify getting bank

(cherry picked from commit 62b873b054)

Co-authored-by: Greg Fitzgerald <greg@solana.com>
This commit is contained in:
mergify[bot]
2020-06-26 01:59:06 +00:00
committed by GitHub
parent f4d70e78b6
commit cefe46e981
2 changed files with 69 additions and 76 deletions

View File

@ -85,21 +85,23 @@ impl JsonRpcRequestProcessor {
debug!("RPC commitment_config: {:?}", commitment);
let r_bank_forks = self.bank_forks.read().unwrap();
match commitment {
Some(commitment_config) if commitment_config.commitment == CommitmentLevel::Recent => {
let commitment_level = match commitment {
None => CommitmentLevel::Max,
Some(config) => config.commitment,
};
match commitment_level {
CommitmentLevel::Recent => {
let bank = r_bank_forks.working_bank();
debug!("RPC using working_bank: {:?}", bank.slot());
Ok(bank)
}
Some(commitment_config) if commitment_config.commitment == CommitmentLevel::Root => {
CommitmentLevel::Root => {
let slot = r_bank_forks.root();
debug!("RPC using node root: {:?}", slot);
Ok(r_bank_forks.get(slot).cloned().unwrap())
}
Some(commitment_config)
if commitment_config.commitment == CommitmentLevel::Single
|| commitment_config.commitment == CommitmentLevel::SingleGossip =>
{
CommitmentLevel::Single | CommitmentLevel::SingleGossip => {
let slot = self
.block_commitment_cache
.read()
@ -108,7 +110,7 @@ impl JsonRpcRequestProcessor {
debug!("RPC using confirmed slot: {:?}", slot);
Ok(r_bank_forks.get(slot).cloned().unwrap())
}
_ => {
CommitmentLevel::Max => {
let cluster_root = self
.block_commitment_cache
.read()
@ -152,11 +154,11 @@ impl JsonRpcRequestProcessor {
pub fn get_account_info(
&self,
pubkey: Result<Pubkey>,
pubkey: &Pubkey,
commitment: Option<CommitmentConfig>,
) -> Result<RpcResponse<Option<RpcAccount>>> {
let bank = &*self.bank(commitment)?;
pubkey.and_then(|key| new_response(bank, bank.get_account(&key).map(RpcAccount::encode)))
let bank = self.bank(commitment)?;
new_response(&bank, bank.get_account(pubkey).map(RpcAccount::encode))
}
pub fn get_minimum_balance_for_rent_exemption(
@ -211,26 +213,27 @@ impl JsonRpcRequestProcessor {
pub fn get_epoch_schedule(&self) -> Result<EpochSchedule> {
// Since epoch schedule data comes from the genesis config, any commitment level should be
// fine
Ok(*self.bank(Some(CommitmentConfig::root()))?.epoch_schedule())
let bank = self.bank(Some(CommitmentConfig::root()))?;
Ok(*bank.epoch_schedule())
}
pub fn get_balance(
&self,
pubkey: Result<Pubkey>,
pubkey: &Pubkey,
commitment: Option<CommitmentConfig>,
) -> Result<RpcResponse<u64>> {
let bank = &*self.bank(commitment)?;
pubkey.and_then(|key| new_response(bank, bank.get_balance(&key)))
let bank = self.bank(commitment)?;
new_response(&bank, bank.get_balance(pubkey))
}
fn get_recent_blockhash(
&self,
commitment: Option<CommitmentConfig>,
) -> Result<RpcResponse<RpcBlockhashFeeCalculator>> {
let bank = &*self.bank(commitment)?;
let bank = self.bank(commitment)?;
let (blockhash, fee_calculator) = bank.confirmed_last_blockhash();
new_response(
bank,
&bank,
RpcBlockhashFeeCalculator {
blockhash: blockhash.to_string(),
fee_calculator,
@ -239,13 +242,13 @@ impl JsonRpcRequestProcessor {
}
fn get_fees(&self, commitment: Option<CommitmentConfig>) -> Result<RpcResponse<RpcFees>> {
let bank = &*self.bank(commitment)?;
let bank = self.bank(commitment)?;
let (blockhash, fee_calculator) = bank.confirmed_last_blockhash();
let last_valid_slot = bank
.get_blockhash_last_valid_slot(&blockhash)
.expect("bank blockhash queue should contain blockhash");
new_response(
bank,
&bank,
RpcFees {
blockhash: blockhash.to_string(),
fee_calculator,
@ -259,19 +262,19 @@ impl JsonRpcRequestProcessor {
blockhash: &Hash,
commitment: Option<CommitmentConfig>,
) -> Result<RpcResponse<Option<RpcFeeCalculator>>> {
let bank = &*self.bank(commitment)?;
let bank = self.bank(commitment)?;
let fee_calculator = bank.get_fee_calculator(blockhash);
new_response(
bank,
&bank,
fee_calculator.map(|fee_calculator| RpcFeeCalculator { fee_calculator }),
)
}
fn get_fee_rate_governor(&self) -> Result<RpcResponse<RpcFeeRateGovernor>> {
let bank = &*self.bank(None)?;
let bank = self.bank(None)?;
let fee_rate_governor = bank.get_fee_rate_governor();
new_response(
bank,
&bank,
RpcFeeRateGovernor {
fee_rate_governor: fee_rate_governor.clone(),
},
@ -280,19 +283,14 @@ impl JsonRpcRequestProcessor {
pub fn confirm_transaction(
&self,
signature: Result<Signature>,
signature: &Signature,
commitment: Option<CommitmentConfig>,
) -> Result<RpcResponse<bool>> {
let bank = &*self.bank(commitment)?;
match signature {
Err(e) => Err(e),
Ok(sig) => {
let status = bank.get_signature_status(&sig);
match status {
Some(status) => new_response(bank, status.is_ok()),
None => new_response(bank, false),
}
}
let bank = self.bank(commitment)?;
let status = bank.get_signature_status(signature);
match status {
Some(status) => new_response(&bank, status.is_ok()),
None => new_response(&bank, false),
}
}
@ -557,17 +555,15 @@ impl JsonRpcRequestProcessor {
signature: Signature,
commitment: Option<CommitmentConfig>,
) -> Option<RpcSignatureConfirmation> {
self.get_transaction_status(signature, &self.bank(commitment).ok()?)
.map(
|TransactionStatus {
status,
confirmations,
..
}| RpcSignatureConfirmation {
confirmations: confirmations.unwrap_or(MAX_LOCKOUT_HISTORY + 1),
status,
},
)
let bank = self.bank(commitment).ok()?;
let transaction_status = self.get_transaction_status(signature, &bank)?;
let confirmations = transaction_status
.confirmations
.unwrap_or(MAX_LOCKOUT_HISTORY + 1);
Some(RpcSignatureConfirmation {
confirmations,
status: transaction_status.status,
})
}
pub fn get_signature_status(
@ -575,10 +571,9 @@ impl JsonRpcRequestProcessor {
signature: Signature,
commitment: Option<CommitmentConfig>,
) -> Option<transaction::Result<()>> {
self.bank(commitment)
.ok()?
.get_signature_status_slot(&signature)
.map(|(_, status)| status)
let bank = self.bank(commitment).ok()?;
let (_, status) = bank.get_signature_status_slot(&signature)?;
Some(status)
}
pub fn get_signature_statuses(
@ -632,27 +627,25 @@ impl JsonRpcRequestProcessor {
signature: Signature,
bank: &Arc<Bank>,
) -> Option<TransactionStatus> {
bank.get_signature_status_slot(&signature)
.map(|(slot, status)| {
let r_block_commitment_cache = self.block_commitment_cache.read().unwrap();
let (slot, status) = bank.get_signature_status_slot(&signature)?;
let r_block_commitment_cache = self.block_commitment_cache.read().unwrap();
let confirmations = if r_block_commitment_cache.root() >= slot
&& r_block_commitment_cache.is_confirmed_rooted(slot)
{
None
} else {
r_block_commitment_cache
.get_confirmation_count(slot)
.or(Some(0))
};
let err = status.clone().err();
TransactionStatus {
slot,
status,
confirmations,
err,
}
})
let confirmations = if r_block_commitment_cache.root() >= slot
&& r_block_commitment_cache.is_confirmed_rooted(slot)
{
None
} else {
r_block_commitment_cache
.get_confirmation_count(slot)
.or(Some(0))
};
let err = status.clone().err();
Some(TransactionStatus {
slot,
status,
confirmations,
err,
})
}
pub fn get_confirmed_transaction(
@ -1021,8 +1014,8 @@ impl RpcSol for RpcSolImpl {
commitment: Option<CommitmentConfig>,
) -> Result<RpcResponse<bool>> {
debug!("confirm_transaction rpc request received: {:?}", id);
let signature = verify_signature(&id);
meta.confirm_transaction(signature, commitment)
let signature = verify_signature(&id)?;
meta.confirm_transaction(&signature, commitment)
}
fn get_account_info(
@ -1032,8 +1025,8 @@ impl RpcSol for RpcSolImpl {
commitment: Option<CommitmentConfig>,
) -> Result<RpcResponse<Option<RpcAccount>>> {
debug!("get_account_info rpc request received: {:?}", pubkey_str);
let pubkey = verify_pubkey(pubkey_str);
meta.get_account_info(pubkey, commitment)
let pubkey = verify_pubkey(pubkey_str)?;
meta.get_account_info(&pubkey, commitment)
}
fn get_minimum_balance_for_rent_exemption(
@ -1093,8 +1086,8 @@ impl RpcSol for RpcSolImpl {
commitment: Option<CommitmentConfig>,
) -> Result<RpcResponse<u64>> {
debug!("get_balance rpc request received: {:?}", pubkey_str);
let pubkey = verify_pubkey(pubkey_str);
meta.get_balance(pubkey, commitment)
let pubkey = verify_pubkey(pubkey_str)?;
meta.get_balance(&pubkey, commitment)
}
fn get_cluster_nodes(&self, meta: Self::Metadata) -> Result<Vec<RpcContactInfo>> {

View File

@ -402,7 +402,7 @@ mod tests {
10_000,
rpc_service
.request_processor
.get_balance(Ok(mint_keypair.pubkey()), None)
.get_balance(&mint_keypair.pubkey(), None)
.unwrap()
.value
);