Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

[18.0] queue_job: job failed to be requeued or cancelled if function is removed while job not yet done

Aperta
#864 2 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
3/5
Tempo stimato
1-2 giorni
Idoneità per principianti
38/100
Tipo di issue
Bug
Chiarezza
Abbastanza chiara
Stato di attività
Tranquilla
Stack tecnologico
python
Ambito
backend

Direzione di ricerca

The failure is in _change_job_state in queue_job/models/queue_job.py, which calls Job.load, and in _load_from_db_record in queue_job/job.py, where getattr(recordset, method_name) raises once the function is removed. Start by reading those two spots and deciding whether state-only actions (requeue, cancel, set done) can skip resolving the method. Done means those actions succeed on a job whose method no longer exists, with a test covering that case. The issue itself leaves the expected behaviour open, so check with maintainers first.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

bug

Module

queue_job

Describe the bug

If a job having its function (job.method_name) removed, while being pending/enqueued or failed (maybe, I haven't double checked but I think loading failed jobs during initialization), the job runner will stuck trying to requeue the job as failing to load the job. Trying to cancel to unlink the job from UI will also fail due to the same reason.

To Reproduce

Affected versions: 18.0 but properly other versions too.

Steps to reproduce the behavior: Explained in the description.

Expected behavior
I don't really know whether this is truly a bug, or it's missing a reliable way to prevent this from happening, maybe it's a rule of thumb to not having function removed if it's used in queue job, but since function can be enqueue anywhere using with_delay or delayable(), it's hard to tell which functions are used with queue job. Unless we always define job as job function to allow enqueueing it.

A way to prevent this issue from happening without enforcing how to implement jobs or control the development is to not loading the job if we are just setting the state of it (requeue, cancel or set done).

Additional context
Below is where it fails, since method_name is removed, getattr simply break

  File "/opt/odoo/src/queue/queue_job/models/queue_job.py", line 309, in _change_job_state
    job_ = Job.load(record.env, record.uuid)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/odoo/src/queue/queue_job/job.py", line 213, in load
    return cls._load_from_db_record(stored)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/opt/odoo/src/queue/queue_job/job.py", line 288, in _load_from_db_record
    method = getattr(recordset, method_name)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Lingua principale
Python
Stelle
271
Fork
602
Merge medio
5g 1h
PR unite (30g)
7

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di OCA/queue

Tutte le issue di OCA/queue

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.