Count compute units even when transaction errors (backport #22059) (#22154)

* Count compute units even when transaction errors (#22059)

(cherry picked from commit eaa8c67bde)

# Conflicts:
#	program-runtime/src/invoke_context.rs
#	runtime/src/bank.rs
#	runtime/src/message_processor.rs

* Fix merge conflicts

Co-authored-by: carllin <carl@solana.com>
This commit is contained in:
mergify[bot]
2021-12-29 08:04:12 +00:00
committed by GitHub
parent 14ed446923
commit 401c542d2a
13 changed files with 305 additions and 93 deletions

View File

@ -1,9 +1,13 @@
use {
crate::cost_model::ExecutionCost,
serde::{Deserialize, Serialize},
solana_measure::measure::Measure,
solana_program_runtime::{
instruction_recorder::InstructionRecorder,
invoke_context::{BuiltinProgram, Executors, InvokeContext, TransactionAccountRefCell},
invoke_context::{
BuiltinProgram, Executors, InvokeContext, ProcessInstructionResult,
TransactionAccountRefCell,
},
log_collector::LogCollector,
timings::ExecuteDetailsTimings,
},
@ -45,6 +49,7 @@ impl MessageProcessor {
builtin_programs: &[BuiltinProgram],
message: &Message,
program_indices: &[Vec<usize>],
estimated_execution_cost: ExecutionCost,
accounts: &[TransactionAccountRefCell],
rent: Rent,
log_collector: Option<Rc<RefCell<LogCollector>>>,
@ -105,16 +110,21 @@ impl MessageProcessor {
Some(&instruction_recorders[instruction_index]);
}
let mut time = Measure::start("execute_instruction");
let compute_meter_consumption = invoke_context
.process_instruction(message, instruction, program_indices, &[], &[])
.map_err(|err| TransactionError::InstructionError(instruction_index as u8, err))?;
let ProcessInstructionResult {
compute_units_consumed,
result,
} = invoke_context.process_instruction(message, instruction, program_indices, &[], &[]);
time.stop();
timings.accumulate_program(
instruction.program_id(&message.account_keys),
time.as_us(),
compute_meter_consumption,
compute_units_consumed,
estimated_execution_cost,
result.is_err(),
);
timings.accumulate(&invoke_context.timings);
result
.map_err(|err| TransactionError::InstructionError(instruction_index as u8, err))?;
}
Ok(())
}
@ -230,6 +240,7 @@ mod tests {
builtin_programs,
&message,
&program_indices,
0,
&accounts,
rent_collector.rent,
None,
@ -259,6 +270,7 @@ mod tests {
builtin_programs,
&message,
&program_indices,
0,
&accounts,
rent_collector.rent,
None,
@ -292,6 +304,7 @@ mod tests {
builtin_programs,
&message,
&program_indices,
0,
&accounts,
rent_collector.rent,
None,
@ -436,6 +449,7 @@ mod tests {
builtin_programs,
&message,
&program_indices,
0,
&accounts,
rent_collector.rent,
None,
@ -469,6 +483,7 @@ mod tests {
builtin_programs,
&message,
&program_indices,
0,
&accounts,
rent_collector.rent,
None,
@ -499,6 +514,7 @@ mod tests {
builtin_programs,
&message,
&program_indices,
0,
&accounts,
rent_collector.rent,
None,
@ -556,6 +572,7 @@ mod tests {
builtin_programs,
&message,
&[vec![0], vec![1]],
0,
&accounts,
RentCollector::default().rent,
None,