Skip to content

Commit f5c3ee3

Browse files
committed
fix: avoid pulling results
1 parent 549e37c commit f5c3ee3

File tree

1 file changed

+30
-12
lines changed

1 file changed

+30
-12
lines changed

api/app/services/jobs.py

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,7 @@ def list_jobs(self, filters: JobListFilters | None = None) -> tuple[list[JobDeta
145145
if not any(tag in job_tags for tag in filters.tags):
146146
continue
147147

148-
job_detail = self._map_rq_job_to_schema(job, queue.name)
149-
job_detail.status = job_status
148+
job_detail = self._map_rq_job_to_schema(job, queue.name, include_result=False, status=job_status)
150149

151150
if filters.created_after and job_detail.created_at < filters.created_after:
152151
continue
@@ -375,8 +374,15 @@ def _determine_job_queue(self, rq_job: Job) -> str:
375374

376375
return "default"
377376

378-
def _map_rq_job_to_schema(self, rq_job: Job, queue_name: str) -> JobDetails:
379-
"""Map RQ job object to JobDetails schema."""
377+
def _map_rq_job_to_schema(self, rq_job: Job, queue_name: str, include_result: bool = True, status: JobStatus | None = None) -> JobDetails:
378+
"""Map RQ job object to JobDetails schema.
379+
380+
Args:
381+
rq_job: The RQ job object
382+
queue_name: The queue name
383+
include_result: Whether to include the job result (expensive, defaults True)
384+
status: Pre-determined status to avoid Redis call (optional)
385+
"""
380386
try:
381387
# Map RQ status to our schema status
382388
status_mapping = {
@@ -390,8 +396,10 @@ def _map_rq_job_to_schema(self, rq_job: Job, queue_name: str) -> JobDetails:
390396
'canceled': JobStatus.CANCELED,
391397
}
392398

393-
# Determine job status
394-
status = status_mapping.get(rq_job.get_status().lower(), JobStatus.QUEUED)
399+
if status is not None:
400+
job_status = status
401+
else:
402+
job_status = status_mapping.get(rq_job.get_status().lower(), JobStatus.QUEUED)
395403

396404
# Get job metadata
397405
meta_data = {}
@@ -405,22 +413,32 @@ def _map_rq_job_to_schema(self, rq_job: Job, queue_name: str) -> JobDetails:
405413
try:
406414
func_name = rq_job.func_name or "unknown"
407415
except Exception:
408-
func_name = "unknown (deserialization error)"
416+
func_name = "unknown"
417+
418+
try:
419+
args = rq_job.args or []
420+
except Exception:
421+
args = []
422+
423+
try:
424+
kwargs = rq_job.kwargs or {}
425+
except Exception:
426+
kwargs = {}
409427

410428
return JobDetails(
411429
id=rq_job.id,
412430
created_at=ensure_timezone_aware(rq_job.created_at) or get_timezone_aware_now(),
413431
func_name=func_name,
414-
args=list(rq_job.args) if rq_job.args else [],
415-
kwargs=dict(rq_job.kwargs) if rq_job.kwargs else {},
416-
status=status,
432+
args=args,
433+
kwargs=kwargs,
434+
status=job_status,
417435
queue=queue_name,
418436
worker_name=rq_job.worker_name,
419437
started_at=ensure_timezone_aware(rq_job.started_at),
420438
ended_at=ensure_timezone_aware(rq_job.ended_at),
421439
duration_seconds=duration_seconds,
422440
last_heartbeat=ensure_timezone_aware(getattr(rq_job, 'last_heartbeat', None)),
423-
result=rq_job.result,
441+
result=rq_job.result if include_result else None,
424442
exc_info=rq_job.exc_info,
425443
traceback=getattr(rq_job, 'exc_info', None),
426444
meta_full=meta_data,
@@ -437,7 +455,7 @@ def _map_rq_job_to_schema(self, rq_job: Job, queue_name: str) -> JobDetails:
437455
)
438456

439457
except Exception as e:
440-
logger.error(f"Error mapping job {rq_job.id}: {e}")
458+
logger.error(f"Error mapping job {rq_job.id}: {e}", exc_info=True)
441459
# Safely get job ID without triggering deserialization
442460
job_id = getattr(rq_job, 'id', 'unknown')
443461
return JobDetails(

0 commit comments

Comments
 (0)