use kache_core::timeline::{PrefetchAccounting, PrefetchOrigin};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PrestageRequest {
pub target_dir: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SeedTargetRequest {
pub target_dir: String,
pub workspace_root: String,
pub rustc_version: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PredictionFetchRequest {
pub identity: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct UploadJob {
pub key: String,
pub entry_dir: String,
#[serde(default)]
pub crate_name: String,
#[serde(default)]
pub client_epoch: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_version: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct RemoteCheckRequest {
pub key: String,
pub entry_dir: String,
#[serde(default)]
pub crate_name: String,
#[serde(default)]
pub deadline_ms: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub shard_dir: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct StatsRequest {
pub include_entries: bool,
#[serde(default)]
pub include_summaries: bool,
pub sort_by: Option<String>,
pub event_hours: Option<u64>,
#[serde(default)]
pub event_secs: Option<u64>,
#[serde(default)]
pub client_epoch: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_version: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BatchRemoteCheckRequest {
pub checks: Vec<RemoteCheckRequest>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct HashFilesRequest {
pub files: Vec<HashFileRequest>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct HashFileRequest {
pub path: String,
pub size: i64,
pub mtime_ns: i64,
pub ctime_ns: i64,
#[serde(default)]
pub inode: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct HashFileResult {
pub path: String,
pub size: i64,
pub mtime_ns: i64,
pub ctime_ns: i64,
#[serde(default)]
pub inode: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub hash: Option<String>,
#[serde(default)]
pub cache_hit: bool,
#[serde(default)]
pub bytes_hashed: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct PrefetchRequest {
pub keys: Vec<(String, String)>,
#[serde(default)]
pub warm_all: bool,
#[serde(skip)]
pub origin: Option<PrefetchOrigin>,
#[serde(skip)]
pub candidate_sources: HashMap<String, kache_core::CandidateSource>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BuildStartedRequest {
#[serde(default)]
pub intent: kache_core::BuildIntent,
#[serde(default)]
pub client_epoch: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_version: Option<String>,
#[serde(default)]
pub session_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CompileStartedRequest {
pub crate_name: String,
#[serde(default)]
pub root: String,
pub pid: u32,
pub started_at_ms: u64,
#[serde(default)]
pub typical_ms: Option<u64>,
#[serde(default)]
pub client_epoch: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_version: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct CompileFinishedRequest {
pub pid: u32,
#[serde(default)]
pub started_at_ms: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DaemonHealth {
#[serde(default)]
pub version: String,
#[serde(default)]
pub build_epoch: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub remote_readonly: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct EffectiveConfig {
#[serde(default)]
pub process: Option<ProcessContext>,
pub max_size: u64,
pub cache_dir: String,
#[serde(default)]
pub runtime_dir: String,
pub config_path: String,
#[serde(default)]
pub config_fingerprint: Option<String>,
pub prefetch_enabled: bool,
#[serde(default = "default_effective_remote_key_listing")]
pub remote_key_listing: bool,
#[serde(default)]
pub remote_description: Option<String>,
#[serde(default)]
pub local_only: bool,
#[serde(default)]
pub remote_readonly: Option<bool>,
#[serde(default)]
pub remote_error: Option<String>,
#[serde(default = "default_effective_remote_key_cache_refresh_secs")]
pub remote_key_cache_refresh_secs: u64,
pub socket_path: String,
#[serde(default)]
pub started_at_ms: u64,
#[serde(default)]
pub auto_recover_min_free_bytes: Option<u64>,
#[serde(default)]
pub auto_recover_targets: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ProcessContext {
pub pid: u32,
pub effective_uid: Option<u32>,
pub open_file_limits: Option<OpenFileLimits>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct OpenFileLimits {
pub soft: Option<u64>,
pub hard: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct InFlightEntry {
pub crate_name: String,
#[serde(default)]
pub root: String,
pub pid: u32,
pub elapsed_s: u64,
#[serde(default)]
pub typical_s: Option<u64>,
#[serde(default)]
pub eta_s: Option<u64>,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct PrefetchStatsSnapshot {
#[serde(default)]
pub downloads_completed: u64,
#[serde(default)]
pub bytes_downloaded: u64,
#[serde(default)]
pub keys_used: u64,
#[serde(default)]
pub keys_cancelled: u64,
#[serde(default)]
pub keys_over_budget: u64,
#[serde(default)]
pub cancelled: bool,
#[serde(default)]
pub plans_advisory: u64,
#[serde(default)]
pub plans_fallback: u64,
#[serde(default)]
pub last_plan_candidates: u64,
#[serde(default)]
pub dedup_join_waits: u64,
#[serde(default)]
pub dedup_join_wait_ms: u64,
#[serde(default)]
pub last_list_duration_ms: u64,
#[serde(default)]
pub last_list_key_count: u64,
#[serde(default)]
pub list_requests_total: u64,
#[serde(default)]
pub list_failures_total: u64,
#[serde(default)]
pub list_duration_ms_total: u64,
#[serde(default)]
pub list_keys_total: u64,
#[serde(default)]
pub pack_requests_total: u64,
#[serde(default)]
pub pack_bytes_downloaded: u64,
#[serde(default)]
pub v3_requests_total: u64,
#[serde(default)]
pub v3_bytes_downloaded: u64,
#[serde(default)]
pub pack_validation_failures: u64,
#[serde(default)]
pub pack_fallback_entries: u64,
#[serde(default)]
pub last_plan_wall_ms: u64,
#[serde(default)]
pub plan_wall_ms_total: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct StatsEntry {
#[serde(default)]
pub store_dirs: Vec<std::path::PathBuf>,
pub cache_key: String,
pub crate_name: String,
pub crate_type: String,
pub profile: String,
pub size: u64,
pub hit_count: u64,
pub created_at: String,
pub last_accessed: String,
pub content_hash: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct EventStatsResponse {
pub local_hits: usize,
#[serde(default)]
pub prefetch_hits: usize,
pub remote_hits: usize,
#[serde(default)]
pub dups: usize,
pub misses: usize,
pub errors: usize,
pub total_elapsed_ms: u64,
#[serde(default)]
pub hit_elapsed_ms: u64,
#[serde(default)]
pub miss_elapsed_ms: u64,
#[serde(default)]
pub hit_compile_time_ms: u64,
#[serde(default)]
pub miss_compile_time_ms: u64,
#[serde(default)]
pub store_output_blobs: u32,
#[serde(default)]
pub store_duplicate_blobs: u32,
#[serde(default)]
pub store_new_blobs: u32,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
pub struct GcPolicyOutcome {
pub entries_evicted: usize,
pub bytes_freed: u64,
#[serde(default)]
pub entries_pinned: usize,
#[serde(default)]
pub disk_bytes_reclaimed: u64,
#[serde(default)]
pub entries_unreclaimable: usize,
#[serde(default)]
pub entries_failed: usize,
#[serde(default)]
pub entries_locked: usize,
#[serde(default)]
pub evict_write_ms: u64,
#[serde(default)]
pub bytes_held: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
#[serde(rename_all = "snake_case")]
pub enum TransferDirection {
Upload,
#[default]
Download,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub struct TransferEvent {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub accounting: Option<PrefetchAccounting>,
#[serde(default = "default_transfer_schema")]
pub schema: u32,
pub crate_name: String,
pub direction: TransferDirection,
#[serde(default)]
pub format: String,
#[serde(default)]
pub cache_key: String,
#[serde(default)]
pub object_key: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub prefetch: Option<PrefetchOrigin>,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub outcome: String,
pub compressed_bytes: u64,
#[serde(default)]
pub started_at_unix_ms: u64,
#[serde(default)]
pub finished_at_unix_ms: u64,
pub elapsed_ms: u64,
#[serde(default)]
pub network_ms: u64,
#[serde(default)]
pub semaphore_wait_ms: u64,
#[serde(default)]
pub head_ms: u64,
#[serde(default)]
pub request_ms: u64,
#[serde(default)]
pub body_ms: u64,
#[serde(default)]
pub request_count: u32,
#[serde(default)]
pub original_bytes: u64,
#[serde(default)]
pub decompress_ms: u64,
#[serde(default)]
pub extract_ms: u64,
#[serde(default)]
pub disk_io_ms: u64,
#[serde(default)]
pub import_lock_wait_ms: u64,
#[serde(default)]
pub import_ms: u64,
#[serde(default)]
pub compression_ms: u64,
#[serde(default)]
pub head_checks_ms: u64,
#[serde(default)]
pub blobs_skipped: u32,
#[serde(default)]
pub blobs_total: u32,
pub ok: bool,
pub timestamp: u64,
}
pub const TRANSFER_SCHEMA: u32 = 5;
const fn default_transfer_schema() -> u32 {
TRANSFER_SCHEMA
}
fn default_effective_remote_key_listing() -> bool {
true
}
fn default_effective_remote_key_cache_refresh_secs() -> u64 {
60
}
mod envelopes;
mod events;
pub mod fallback;
mod prediction;
mod publication;
pub use envelopes::*;
pub use events::*;
pub use kache_format::BlobStats;
pub use prediction::*;
pub use publication::*;
pub mod execution;