fix(server): harden job eviction and worker against missing job id
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -30,6 +30,7 @@ def _touch(job: "Job", **changes):
|
|||||||
|
|
||||||
|
|
||||||
def _evict_if_needed():
|
def _evict_if_needed():
|
||||||
|
# Post-condition: len(JOBS) <= _MAX_JOBS (evicts oldest overflow entries).
|
||||||
if len(JOBS) <= _MAX_JOBS:
|
if len(JOBS) <= _MAX_JOBS:
|
||||||
return
|
return
|
||||||
for jid in sorted(JOBS, key=lambda j: JOBS[j].created_at)[: len(JOBS) - _MAX_JOBS]:
|
for jid in sorted(JOBS, key=lambda j: JOBS[j].created_at)[: len(JOBS) - _MAX_JOBS]:
|
||||||
@@ -50,7 +51,9 @@ def get_job(job_id: str) -> Optional["Job"]:
|
|||||||
def run_job(job_id: str, fn: Callable[[], dict], done_message: str,
|
def run_job(job_id: str, fn: Callable[[], dict], done_message: str,
|
||||||
fail_message: str = "Something went wrong while fetching.") -> None:
|
fail_message: str = "Something went wrong while fetching.") -> None:
|
||||||
def _task():
|
def _task():
|
||||||
job = JOBS[job_id]
|
job = JOBS.get(job_id)
|
||||||
|
if job is None:
|
||||||
|
return
|
||||||
_touch(job, status="running")
|
_touch(job, status="running")
|
||||||
try:
|
try:
|
||||||
result = fn()
|
result = fn()
|
||||||
|
|||||||
@@ -41,3 +41,15 @@ def test_run_job_failure_sets_failed():
|
|||||||
|
|
||||||
def test_get_unknown_job_returns_none():
|
def test_get_unknown_job_returns_none():
|
||||||
assert jobs.get_job("nope") is None
|
assert jobs.get_job("nope") is None
|
||||||
|
|
||||||
|
|
||||||
|
def test_eviction_keeps_within_cap():
|
||||||
|
jobs.JOBS.clear()
|
||||||
|
for i in range(jobs._MAX_JOBS + 25):
|
||||||
|
jobs.create_job(hit={"i": i}, message="m")
|
||||||
|
assert len(jobs.JOBS) <= jobs._MAX_JOBS
|
||||||
|
jobs.JOBS.clear()
|
||||||
|
|
||||||
|
|
||||||
|
def teardown_module():
|
||||||
|
jobs.JOBS.clear()
|
||||||
|
|||||||
Reference in New Issue
Block a user