diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 144335b7b3..357cf0796d 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -148,7 +148,7 @@ use { sync::{ atomic::{ AtomicBool, AtomicU64, - Ordering::{Acquire, Relaxed, Release}, + Ordering::{AcqRel, Acquire, Relaxed, Release}, }, Arc, LockResult, RwLock, RwLockReadGuard, RwLockWriteGuard, }, @@ -3637,7 +3637,12 @@ impl Bank { &*self.sysvar_cache.read().unwrap(), blockhash, lamports_per_signature, - ); + ) + .map(|process_result| { + self.update_accounts_data_len( + process_result.accounts_data_len_delta, + ) + }); } else { // TODO: support versioned messages 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` pub fn calculate_fee(message: &SanitizedMessage, lamports_per_signature: u64) -> u64 { let mut num_signatures = u64::from(message.header().num_required_signatures); diff --git a/runtime/src/message_processor.rs b/runtime/src/message_processor.rs index 0129489513..28fb25351a 100644 --- a/runtime/src/message_processor.rs +++ b/runtime/src/message_processor.rs @@ -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 { /// Process a message. /// This method calls each instruction in the message over the set of loaded accounts. @@ -59,7 +66,7 @@ impl MessageProcessor { sysvars: &[(Pubkey, Vec)], blockhash: Hash, lamports_per_signature: u64, - ) -> Result<(), TransactionError> { + ) -> Result { let mut invoke_context = InvokeContext::new( rent, accounts, @@ -123,7 +130,7 @@ impl MessageProcessor { result .map_err(|err| TransactionError::InstructionError(instruction_index as u8, err))?; } - Ok(()) + Ok(ProcessedMessageInfo::default()) } } @@ -249,7 +256,7 @@ mod tests { Hash::default(), 0, ); - assert_eq!(result, Ok(())); + assert!(result.is_ok()); assert_eq!(accounts[0].1.borrow().lamports(), 100); assert_eq!(accounts[1].1.borrow().lamports(), 0); @@ -488,7 +495,7 @@ mod tests { Hash::default(), 0, ); - assert_eq!(result, Ok(())); + assert!(result.is_ok()); // Do work on the same account but at different location in keyed_accounts[] let message = Message::new( @@ -518,7 +525,7 @@ mod tests { Hash::default(), 0, ); - assert_eq!(result, Ok(())); + assert!(result.is_ok()); assert_eq!(accounts[0].1.borrow().lamports(), 80); assert_eq!(accounts[1].1.borrow().lamports(), 20); assert_eq!(accounts[0].1.borrow().data(), &vec![42]);