use alloc::string::String;
use alloc::vec::Vec;
use thiserror_no_std::Error;
#[derive(Debug, Clone, PartialEq, Eq, Error)]
pub enum DefragError {
#[error("Dataset not found: {0}")]
DatasetNotFound(String),
#[error("Object not found: {0}")]
ObjectNotFound(u64),
#[error("No contiguous space available for {0} blocks")]
NoContiguousSpace(u64),
#[error("IO error: {0}")]
IoError(String),
#[error("Defrag task not found: {0}")]
TaskNotFound(u64),
#[error("Defrag task cancelled")]
Cancelled,
#[error("File is busy")]
FileBusy,
#[error("File is not fragmented")]
NotFragmented,
}
#[derive(Debug, Clone)]
pub struct Extent {
pub pstart: u64,
pub lstart: u64,
pub length: u64,
pub device_id: u32,
}
#[derive(Debug, Clone)]
pub struct DefragOptions {
pub min_fragmentation: u8,
pub min_file_size: u64,
pub max_file_size: u64,
pub background: bool,
pub throttle_ms: u64,
pub skip_open_files: bool,
pub max_files: usize,
pub dry_run: bool,
}
impl Default for DefragOptions {
fn default() -> Self {
Self {
min_fragmentation: 30,
min_file_size: 4096,
max_file_size: 0,
background: false,
throttle_ms: 10,
skip_open_files: true,
max_files: 0,
dry_run: false,
}
}
}
#[derive(Debug, Clone, Default)]
pub struct DefragStats {
pub files_processed: u64,
pub files_defragmented: u64,
pub files_skipped: u64,
pub bytes_moved: u64,
pub extents_before: u64,
pub extents_after: u64,
pub duration_ms: u64,
}
#[derive(Debug, Clone)]
pub struct DefragProgress {
pub task_id: u64,
pub status: DefragStatus,
pub files_processed: u64,
pub files_total: u64,
pub bytes_moved: u64,
pub current_file: Option<String>,
pub error: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum DefragStatus {
Pending,
Running,
Completed,
Cancelled,
Failed,
}
#[derive(Debug, Clone)]
pub struct DefragRecommendation {
pub should_defrag: bool,
pub fragmentation_score: u8,
pub extent_count: usize,
pub estimated_benefit: u8,
pub reason: String,
}
pub struct DefragTask {
pub id: u64,
pub dataset: String,
pub options: DefragOptions,
pub status: DefragStatus,
pub stats: DefragStats,
pub current_file: Option<String>,
pub error: Option<String>,
pub cancel_requested: bool,
}
impl DefragTask {
pub fn new(id: u64, dataset: String, options: DefragOptions) -> Self {
Self {
id,
dataset,
options,
status: DefragStatus::Pending,
stats: DefragStats::default(),
current_file: None,
error: None,
cancel_requested: false,
}
}
}