feat(scheduler): add snapshot-seed CLI and 10m seed deferral

Add `python app.py snapshot-seed [--date]` (offline clone, Debian /
docker compose exec friendly). When seed fires while full-site snapshot
is running, or last_completed is missing (no_source), record skip as
non-success and retry in 10 minutes until a real seed succeeds; fans
and quiet-window rules unchanged.
This commit is contained in:
bot-ci committed 2026-11-03 00:22:11 +08:00
1 parent 9969e65202
commit bb18d232f6
7 files changed
+374 -8

No files matched your search

+7 -1
View File
@@ -51,6 +51,7 @@ class SnapshotSummary:
completed: bool = False
already_completed: bool = False
finished_at: int = 0
reason: str | None = None
errors: list[str] = field(default_factory=list)
def as_dict(self) -> dict[str, Any]:
@@ -73,6 +74,7 @@ class SnapshotSummary:
"backup_error": self.backup_error,
"completed": self.completed,
"already_completed": self.already_completed,
"reason": self.reason,
"errors": self.errors,
}
@@ -543,7 +545,8 @@ class SnapshotService:
stat_date=stat_date, reason="no_source", source=source,
)
summary.finished_at = self._now()
summary.completed = True
summary.completed = False
summary.reason = "no_source"
return summary
if self.repo.kv_get(self.completed_key(stat_date)) == "1":
self._log(
@@ -553,6 +556,7 @@ class SnapshotService:
summary.finished_at = self._now()
summary.completed = True
summary.already_completed = True
summary.reason = "already_completed"
return summary
if self.repo.kv_get(self.seeded_key(stat_date)) == "1":
self._log(
@@ -562,6 +566,7 @@ class SnapshotService:
summary.finished_at = self._now()
summary.completed = True
summary.already_completed = True
summary.reason = "already_seeded"
return summary
copied = self.repo.copy_ok_snapshots(
@@ -583,6 +588,7 @@ class SnapshotService:
self.repo.bump_cache_version("fans")
summary.finished_at = self._now()
summary.completed = True # seed 任务本身成功;不等于快照落盘完成
summary.reason = "seeded"
self._log(
"info", "snapshot.seed_done",
stat_date=stat_date, source=source,