wrap create executor timings datapoint in a module (#22397)
Co-authored-by: Trent Nelson <trent@solana.com>
This commit is contained in:
@ -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 }))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user