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:
		@@ -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);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<u8>)],
 | 
			
		||||
        blockhash: Hash,
 | 
			
		||||
        lamports_per_signature: u64,
 | 
			
		||||
    ) -> Result<(), TransactionError> {
 | 
			
		||||
    ) -> Result<ProcessedMessageInfo, TransactionError> {
 | 
			
		||||
        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]);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user