use crate::common::progress_tracker::ProgressTree;
use crate::common::types::PointOffsetType;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::shard::tracker::TrackerStatus;
#[derive(Debug, Serialize, Deserialize, JsonSchema)]
pub struct Optimization {
pub uuid: Uuid,
pub optimizer: String,
pub status: TrackerStatus,
pub segments: Vec<OptimizationSegmentInfo>,
pub progress: ProgressTree,
}
#[derive(Debug, Default, Serialize, Deserialize, JsonSchema)]
pub struct OptimizationsResponse {
pub summary: OptimizationsSummary,
pub running: Vec<Optimization>,
#[serde(skip_serializing_if = "Option::is_none")]
pub queued: Option<Vec<PendingOptimization>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completed: Option<Vec<Optimization>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub idle_segments: Option<Vec<OptimizationSegmentInfo>>,
}
impl OptimizationsResponse {
pub fn merge(&mut self, other: OptimizationsResponse) {
let OptimizationsResponse {
summary:
OptimizationsSummary {
queued_optimizations,
queued_segments,
queued_points,
idle_segments: idle_segments_count,
},
running,
queued,
completed,
idle_segments,
} = other;
self.running.extend(running);
self.summary.queued_optimizations += queued_optimizations;
self.summary.queued_segments += queued_segments;
self.summary.queued_points += queued_points;
self.summary.idle_segments += idle_segments_count;
merge_optional_vec(&mut self.completed, completed);
merge_optional_vec(&mut self.queued, queued);
merge_optional_vec(&mut self.idle_segments, idle_segments);
}
}
fn merge_optional_vec<T>(target: &mut Option<Vec<T>>, source: Option<Vec<T>>) {
match (target.as_mut(), source) {
(Some(target), Some(source)) => target.extend(source),
(None, source @ Some(_)) => *target = source,
(Some(_) | None, None) => {}
}
}
#[derive(Debug, Default, Serialize, Deserialize, JsonSchema)]
pub struct OptimizationsSummary {
pub queued_optimizations: usize,
pub queued_segments: usize,
pub queued_points: usize,
pub idle_segments: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct PendingOptimization {
pub optimizer: String,
pub segments: Vec<OptimizationSegmentInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub struct OptimizationSegmentInfo {
pub uuid: Uuid,
pub points_count: usize,
}
#[derive(Debug, Copy, Clone)]
pub struct OptimizationsRequestOptions {
pub queued: bool,
pub completed_limit: Option<usize>,
pub idle_segments: bool,
}
#[derive(Debug, Clone, Copy)]
pub struct OptimizerThresholds {
pub max_segment_size_kb: usize,
pub memmap_threshold_kb: usize,
pub indexing_threshold_kb: usize,
pub deferred_internal_id: Option<PointOffsetType>,
}