Skip to content

Commit d04f15f

Browse files
committed
Reject malformed durable CPG jobs safely
1 parent c2f9a7e commit d04f15f

1 file changed

Lines changed: 18 additions & 0 deletions

File tree

src/tools/core_tools.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"""
66

77
import asyncio
8+
import inspect
89
import uuid
910
from contextlib import nullcontext
1011
from datetime import datetime, timedelta, timezone
@@ -1643,6 +1644,23 @@ async def _worker(self) -> None:
16431644
job_id = job["id"]
16441645
payload = dict(job["payload"])
16451646
payload["services"] = self.services
1647+
payload.setdefault("codebase_hash", job["codebase_hash"])
1648+
# Jobs created by older clients/tests may contain only a partial
1649+
# payload. Do not invoke the strict generation coroutine with
1650+
# missing positional arguments (which otherwise leaves noisy
1651+
# retry/failure logs and can consume a worker during integration
1652+
# runs). Mark malformed durable jobs failed and continue polling.
1653+
required = ("codebase_dir", "cpg_path", "language", "container_cpg_path")
1654+
signature = inspect.signature(_generate_cpg_async)
1655+
validates_payload = not any(
1656+
parameter.kind is inspect.Parameter.VAR_KEYWORD
1657+
for parameter in signature.parameters.values()
1658+
)
1659+
if validates_payload and any(payload.get(key) in (None, "") for key in required):
1660+
error = f"Malformed generate_cpg payload; missing one of: {', '.join(required)}"
1661+
logger.error("CPG generation job %s rejected: %s", job_id, error)
1662+
await loop.run_in_executor(None, self.store.fail_job, job_id, error)
1663+
continue
16461664
try:
16471665
await _generate_cpg_async(**payload)
16481666
await loop.run_in_executor(None, self.store.complete_job, job_id)

0 commit comments

Comments
 (0)