use std::path::Path;
use std::sync::LazyLock;
use std::time::{Duration, Instant};
use semver::Version;
use crate::common::cpu;
pub const QDRANT_VERSION_STRING: &str = "1.18.2-dev";
pub static QDRANT_VERSION: LazyLock<Version> =
LazyLock::new(|| Version::parse(QDRANT_VERSION_STRING).expect("valid version string"));
pub static APP_USER_AGENT: LazyLock<String> =
LazyLock::new(|| format!("Qdrant/{QDRANT_VERSION_STRING}"));
pub const CONSENSUS_CONFIRM_RETRIES: usize = 3;
pub const CONSENSUS_META_OP_WAIT: Duration = Duration::from_secs(10);
pub const LOAD_TIMING_LOG_TARGET: &str = "qdrant::load_timing";
pub const LOAD_TIMING_MIN_DURATION: Duration = Duration::from_millis(5);
pub fn log_load_timing(path: &Path, component: &str, started: Instant) {
let elapsed = started.elapsed();
if elapsed >= LOAD_TIMING_MIN_DURATION {
log::debug!(
target: LOAD_TIMING_LOG_TARGET,
"{} - {component} loaded in {:.2}s",
path.display(),
elapsed.as_secs_f64(),
);
}
}
pub static POOL_KEEP_LIMIT: LazyLock<usize> = LazyLock::new(|| cpu::get_num_cpus().clamp(16, 128));
#[inline(always)]
pub fn default_cpu_budget_unallocated(num_cpu: usize) -> isize {
match num_cpu {
0..=2 => 0,
3..=32 => -1,
33..=48 => -2,
49..=64 => -3,
65..=96 => -4,
97..=128 => -6,
num_cpu @ 129.. => -(num_cpu as isize / 16),
}
}
#[inline(always)]
pub fn thread_count_for_hnsw(num_cpu: usize) -> usize {
match num_cpu {
0..=48 => 8.min(num_cpu).max(1),
49..=64 => 12,
65.. => 16,
}
}
#[inline(always)]
pub fn search_thread_count(max_search_threads: usize) -> usize {
if max_search_threads != 0 {
return max_search_threads;
}
const CPU_OVERCOMMIT_FACTOR: usize = 4;
cpu::get_num_cpus().max(1) * CPU_OVERCOMMIT_FACTOR
}