fix(scheduler): address !7 REQUEST_CHANGES
- seed: check completed_key before no_source so same-day last_completed is already_completed (not 10m retry) - scheduler: resolve TaskControl ok/error before logging; ok=False logs task_fail, not task_ok - candidate_cleanup: catch failures, record task, retry ~5m like discover
This commit is contained in:
1 parent
bb18d232f6
commit
1697573d95
7 files changed
+264
-17
No files matched your search
+14
-4
@@ -730,10 +730,20 @@ def cmd_run(args, logger: JsonLogger, *, serve_web: bool = False) -> int:
|
||||
return _quiet_window_defer(
|
||||
repo, logger, "candidate_cleanup", started_at=started,
|
||||
)
|
||||
removed = repo.delete_expired_candidates(
|
||||
ttl_days=cfg.schedule.candidate_ttl_days
|
||||
)
|
||||
expired = repo.expire_fav_actions()
|
||||
try:
|
||||
removed = repo.delete_expired_candidates(
|
||||
ttl_days=cfg.schedule.candidate_ttl_days
|
||||
)
|
||||
expired = repo.expire_fav_actions()
|
||||
except Exception as exc: # noqa: BLE001 记录后约 5 分钟补跑
|
||||
finished = int(time.time())
|
||||
_record_task(
|
||||
repo, "candidate_cleanup", ok=False, started_at=started,
|
||||
finished_at=finished, error=str(exc),
|
||||
)
|
||||
return TaskControl(
|
||||
ok=False, next_run=_retry_soon(float(finished)), error=str(exc),
|
||||
)
|
||||
if removed or expired:
|
||||
repo.bump_cache_version("videos")
|
||||
finished = int(time.time())
|
||||
|
||||
@@ -87,11 +87,9 @@ class Scheduler:
|
||||
raw = task.fn()
|
||||
except Exception as exc: # noqa: BLE001 单任务失败不终止调度
|
||||
error = str(exc)
|
||||
self._log("error", "scheduler.task_error", task=task.name, error=error)
|
||||
else:
|
||||
if isinstance(raw, TaskControl):
|
||||
control = raw
|
||||
self._log("info", "scheduler.task_ok", task=task.name)
|
||||
finished = self._clock()
|
||||
if control is not None and control.next_run is not None:
|
||||
task.next_run = float(control.next_run)
|
||||
@@ -104,6 +102,23 @@ class Scheduler:
|
||||
ok = bool(control.ok) and error is None
|
||||
if control.error and error is None:
|
||||
error = control.error
|
||||
# Skip/fail ≠ success:先定 ok/error,再记 scheduler 日志。
|
||||
if ok:
|
||||
self._log("info", "scheduler.task_ok", task=task.name)
|
||||
elif control is not None:
|
||||
self._log(
|
||||
"warning",
|
||||
"scheduler.task_fail",
|
||||
task=task.name,
|
||||
error=error,
|
||||
)
|
||||
else:
|
||||
self._log(
|
||||
"error",
|
||||
"scheduler.task_error",
|
||||
task=task.name,
|
||||
error=error,
|
||||
)
|
||||
result = TaskResult(
|
||||
name=task.name,
|
||||
started_at=started,
|
||||
|
||||
@@ -538,16 +538,8 @@ class SnapshotService:
|
||||
raise ValueError(f"日期格式必须是 YYYY-MM-DD: {stat_date!r}")
|
||||
|
||||
summary = SnapshotSummary(stat_date=stat_date, started_at=now)
|
||||
source = self.repo.kv_get("snapshot:last_completed")
|
||||
if not source or source >= stat_date:
|
||||
self._log(
|
||||
"info", "snapshot.seed_skip",
|
||||
stat_date=stat_date, reason="no_source", source=source,
|
||||
)
|
||||
summary.finished_at = self._now()
|
||||
summary.completed = False
|
||||
summary.reason = "no_source"
|
||||
return summary
|
||||
# 目标日已完成:先于 no_source。全站快照当天完成后
|
||||
# last_completed == stat_date,不可误判为无源再 10 分钟重试。
|
||||
if self.repo.kv_get(self.completed_key(stat_date)) == "1":
|
||||
self._log(
|
||||
"info", "snapshot.seed_skip",
|
||||
@@ -558,6 +550,16 @@ class SnapshotService:
|
||||
summary.already_completed = True
|
||||
summary.reason = "already_completed"
|
||||
return summary
|
||||
source = self.repo.kv_get("snapshot:last_completed")
|
||||
if not source or source >= stat_date:
|
||||
self._log(
|
||||
"info", "snapshot.seed_skip",
|
||||
stat_date=stat_date, reason="no_source", source=source,
|
||||
)
|
||||
summary.finished_at = self._now()
|
||||
summary.completed = False
|
||||
summary.reason = "no_source"
|
||||
return summary
|
||||
if self.repo.kv_get(self.seeded_key(stat_date)) == "1":
|
||||
self._log(
|
||||
"info", "snapshot.seed_skip",
|
||||
|
||||
Reference in new issue
Block a user