-
-
Notifications
You must be signed in to change notification settings - Fork 532
Description
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)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^