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:
1 parent
9969e65202
commit
bb18d232f6
7 files changed
+374
-8
No files matched your search
@@ -711,6 +711,51 @@ def test_snapshot_failed_next_run_retries_soon_not_next_day():
|
||||
db.close()
|
||||
|
||||
|
||||
def test_snapshot_seed_skip_next_run_retries_ten_minutes():
|
||||
import json
|
||||
from datetime import datetime
|
||||
from reaction_board.timeutil import SHANGHAI_TZ, next_daily_run
|
||||
|
||||
with tempfile.TemporaryDirectory() as tmp:
|
||||
db, q = setup(tmp)
|
||||
try:
|
||||
repo = Repository(db)
|
||||
finished = int(datetime(2026, 11, 1, 0, 0, 0, tzinfo=SHANGHAI_TZ).timestamp())
|
||||
repo.kv_set(
|
||||
"task:last:snapshot_seed",
|
||||
json.dumps({
|
||||
"name": "snapshot_seed", "ok": False, "skipped": True,
|
||||
"started_at": finished - 1, "finished_at": finished,
|
||||
"error": "snapshot_running",
|
||||
"summary": {"skipped": True, "reason": "snapshot_running"},
|
||||
}),
|
||||
)
|
||||
DASHBOARD_CACHE.clear()
|
||||
system = q.system()
|
||||
assert system["next_runs"]["snapshot_seed"] == finished + 600
|
||||
assert system["next_runs"]["snapshot_seed"] != int(
|
||||
next_daily_run(finished, "00:00")
|
||||
)
|
||||
# skip 不算 errors
|
||||
assert not any(e["task"] == "snapshot_seed" for e in system["errors"])
|
||||
|
||||
# no_source 同样 10 分钟
|
||||
repo.kv_set(
|
||||
"task:last:snapshot_seed",
|
||||
json.dumps({
|
||||
"name": "snapshot_seed", "ok": False, "skipped": True,
|
||||
"started_at": finished - 1, "finished_at": finished,
|
||||
"error": "no_source",
|
||||
"summary": {"skipped": True, "reason": "no_source"},
|
||||
}),
|
||||
)
|
||||
DASHBOARD_CACHE.clear()
|
||||
system = q.system()
|
||||
assert system["next_runs"]["snapshot_seed"] == finished + 600
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
|
||||
|
||||
def test_overview_adjacent_previous_with_seed_and_dual_fields():
|
||||
"""seed 当日行存在时,播放增量按片相邻成功日;overview 暴露更新时刻与总数。"""
|
||||
@@ -964,6 +1009,7 @@ def main_test():
|
||||
test_snapshot_recent_next_run_follows_completion()
|
||||
test_snapshot_recent_next_run_defers_quiet_window_and_retry_on_skip()
|
||||
test_snapshot_failed_next_run_retries_soon_not_next_day()
|
||||
test_snapshot_seed_skip_next_run_retries_ten_minutes()
|
||||
test_overview_adjacent_previous_with_seed_and_dual_fields()
|
||||
test_same_day_growth_baselines()
|
||||
test_growth_rate_sort_uses_prior()
|
||||
|
||||
Reference in new issue
Block a user