-
- Downloads
[FIX] base: serialization bug when acquiring cron
Start Odoo with multiple cron threads (e.g. --max-cron-threads=4), trigger many crons at once, there is a chance one of the cron thread fails due to a serialization error. Inside of the `_acquire_one_job` function, the query evaluates many rows to find one that fit multiple requirements. Two of those requirements are (1) that the `nextcall` of the row is in the past or (2) that it exists a cron trigger for that cron with a `call_at` in the past. In case the `nextcall` of one of those rows is modified or the cron triggers are removed by another transaction then there can be a serialisation failure in the current transaction. This serialisation error is important, it prevents the current cron worker from acquiring a cron job that has been processed in another cron worker. The problem is that that postgres doesn't tell which row was modified by the other transaction (=processed by another worker cron) so it is not possible to just skip that cron and continue with the others. Our solution is to limit the WHERE clause of the `_acquire_one_job` function to a single row. In case there is a serialization failure we know the cron was processed in another job and we can skip it. Closes #96584 closes odoo/odoo#92387 Signed-off-by:Julien Castiaux <juc@odoo.com> Co-authored-by:
Julien Castiaux <juc@odoo.com>
Loading
Please register or sign in to comment