diff --git a/rpc/src/transaction_status_service.rs b/rpc/src/transaction_status_service.rs index 3607217e8c..c986df2dab 100644 --- a/rpc/src/transaction_status_service.rs +++ b/rpc/src/transaction_status_service.rs @@ -351,7 +351,8 @@ pub(crate) mod tests { .unwrap(), )), return_data: None, - executed_units: 0u64, + executed_units: 0, + accounts_data_len_delta: 0, }); let balances = TransactionBalancesSet { diff --git a/runtime/src/accounts.rs b/runtime/src/accounts.rs index 2cdf2bec1e..2df2eb16da 100644 --- a/runtime/src/accounts.rs +++ b/runtime/src/accounts.rs @@ -1423,7 +1423,8 @@ mod tests { inner_instructions: None, durable_nonce_fee: nonce.map(DurableNonceFee::from), return_data: None, - executed_units: 0u64, + executed_units: 0, + accounts_data_len_delta: 0, }, executors: Rc::new(RefCell::new(Executors::default())), } diff --git a/runtime/src/bank.rs b/runtime/src/bank.rs index 2a763236c7..887ea06995 100644 --- a/runtime/src/bank.rs +++ b/runtime/src/bank.rs @@ -605,6 +605,9 @@ pub struct TransactionExecutionDetails { pub durable_nonce_fee: Option, pub return_data: Option, pub executed_units: u64, + /// The change in accounts data len for this transaction. + /// NOTE: This value is valid IFF `status` is `Ok`. + pub accounts_data_len_delta: i64, } /// Type safe representation of a transaction execution attempt which @@ -4240,9 +4243,6 @@ impl Bank { ) .map(|_| info) }) - .map(|info| { - self.update_accounts_data_len(info.accounts_data_len_delta); - }) .map_err(|err| { match err { TransactionError::InvalidRentPayingAccount @@ -4255,6 +4255,10 @@ impl Bank { } err }); + let accounts_data_len_delta = status + .as_ref() + .map_or(0, |info| info.accounts_data_len_delta); + let status = status.map(|_| ()); let log_messages: Option = log_collector.and_then(|log_collector| { @@ -4299,6 +4303,7 @@ impl Bank { durable_nonce_fee, return_data, executed_units, + accounts_data_len_delta, }, executors, } @@ -4809,6 +4814,16 @@ impl Bank { update_executors_time.as_us() ); + let accounts_data_len_delta = execution_results + .iter() + .filter_map(|execution_result| { + execution_result + .details() + .map(|details| details.accounts_data_len_delta) + }) + .sum(); + self.update_accounts_data_len(accounts_data_len_delta); + timings.saturating_add_in_place(ExecuteTimingType::StoreUs, write_time.as_us()); timings.saturating_add_in_place( ExecuteTimingType::UpdateStakesCacheUs, @@ -7311,7 +7326,8 @@ pub(crate) mod tests { inner_instructions: None, durable_nonce_fee: nonce.map(DurableNonceFee::from), return_data: None, - executed_units: 0u64, + executed_units: 0, + accounts_data_len_delta: 0, }, executors: Rc::new(RefCell::new(Executors::default())), }