Bank gets accounts data len delta from MessageProcessor::process_message() (#22288)

(cherry picked from commit 635337d2ff)

Co-authored-by: Brooks Prumo <brooks@solana.com>
This commit is contained in:
mergify[bot]
2022-01-05 05:50:03 +00:00
committed by GitHub
parent 17411f9b4c
commit 87f4a1f4b6
2 changed files with 31 additions and 7 deletions

View File

@ -148,7 +148,7 @@ use {
sync::{ sync::{
atomic::{ atomic::{
AtomicBool, AtomicU64, AtomicBool, AtomicU64,
Ordering::{Acquire, Relaxed, Release}, Ordering::{AcqRel, Acquire, Relaxed, Release},
}, },
Arc, LockResult, RwLock, RwLockReadGuard, RwLockWriteGuard, Arc, LockResult, RwLock, RwLockReadGuard, RwLockWriteGuard,
}, },
@ -3637,7 +3637,12 @@ impl Bank {
&*self.sysvar_cache.read().unwrap(), &*self.sysvar_cache.read().unwrap(),
blockhash, blockhash,
lamports_per_signature, lamports_per_signature,
); )
.map(|process_result| {
self.update_accounts_data_len(
process_result.accounts_data_len_delta,
)
});
} else { } else {
// TODO: support versioned messages // TODO: support versioned messages
process_result = Err(TransactionError::UnsupportedVersion); process_result = Err(TransactionError::UnsupportedVersion);
@ -3798,6 +3803,18 @@ impl Bank {
) )
} }
/// Update the bank's accounts_data_len field based on the `delta`.
fn update_accounts_data_len(&self, delta: i64) {
if delta == 0 {
return;
}
if delta > 0 {
self.accounts_data_len.fetch_add(delta as u64, AcqRel);
} else {
self.accounts_data_len.fetch_sub(delta.abs() as u64, AcqRel);
}
}
/// Calculate fee for `SanitizedMessage` /// Calculate fee for `SanitizedMessage`
pub fn calculate_fee(message: &SanitizedMessage, lamports_per_signature: u64) -> u64 { pub fn calculate_fee(message: &SanitizedMessage, lamports_per_signature: u64) -> u64 {
let mut num_signatures = u64::from(message.header().num_required_signatures); let mut num_signatures = u64::from(message.header().num_required_signatures);

View File

@ -37,6 +37,13 @@ impl ::solana_frozen_abi::abi_example::AbiExample for MessageProcessor {
} }
} }
/// Resultant information gathered from calling process_message()
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
pub struct ProcessedMessageInfo {
/// The amount that the accounts data len has changed
pub accounts_data_len_delta: i64,
}
impl MessageProcessor { impl MessageProcessor {
/// Process a message. /// Process a message.
/// This method calls each instruction in the message over the set of loaded accounts. /// This method calls each instruction in the message over the set of loaded accounts.
@ -59,7 +66,7 @@ impl MessageProcessor {
sysvars: &[(Pubkey, Vec<u8>)], sysvars: &[(Pubkey, Vec<u8>)],
blockhash: Hash, blockhash: Hash,
lamports_per_signature: u64, lamports_per_signature: u64,
) -> Result<(), TransactionError> { ) -> Result<ProcessedMessageInfo, TransactionError> {
let mut invoke_context = InvokeContext::new( let mut invoke_context = InvokeContext::new(
rent, rent,
accounts, accounts,
@ -123,7 +130,7 @@ impl MessageProcessor {
result result
.map_err(|err| TransactionError::InstructionError(instruction_index as u8, err))?; .map_err(|err| TransactionError::InstructionError(instruction_index as u8, err))?;
} }
Ok(()) Ok(ProcessedMessageInfo::default())
} }
} }
@ -249,7 +256,7 @@ mod tests {
Hash::default(), Hash::default(),
0, 0,
); );
assert_eq!(result, Ok(())); assert!(result.is_ok());
assert_eq!(accounts[0].1.borrow().lamports(), 100); assert_eq!(accounts[0].1.borrow().lamports(), 100);
assert_eq!(accounts[1].1.borrow().lamports(), 0); assert_eq!(accounts[1].1.borrow().lamports(), 0);
@ -488,7 +495,7 @@ mod tests {
Hash::default(), Hash::default(),
0, 0,
); );
assert_eq!(result, Ok(())); assert!(result.is_ok());
// Do work on the same account but at different location in keyed_accounts[] // Do work on the same account but at different location in keyed_accounts[]
let message = Message::new( let message = Message::new(
@ -518,7 +525,7 @@ mod tests {
Hash::default(), Hash::default(),
0, 0,
); );
assert_eq!(result, Ok(())); assert!(result.is_ok());
assert_eq!(accounts[0].1.borrow().lamports(), 80); assert_eq!(accounts[0].1.borrow().lamports(), 80);
assert_eq!(accounts[1].1.borrow().lamports(), 20); assert_eq!(accounts[1].1.borrow().lamports(), 20);
assert_eq!(accounts[0].1.borrow().data(), &vec![42]); assert_eq!(accounts[0].1.borrow().data(), &vec![42]);