Skip to main content

lellm_graph/
checkpoint_policy.rs

1//! Checkpoint 策略 — Trigger / Retention 分层。
2//!
3//! v0.5 重构:将原来的 `CheckpointPolicy` enum 拆分为两层正交策略:
4//!
5//! ```text
6//! CheckpointConfig
7//!   ├── TriggerPolicy:    何时保存 Checkpoint
8//!   ├── RetentionPolicy:  保留多少个 Checkpoint
9//!   └── Store:            存储后端(BlobCheckpointStore)
10//! ```
11//!
12//! # 设计原则
13//!
14//! - **正交性**:Trigger 与 Retention 独立组合,互不干扰
15//! - **渐进式**:默认值与 v0.4 行为一致(EveryNode + KeepAll)
16//! - **可扩展**:未来可添加 OnMutation、TimeBased 等策略
17
18use std::time::Duration;
19
20// ─── TriggerPolicy ─────────────────────────────────────────────
21
22/// Checkpoint 触发策略 — 决定何时保存。
23#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
24pub enum TriggerPolicy {
25    /// 每次节点执行后保存(默认,与 v0.4 CheckpointPolicy::EveryNode 一致)
26    #[default]
27    EveryNode,
28    /// 仅在 Barrier 决策后保存
29    BarrierOnly,
30    /// 手动控制 — 调用方显式触发
31    Manual,
32    /// 有新 Mutation 时才保存(无 Mutation 的节点跳过)
33    OnMutation,
34}
35
36// ─── RetentionPolicy ───────────────────────────────────────────
37
38/// Checkpoint 保留策略 — 决定保留多少个。
39#[derive(Debug, Clone, Default, PartialEq, Eq)]
40pub enum RetentionPolicy {
41    /// 保留所有 Checkpoint(默认,与 v0.4 行为一致)
42    #[default]
43    KeepAll,
44    /// 仅保留最新的 N 个
45    KeepLatest(usize),
46    /// 保留指定时间范围内的 Checkpoint
47    TimeBased(Duration),
48}
49
50impl RetentionPolicy {
51    /// 根据策略计算需要保留的数量。
52    ///
53    /// - `KeepAll` → `None`(不修剪)
54    /// - `KeepLatest(n)` → `Some(n)`
55    /// - `TimeBased` → `None`(需要存储层按时间判断,暂不支援自动修剪)
56    pub fn prune_keep(&self) -> Option<usize> {
57        match self {
58            RetentionPolicy::KeepAll => None,
59            RetentionPolicy::KeepLatest(n) => Some(*n),
60            RetentionPolicy::TimeBased(_) => None, // 需要存储层支持
61        }
62    }
63}
64
65// ─── 向后兼容 ──────────────────────────────────────────────────
66
67/// v0.4 的 CheckpointPolicy — 已弃用,请使用 TriggerPolicy。
68#[allow(deprecated)]
69#[deprecated(
70    since = "0.5.0",
71    note = "Use TriggerPolicy instead. EveryNode → TriggerPolicy::EveryNode, \
72            BarrierOnly → TriggerPolicy::BarrierOnly, Manual → TriggerPolicy::Manual"
73)]
74#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
75pub enum CheckpointPolicy {
76    #[default]
77    EveryNode,
78    BarrierOnly,
79    Manual,
80}
81
82#[allow(deprecated)]
83impl From<CheckpointPolicy> for TriggerPolicy {
84    fn from(policy: CheckpointPolicy) -> Self {
85        match policy {
86            CheckpointPolicy::EveryNode => TriggerPolicy::EveryNode,
87            CheckpointPolicy::BarrierOnly => TriggerPolicy::BarrierOnly,
88            CheckpointPolicy::Manual => TriggerPolicy::Manual,
89        }
90    }
91}