wrap create executor timings datapoint in a module (#22397)

Co-authored-by: Trent Nelson <trent@solana.com>
This commit is contained in:
mergify[bot]
2022-01-19 00:33:36 +00:00
committed by GitHub
parent b357eda15b
commit 4706aa4900

View File

@ -80,6 +80,28 @@ fn map_ebpf_error(invoke_context: &dyn InvokeContext, e: EbpfError<BpfError>) ->
InstructionError::InvalidAccountData InstructionError::InvalidAccountData
} }
mod executor_metrics {
#[derive(Debug, Default)]
pub struct CreateMetrics {
pub program_id: String,
pub load_elf_us: u64,
pub verify_code_us: u64,
pub jit_compile_us: u64,
}
impl CreateMetrics {
pub fn submit_datapoint(&self) {
datapoint_trace!(
"create_executor_trace",
("program_id", self.program_id, String),
("load_elf_us", self.load_elf_us, i64),
("verify_code_us", self.verify_code_us, i64),
("jit_compile_us", self.jit_compile_us, i64),
);
}
}
}
pub fn create_executor( pub fn create_executor(
program_account_index: usize, program_account_index: usize,
program_data_offset: usize, program_data_offset: usize,
@ -116,13 +138,11 @@ pub fn create_executor(
reject_all_writable_sections: invoke_context.is_feature_active(&reject_all_elf_rw::id()), reject_all_writable_sections: invoke_context.is_feature_active(&reject_all_elf_rw::id()),
..Config::default() ..Config::default()
}; };
let program_id; let mut create_executor_metrics = executor_metrics::CreateMetrics::default();
let load_elf_us: u64;
let mut jit_compile_us = 0u64;
let executable_result = { let executable_result = {
let keyed_accounts = invoke_context.get_keyed_accounts()?; let keyed_accounts = invoke_context.get_keyed_accounts()?;
let program = keyed_account_at_index(keyed_accounts, program_account_index)?; let program = keyed_account_at_index(keyed_accounts, program_account_index)?;
program_id = *program.unsigned_key(); create_executor_metrics.program_id = program.unsigned_key().to_string();
let account = program.try_account_ref()?; let account = program.try_account_ref()?;
let data = &account.data()[program_data_offset..]; let data = &account.data()[program_data_offset..];
let mut load_elf_time = Measure::start("load_elf_time"); let mut load_elf_time = Measure::start("load_elf_time");
@ -133,13 +153,13 @@ pub fn create_executor(
syscall_registry, syscall_registry,
); );
load_elf_time.stop(); load_elf_time.stop();
load_elf_us = load_elf_time.as_us(); create_executor_metrics.load_elf_us = load_elf_time.as_us();
executable executable
}; };
saturating_add_assign!( saturating_add_assign!(
invoke_context.get_timings().create_executor_load_elf_us, invoke_context.get_timings().create_executor_load_elf_us,
load_elf_us create_executor_metrics.load_elf_us
); );
let mut executable = executable_result.map_err(|e| map_ebpf_error(invoke_context, e))?; let mut executable = executable_result.map_err(|e| map_ebpf_error(invoke_context, e))?;
@ -149,33 +169,27 @@ pub fn create_executor(
verifier::check(text_bytes, &config) verifier::check(text_bytes, &config)
.map_err(|e| map_ebpf_error(invoke_context, EbpfError::UserError(e.into())))?; .map_err(|e| map_ebpf_error(invoke_context, EbpfError::UserError(e.into())))?;
verify_code_time.stop(); verify_code_time.stop();
let verify_elf_us = verify_code_time.as_us(); create_executor_metrics.verify_code_us = verify_code_time.as_us();
saturating_add_assign!( saturating_add_assign!(
invoke_context.get_timings().create_executor_verify_code_us, invoke_context.get_timings().create_executor_verify_code_us,
verify_elf_us create_executor_metrics.verify_code_us
); );
if use_jit { if use_jit {
let mut jit_compile_time = Measure::start("jit_compile_time"); let mut jit_compile_time = Measure::start("jit_compile_time");
let jit_compile_result = let jit_compile_result =
Executable::<BpfError, ThisInstructionMeter>::jit_compile(&mut executable); Executable::<BpfError, ThisInstructionMeter>::jit_compile(&mut executable);
jit_compile_time.stop(); jit_compile_time.stop();
jit_compile_us = jit_compile_time.as_us(); create_executor_metrics.jit_compile_us = jit_compile_time.as_us();
saturating_add_assign!( saturating_add_assign!(
invoke_context.get_timings().create_executor_jit_compile_us, invoke_context.get_timings().create_executor_jit_compile_us,
jit_compile_us create_executor_metrics.jit_compile_us
); );
if let Err(err) = jit_compile_result { if let Err(err) = jit_compile_result {
ic_msg!(invoke_context, "Failed to compile program {:?}", err); ic_msg!(invoke_context, "Failed to compile program {:?}", err);
return Err(InstructionError::ProgramFailedToCompile); return Err(InstructionError::ProgramFailedToCompile);
} }
} }
datapoint_trace!( create_executor_metrics.submit_datapoint();
"create_executor_trace",
("program_id", program_id.to_string(), String),
("load_elf_us", load_elf_us, i64),
("verify_elf_us", verify_elf_us, i64),
("jit_compile_us", jit_compile_us, i64),
);
Ok(Arc::new(BpfExecutor { executable })) Ok(Arc::new(BpfExecutor { executable }))
} }