Eslam Ahmed
Eslam Ahmed

Reputation: 302

could not serialize access due to concurrent update while creating pos picking from a job

Impacted versions: 12.0

Steps to reproduce: I have made a customization to postpone the creation of pos order picking and delegate the task to a job some time i get the error below

Current behavior: 2020-06-18 17:49:24,588 1370 ERROR cafe9.rabeh.io odoo.addons.base.models.ir_cron: Call from cron POS Orders: Process Pending Orders for server action #610 failed in Job #24 Traceback (most recent call last):

File "/opt/rabeh/odoo/odoo/addons/base/models/ir_cron.py", line 102, in _callback self.env['ir.actions.server'].browse(server_action_id).run()

File "/opt/rabeh/odoo/odoo/addons/base/models/ir_actions.py", line 569, in run res = func(action, eval_context=eval_context)

File "/opt/rabeh/odoo/odoo/addons/base/models/ir_actions.py", line 445, in run_action_code_multi safe_eval(action.sudo().code.strip(), eval_context, mode="exec", nocopy=True) # nocopy allows to return 'action'

File "/opt/rabeh/odoo/odoo/tools/safe_eval.py", line 350, in safe_eval return unsafe_eval(c, globals_dict, locals_dict)

File "/opt/rabeh-12/rabeh_addons/pos_pending_session/models/pos_order.py", line 68, in pending_picking_creation po_order.create_picking()

File "/opt/rabeh-12/rabeh_addons/pos_pending_session/models/pos_order.py", line 36, in create_picking res = super(PosOrder, orders).create_picking()

File "/opt/rabeh/odoo/addons/point_of_sale/models/pos_order.py", line 841, in create_picking order._force_picking_done(order_picking)

File "/opt/rabeh/odoo/addons/point_of_sale/models/pos_order.py", line 856, in _force_picking_done picking.action_done()

File "/opt/rabeh/odoo/addons/stock/models/stock_picking.py", line 631, in action_done todo_moves._action_done()

File "/opt/rabeh/odoo/addons/purchase_stock/models/stock.py", line 96, in _action_done res = super(StockMove, self)._action_done()

File "/opt/rabeh/odoo/addons/stock_account/models/stock.py", line 389, in _action_done res = super(StockMove, self)._action_done()

File "/opt/rabeh/odoo/addons/stock/models/stock_move.py", line 1137, in _action_done moves_todo.mapped('move_line_ids')._action_done()

File "/opt/rabeh/odoo/addons/stock/models/stock_move_line.py", line 445, in _action_done Quant._update_available_quantity(ml.product_id, ml.location_dest_id, quantity, lot_id=ml.lot_id, package_id=ml.result_package_id, owner_id=ml.owner_id, in_date=in_date)

File "/opt/rabeh/odoo/addons/stock/models/stock_quant.py", line 216, in _update_available_quantity self._cr.execute("SELECT 1 FROM stock_quant WHERE id = %s FOR UPDATE NOWAIT", [quant.id], log_exceptions=False)

File "/opt/rabeh/odoo/odoo/sql_db.py", line 148, in wrapper return f(self, *args, **kwargs)

File "/opt/rabeh/odoo/odoo/sql_db.py", line 225, in execute res = self._obj.execute(query, params)

psycopg2.errors.SerializationFailure: could not serialize access due to concurrent update

Expected behavior: i think this line should generate could not obtain lock i was just wondering when it could generate "could not serialize access due to concurrent update"

Upvotes: 0

Views: 2325

Answers (1)

jjanes
jjanes

Reputation: 44323

It could have obtained the lock, as the lock is currently available. But it had been locked at some previous point which overlaps with the current transaction's snapshot. So obtaining the lock is possible, but would create a serialization problem if it were to acquire it. Reporting that as a serialization failure seems like the correct outcome.

Using FOR UPDATE NOWAIT in a transaction with elevated isolation level seems inconsistent, or at least unnecessary. What are you hoping to accomplish by doing this? Your description of "while creating pos picking from a job" doesn't elucidate this for me. Is that some odoo-specific jargon?

Upvotes: 0

Related Questions