fix(scheduler): drop cross-task mutex, quiet window + retry
Incident: evening full snapshot could be recorded as ok with already_completed/elapsed=0 after mutual skip with hourly sync, then next_run jumped to the next day. - Full-site snapshot never skips because another task is running - 23:00-01:00 Asia/Shanghai: defer discovery / snapshot_recent / candidate_cleanup to after 01:00; fans never defers - Skip records ok=false + skipped=true (not success / not completed) - Skip/fail reschedule soon (~5m); daily success still next snapshot_at - TaskControl return value drives next_run; system UI shows skip fields
This commit is contained in:
1 parent
39378c65b2
commit
9969e65202
10 files changed
+411
-84
No files matched your search
+26
-1
@@ -8,7 +8,7 @@ import threading
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
sys.stdout.reconfigure(encoding="utf-8")
|
||||
|
||||
from reaction_board.scheduler import ScheduledTask, Scheduler # noqa: E402
|
||||
from reaction_board.scheduler import ScheduledTask, Scheduler, TaskControl # noqa: E402
|
||||
|
||||
|
||||
def test_run_when_due_and_reschedule():
|
||||
@@ -128,9 +128,34 @@ def test_next_run_fn_controls_reschedule():
|
||||
assert calls == [1_000.0, 1_123.0]
|
||||
|
||||
|
||||
|
||||
def test_task_control_overrides_ok_and_next_run():
|
||||
clock = [1_000.0]
|
||||
task = ScheduledTask(
|
||||
"defer",
|
||||
60,
|
||||
lambda: TaskControl(ok=False, next_run=1_500.0, error="quiet"),
|
||||
)
|
||||
scheduler = Scheduler([task], clock=lambda: clock[0])
|
||||
results = scheduler.run_due()
|
||||
assert len(results) == 1
|
||||
assert results[0].ok is False
|
||||
assert results[0].error == "quiet"
|
||||
assert task.next_run == 1_500.0
|
||||
# 未到 next_run 不重跑
|
||||
clock[0] = 1_499.0
|
||||
assert scheduler.run_due() == []
|
||||
clock[0] = 1_500.0
|
||||
task.fn = lambda: TaskControl(ok=True, next_run=2_000.0)
|
||||
results = scheduler.run_due()
|
||||
assert results[0].ok is True
|
||||
assert task.next_run == 2_000.0
|
||||
|
||||
|
||||
def main():
|
||||
test_run_when_due_and_reschedule()
|
||||
test_next_run_fn_controls_reschedule()
|
||||
test_task_control_overrides_ok_and_next_run()
|
||||
test_task_error_does_not_block_other_tasks()
|
||||
test_run_forever_with_stop_event()
|
||||
test_max_iterations_and_validation()
|
||||
|
||||
Reference in new issue
Block a user