Add an explicit state of a reserved signature

An RPC client that fetches the signature status before the bank finishes
executing the corresponding Transaction should receive SignatureNotFound
instead of Confirmed
This commit is contained in:
Michael Vines 2018-11-16 20:18:53 -08:00
parent 38883d1de4
commit 719e14b30a
2 changed files with 11 additions and 2 deletions

View File

@ -77,6 +77,9 @@ pub enum BankError {
/// too old and has been discarded.
SignatureNotFound,
/// A transaction with this signature has been received but not yet executed
SignatureReserved,
/// Proof of History verification failed.
LedgerVerificationFailed,
@ -431,7 +434,7 @@ impl Bank {
if let Some(_result) = signatures.get(signature) {
return Err(BankError::DuplicateSignature);
}
signatures.insert(*signature, Ok(()));
signatures.insert(*signature, Err(BankError::SignatureReserved));
Ok(())
}
@ -1747,7 +1750,10 @@ mod tests {
let signature = Signature::default();
bank.reserve_signature_with_last_id_test(&signature, &mint.last_id())
.expect("reserve signature");
assert_eq!(bank.get_signature_status(&signature), Ok(()));
assert_eq!(
bank.get_signature_status(&signature),
Err(BankError::SignatureReserved)
);
}
#[test]

View File

@ -192,6 +192,9 @@ impl RpcSol for RpcSolImpl {
Ok(_) => RpcSignatureStatus::Confirmed,
Err(BankError::AccountInUse) => RpcSignatureStatus::AccountInUse,
Err(BankError::ProgramRuntimeError(_)) => RpcSignatureStatus::ProgramRuntimeError,
// Report SignatureReserved as SignatureNotFound as SignatureReserved is
// transitory while the bank processes the associated transaction.
Err(BankError::SignatureReserved) => RpcSignatureStatus::SignatureNotFound,
Err(BankError::SignatureNotFound) => RpcSignatureStatus::SignatureNotFound,
Err(err) => {
trace!("mapping {:?} to GenericFailure", err);