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}