wrap create executor timings datapoint in a module (#22398)
(cherry picked from commit 428575f9ae)
Co-authored-by: Trent Nelson <trent@solana.com>
			
			
This commit is contained in:
		@@ -82,6 +82,28 @@ fn map_ebpf_error(invoke_context: &InvokeContext, e: EbpfError<BpfError>) -> Ins
 | 
			
		||||
    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(
 | 
			
		||||
    programdata_account_index: usize,
 | 
			
		||||
    programdata_offset: usize,
 | 
			
		||||
@@ -124,14 +146,11 @@ pub fn create_executor(
 | 
			
		||||
            .is_active(&reject_all_elf_rw::id()),
 | 
			
		||||
        ..Config::default()
 | 
			
		||||
    };
 | 
			
		||||
    let program_id;
 | 
			
		||||
    let load_elf_us: u64;
 | 
			
		||||
    let verify_elf_us: u64;
 | 
			
		||||
    let mut jit_compile_us = 0u64;
 | 
			
		||||
    let mut create_executor_metrics = executor_metrics::CreateMetrics::default();
 | 
			
		||||
    let mut executable = {
 | 
			
		||||
        let keyed_accounts = invoke_context.get_keyed_accounts()?;
 | 
			
		||||
        let programdata = keyed_account_at_index(keyed_accounts, programdata_account_index)?;
 | 
			
		||||
        program_id = *programdata.unsigned_key();
 | 
			
		||||
        create_executor_metrics.program_id = programdata.unsigned_key().to_string();
 | 
			
		||||
        let mut load_elf_time = Measure::start("load_elf_time");
 | 
			
		||||
        let executable = Executable::<BpfError, ThisInstructionMeter>::from_elf(
 | 
			
		||||
            &programdata.try_account_ref()?.data()[programdata_offset..],
 | 
			
		||||
@@ -140,11 +159,11 @@ pub fn create_executor(
 | 
			
		||||
            syscall_registry,
 | 
			
		||||
        );
 | 
			
		||||
        load_elf_time.stop();
 | 
			
		||||
        load_elf_us = load_elf_time.as_us();
 | 
			
		||||
        create_executor_metrics.load_elf_us = load_elf_time.as_us();
 | 
			
		||||
        invoke_context.timings.create_executor_load_elf_us = invoke_context
 | 
			
		||||
            .timings
 | 
			
		||||
            .create_executor_load_elf_us
 | 
			
		||||
            .saturating_add(load_elf_us);
 | 
			
		||||
            .saturating_add(create_executor_metrics.load_elf_us);
 | 
			
		||||
        executable
 | 
			
		||||
    }
 | 
			
		||||
    .map_err(|e| map_ebpf_error(invoke_context, e))?;
 | 
			
		||||
@@ -153,33 +172,27 @@ pub fn create_executor(
 | 
			
		||||
    verifier::check(text_bytes, &config)
 | 
			
		||||
        .map_err(|e| map_ebpf_error(invoke_context, EbpfError::UserError(e.into())))?;
 | 
			
		||||
    verify_code_time.stop();
 | 
			
		||||
    verify_elf_us = verify_code_time.as_us();
 | 
			
		||||
    create_executor_metrics.verify_code_us = verify_code_time.as_us();
 | 
			
		||||
    invoke_context.timings.create_executor_verify_code_us = invoke_context
 | 
			
		||||
        .timings
 | 
			
		||||
        .create_executor_verify_code_us
 | 
			
		||||
        .saturating_add(verify_elf_us);
 | 
			
		||||
        .saturating_add(create_executor_metrics.verify_code_us);
 | 
			
		||||
    if use_jit {
 | 
			
		||||
        let mut jit_compile_time = Measure::start("jit_compile_time");
 | 
			
		||||
        let jit_compile_result =
 | 
			
		||||
            Executable::<BpfError, ThisInstructionMeter>::jit_compile(&mut executable);
 | 
			
		||||
        jit_compile_time.stop();
 | 
			
		||||
        jit_compile_us = jit_compile_time.as_us();
 | 
			
		||||
        create_executor_metrics.jit_compile_us = jit_compile_time.as_us();
 | 
			
		||||
        invoke_context.timings.create_executor_jit_compile_us = invoke_context
 | 
			
		||||
            .timings
 | 
			
		||||
            .create_executor_jit_compile_us
 | 
			
		||||
            .saturating_add(jit_compile_us);
 | 
			
		||||
            .saturating_add(create_executor_metrics.jit_compile_us);
 | 
			
		||||
        if let Err(err) = jit_compile_result {
 | 
			
		||||
            ic_msg!(invoke_context, "Failed to compile program {:?}", err);
 | 
			
		||||
            return Err(InstructionError::ProgramFailedToCompile);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    datapoint_trace!(
 | 
			
		||||
        "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),
 | 
			
		||||
    );
 | 
			
		||||
    create_executor_metrics.submit_datapoint();
 | 
			
		||||
    Ok(Arc::new(BpfExecutor { executable }))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user