|
|
@@ -3,7 +3,6 @@ use {
|
|
|
log::{debug, error, log_enabled, trace},
|
|
|
percentage::PercentageInteger,
|
|
|
solana_clock::{Epoch, Slot},
|
|
|
- solana_measure::measure::Measure,
|
|
|
solana_pubkey::Pubkey,
|
|
|
solana_sbpf::{
|
|
|
elf::Executable,
|
|
|
@@ -14,7 +13,6 @@ use {
|
|
|
solana_sdk_ids::{
|
|
|
bpf_loader, bpf_loader_deprecated, bpf_loader_upgradeable, loader_v4, native_loader,
|
|
|
},
|
|
|
- solana_timings::ExecuteDetailsTimings,
|
|
|
solana_type_overrides::{
|
|
|
rand::{thread_rng, Rng},
|
|
|
sync::{
|
|
|
@@ -29,6 +27,8 @@ use {
|
|
|
sync::Weak,
|
|
|
},
|
|
|
};
|
|
|
+#[cfg(feature = "metrics")]
|
|
|
+use {solana_measure::measure::Measure, solana_timings::ExecuteDetailsTimings};
|
|
|
|
|
|
pub type ProgramRuntimeEnvironment = Arc<BuiltinProgram<InvokeContext<'static>>>;
|
|
|
pub const MAX_LOADED_ENTRY_COUNT: usize = 512;
|
|
|
@@ -270,6 +270,7 @@ impl ProgramCacheStats {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#[cfg(feature = "metrics")]
|
|
|
/// Time measurements for loading a single [ProgramCacheEntry].
|
|
|
#[derive(Debug, Default)]
|
|
|
pub struct LoadProgramMetrics {
|
|
|
@@ -285,6 +286,7 @@ pub struct LoadProgramMetrics {
|
|
|
pub jit_compile_us: u64,
|
|
|
}
|
|
|
|
|
|
+#[cfg(feature = "metrics")]
|
|
|
impl LoadProgramMetrics {
|
|
|
pub fn submit_datapoint(&self, timings: &mut ExecuteDetailsTimings) {
|
|
|
timings.create_executor_register_syscalls_us += self.register_syscalls_us;
|
|
|
@@ -319,7 +321,7 @@ impl ProgramCacheEntry {
|
|
|
effective_slot: Slot,
|
|
|
elf_bytes: &[u8],
|
|
|
account_size: usize,
|
|
|
- metrics: &mut LoadProgramMetrics,
|
|
|
+ #[cfg(feature = "metrics")] metrics: &mut LoadProgramMetrics,
|
|
|
) -> Result<Self, Box<dyn std::error::Error>> {
|
|
|
Self::new_internal(
|
|
|
loader_key,
|
|
|
@@ -328,6 +330,7 @@ impl ProgramCacheEntry {
|
|
|
effective_slot,
|
|
|
elf_bytes,
|
|
|
account_size,
|
|
|
+ #[cfg(feature = "metrics")]
|
|
|
metrics,
|
|
|
false, /* reloading */
|
|
|
)
|
|
|
@@ -348,7 +351,7 @@ impl ProgramCacheEntry {
|
|
|
effective_slot: Slot,
|
|
|
elf_bytes: &[u8],
|
|
|
account_size: usize,
|
|
|
- metrics: &mut LoadProgramMetrics,
|
|
|
+ #[cfg(feature = "metrics")] metrics: &mut LoadProgramMetrics,
|
|
|
) -> Result<Self, Box<dyn std::error::Error>> {
|
|
|
Self::new_internal(
|
|
|
loader_key,
|
|
|
@@ -357,6 +360,7 @@ impl ProgramCacheEntry {
|
|
|
effective_slot,
|
|
|
elf_bytes,
|
|
|
account_size,
|
|
|
+ #[cfg(feature = "metrics")]
|
|
|
metrics,
|
|
|
true, /* reloading */
|
|
|
)
|
|
|
@@ -369,27 +373,39 @@ impl ProgramCacheEntry {
|
|
|
effective_slot: Slot,
|
|
|
elf_bytes: &[u8],
|
|
|
account_size: usize,
|
|
|
- metrics: &mut LoadProgramMetrics,
|
|
|
+ #[cfg(feature = "metrics")] metrics: &mut LoadProgramMetrics,
|
|
|
reloading: bool,
|
|
|
) -> Result<Self, Box<dyn std::error::Error>> {
|
|
|
+ #[cfg(feature = "metrics")]
|
|
|
let load_elf_time = Measure::start("load_elf_time");
|
|
|
// The following unused_mut exception is needed for architectures that do not
|
|
|
// support JIT compilation.
|
|
|
#[allow(unused_mut)]
|
|
|
let mut executable = Executable::load(elf_bytes, program_runtime_environment.clone())?;
|
|
|
- metrics.load_elf_us = load_elf_time.end_as_us();
|
|
|
+ #[cfg(feature = "metrics")]
|
|
|
+ {
|
|
|
+ metrics.load_elf_us = load_elf_time.end_as_us();
|
|
|
+ }
|
|
|
|
|
|
if !reloading {
|
|
|
+ #[cfg(feature = "metrics")]
|
|
|
let verify_code_time = Measure::start("verify_code_time");
|
|
|
executable.verify::<RequisiteVerifier>()?;
|
|
|
- metrics.verify_code_us = verify_code_time.end_as_us();
|
|
|
+ #[cfg(feature = "metrics")]
|
|
|
+ {
|
|
|
+ metrics.verify_code_us = verify_code_time.end_as_us();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
#[cfg(all(not(target_os = "windows"), target_arch = "x86_64"))]
|
|
|
{
|
|
|
+ #[cfg(feature = "metrics")]
|
|
|
let jit_compile_time = Measure::start("jit_compile_time");
|
|
|
executable.jit_compile()?;
|
|
|
- metrics.jit_compile_us = jit_compile_time.end_as_us();
|
|
|
+ #[cfg(feature = "metrics")]
|
|
|
+ {
|
|
|
+ metrics.jit_compile_us = jit_compile_time.end_as_us();
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
Ok(Self {
|