use std::path::PathBuf;
use serde::Serialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum VacuumMode {
Stats,
}
#[derive(Debug, Clone, Copy, Default, Serialize)]
pub struct NodeTotals {
pub enumerated_nodes: usize,
pub enumerated_bytes: u64,
pub marked_nodes: usize,
pub marked_bytes: u64,
pub unmarked_nodes: usize,
pub unmarked_bytes: u64,
}
impl NodeTotals {
pub(super) const fn accumulate(&mut self, other: Self) {
self.enumerated_nodes += other.enumerated_nodes;
self.enumerated_bytes += other.enumerated_bytes;
self.marked_nodes += other.marked_nodes;
self.marked_bytes += other.marked_bytes;
self.unmarked_nodes += other.unmarked_nodes;
self.unmarked_bytes += other.unmarked_bytes;
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ShardPresence {
Materialised,
NeverMaterialised,
}
#[derive(Debug, Clone, Serialize)]
pub struct MalformedEntry {
pub path: PathBuf,
pub reason: String,
}
#[derive(Debug, Serialize)]
pub struct ShardReport {
pub shard_id: usize,
pub presence: ShardPresence,
pub wal_committed_root: bool,
pub nodes: NodeTotals,
pub temp_debris_files: usize,
pub temp_debris_bytes: u64,
pub malformed: Vec<MalformedEntry>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum MetadataOrigin {
Canonical,
Supplied,
Manifest,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum MetadataSourceKind {
RefsDir,
SnapshotRegistry,
}
#[derive(Debug, Serialize)]
pub struct MetadataSourceReport {
pub path: PathBuf,
pub kind: MetadataSourceKind,
pub origin: MetadataOrigin,
pub records: usize,
pub temp_debris_files: usize,
pub foreign_entries: usize,
}
#[derive(Debug, Serialize)]
pub struct ManifestEntryReport {
pub path: PathBuf,
pub kind: MetadataSourceKind,
pub state: String,
pub source_readable: bool,
}
#[derive(Debug, Serialize)]
pub struct ManifestReport {
pub path: PathBuf,
pub generation: u64,
pub entries: Vec<ManifestEntryReport>,
}
#[derive(Debug, Serialize)]
pub struct MetadataReport {
pub manifest: Option<ManifestReport>,
pub attestation: bool,
pub sources: Vec<MetadataSourceReport>,
pub supplied_missing: Vec<PathBuf>,
}
#[derive(Debug, Clone, Copy, Default, Serialize)]
pub struct MarkTallies {
pub wal_roots: usize,
pub branch_anchors: usize,
pub branch_heads: usize,
pub snapshot_roots: usize,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum EntryKind {
File,
Directory,
Symlink,
Other,
}
#[derive(Debug, Serialize)]
pub struct UninventoriedEntry {
pub name: String,
pub kind: EntryKind,
pub size_bytes: Option<u64>,
}
#[derive(Debug, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum SweepBlocker {
ShardBeyondCount { id: usize, shard_count: usize },
MalformedStoreEntries { shard_id: usize, count: usize },
MetadataUnattested,
StaleManifest { unlisted: PathBuf },
ManifestEntryUnsettled { path: PathBuf, state: String },
ManifestSourceMissing { path: PathBuf },
SourceUnreadable { path: PathBuf, detail: String },
SuppliedPathMissing { path: PathBuf },
UnsupportedDurability,
}
#[derive(Debug, Serialize)]
pub struct VacuumReport {
pub mode: VacuumMode,
pub data_dir: PathBuf,
pub shard_count: usize,
pub duration_ms: u64,
pub lock_anchor_created: bool,
pub never_materialised_shards: usize,
pub shards: Vec<ShardReport>,
pub totals: NodeTotals,
pub metadata: MetadataReport,
pub marks: MarkTallies,
pub verified_nodes: usize,
pub uninventoried: Vec<UninventoriedEntry>,
pub sweep_blockers: Vec<SweepBlocker>,
pub trust_boundary: String,
}