use std::time::Duration;
#[derive(Clone, Debug)]
pub enum ImportEvent {
OrderStarted {
order: u8,
total_files: u64,
},
OrderCompleted {
order: u8,
ngram_count: u64,
duration: Duration,
},
WorkerStarted {
worker_id: usize,
order: u8,
prefix: String,
},
WorkerProgress {
worker_id: usize,
bytes_downloaded: u64,
total_bytes: Option<u64>,
},
WorkerNgramProgress {
worker_id: usize,
ngram_count: u64,
},
WorkerFinished {
worker_id: usize,
order: u8,
prefix: String,
ngram_count: u64,
duration: Duration,
},
OrderProgress {
order: u8,
files_completed: u64,
total_files: u64,
ngrams_processed: u64,
is_complete: bool,
files_succeeded: u64,
files_skipped: u64,
},
WorkerRetrying {
worker_id: usize,
prefix: String,
attempt: u32,
max_attempts: u32,
error: String,
},
WorkerExited {
worker_id: usize,
},
StatsSnapshot {
files_completed: u64,
total_files: u64,
total_ngrams: u64,
unique_ngrams: u64,
ngrams_per_second: f64,
elapsed: Duration,
},
CheckpointSaved {
prefix: String,
},
CheckpointProgress {
shards_processed: usize,
total_shards: usize,
percent_complete: f32,
},
ImportCompleted {
total_ngrams: u64,
duration: Duration,
},
ImportCancelled,
ImportPaused,
ImportResumed,
Error {
message: String,
},
Log {
level: LogLevel,
message: String,
},
PrefixFailed {
order: u8,
prefix: String,
error: String,
attempts: u32,
},
RetryingFailedPrefixes {
order: u8,
count: usize,
prefixes: Vec<String>,
},
RecoveringInProgressPrefixes {
order: u8,
count: usize,
prefixes: Vec<String>,
},
DeferredRetry {
prefix: String,
attempt: u32,
order: u8,
},
DeferredRetryStarted {
prefix: String,
order: u8,
},
MergeStarted {
shard_count: usize,
estimated_ngrams: u64,
},
MergeProgress {
shards_processed: usize,
total_shards: usize,
ngrams_merged: u64,
percent_complete: f32,
},
MergeCompleted {
total_ngrams: u64,
bytes_written: u64,
duration: Duration,
},
MergeFailed {
error: String,
},
ShardCleanupStarted {
shard_count: usize,
},
ShardCleanupCompleted {
shards_deleted: usize,
bytes_freed: u64,
},
AllWorkCompleted {
total_ngrams: u64,
total_duration: Duration,
shards_kept: bool,
},
MknStarted {
source: String,
estimated_ngrams: u64,
},
MknProgress {
phase: u8,
total_phases: u8,
items_processed: u64,
total_items: u64,
percent_complete: f32,
},
MknCompleted {
continuation_entries: u64,
frequency_entries: u64,
duration: Duration,
},
MknFailed {
error: String,
},
PhaseChanged {
phase: String,
},
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum LogLevel {
Debug,
Info,
Warn,
Error,
}
#[derive(Clone, Debug)]
pub enum ImportCommand {
Pause,
Resume,
Cancel,
ForceQuit,
SetParallelism(usize),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn event_is_clone() {
let event = ImportEvent::WorkerStarted {
worker_id: 0,
order: 2,
prefix: "th".to_string(),
};
let _cloned = event.clone();
}
#[test]
fn command_is_clone() {
let cmd = ImportCommand::Pause;
let _cloned = cmd.clone();
}
#[test]
fn order_progress_event() {
let event = ImportEvent::OrderProgress {
order: 2,
files_completed: 50,
total_files: 676,
ngrams_processed: 1_000_000,
is_complete: false,
files_succeeded: 48,
files_skipped: 2,
};
let _cloned = event.clone();
}
}