Fix webhook starvation and isolate scheduled job failures for v0.1.2 [skip ci]
This commit is contained in:
@@ -93,3 +93,58 @@ def test_worker_checks_late_sync_before_due_tasks(app, service, monkeypatch):
|
||||
monkeypatch.setattr(service, "process_one", lambda: False)
|
||||
scheduler.run()
|
||||
assert calls[:2] == ["sync", "tick"]
|
||||
|
||||
|
||||
def test_blocked_job_keeps_retry_slot_without_blocking_worker(
|
||||
app, service, monkeypatch
|
||||
):
|
||||
scheduler = app.state.scheduler
|
||||
service.registry.drivers["other-room"] = service.registry.get("living-room")
|
||||
jobs = []
|
||||
for device in ("living-room", "other-room"):
|
||||
jobs.append(
|
||||
scheduler.save_job(
|
||||
JobInput(
|
||||
name=device,
|
||||
device_id=device,
|
||||
schedule={"type": "daily", "time": "07:00"},
|
||||
source={"type": "restore"},
|
||||
)
|
||||
)
|
||||
)
|
||||
current = datetime.now(UTC)
|
||||
due = (current - timedelta(seconds=2)).isoformat()
|
||||
service.db.execute("UPDATE jobs SET next_run=?", (due,))
|
||||
unknown = service.submit("display", {}, "living-room", "test", "unknown")
|
||||
service.db.execute(
|
||||
"UPDATE operations SET status='UNKNOWN',write_started=1 WHERE id=?", (unknown,)
|
||||
)
|
||||
queued = service.submit("render", {}, "living-room", "test", "render")
|
||||
calls = []
|
||||
monkeypatch.setattr(service, "sync", lambda: None)
|
||||
monkeypatch.setattr(service, "expire", lambda: calls.append("expire"))
|
||||
monkeypatch.setattr(service.cloud_library, "sweep", lambda: None)
|
||||
monkeypatch.setattr(service.local_retention, "sweep", lambda: None)
|
||||
|
||||
def process():
|
||||
calls.append("process")
|
||||
assert service.operation(queued)["status"] == "QUEUED"
|
||||
scheduler.stop_event.set()
|
||||
return False
|
||||
|
||||
monkeypatch.setattr(service, "process_one", process)
|
||||
monkeypatch.setattr(
|
||||
scheduler.stop_event, "wait", lambda timeout: scheduler.stop_event.set()
|
||||
)
|
||||
scheduler.run()
|
||||
assert calls == ["expire", "process"]
|
||||
blocked = service.db.one("SELECT * FROM jobs WHERE id=?", (jobs[0]["id"],))
|
||||
assert blocked["next_run"] == due
|
||||
assert blocked["last_run"] is None
|
||||
assert len(service.db.all("SELECT * FROM job_runs")) == 1
|
||||
assert service.db.one("SELECT * FROM job_runs")["job_id"] == jobs[1]["id"]
|
||||
scheduler.tick(current + timedelta(minutes=6))
|
||||
assert (
|
||||
service.db.one("SELECT * FROM jobs WHERE id=?", (jobs[0]["id"],))["last_result"]
|
||||
== "SKIPPED_OVERDUE"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user