Skip to content

Commit d8c8c20

Browse files
committed
shopfloor_base: Add debug loggers on lock acquiring and lifting
1 parent fa12184 commit d8c8c20

File tree

1 file changed

+39
-3
lines changed

1 file changed

+39
-3
lines changed

shopfloor_base/actions/lock.py

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,17 @@
22
# Copyright 2023 Camptocamp SA (http://www.camptocamp.com)
33
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
44
import hashlib
5+
import logging
56
import struct
7+
import time
8+
from functools import partial
69

710
from odoo.tools import str2bool
811

912
from odoo.addons.component.core import Component
1013

14+
_logger = logging.getLogger(__name__)
15+
1116

1217
class LockAction(Component):
1318
"""Provide methods to create database locks"""
@@ -50,15 +55,46 @@ def for_update(self, records, log_exceptions=False, skip_locked=False):
5055
.sudo()
5156
.get_param("shopfloor.lock.for_update.no_wait")
5257
)
58+
5359
for_update_str = " FOR NO KEY UPDATE " if no_key else " FOR UPDATE "
5460
query = "SELECT id FROM %s WHERE ID IN %%s " + for_update_str
61+
62+
suffix = ""
5563
if skip_locked:
56-
query += " SKIP LOCKED"
64+
suffix = " SKIP LOCKED"
5765
elif no_wait:
58-
query += " NOWAIT"
66+
suffix = " NOWAIT"
67+
query += suffix
68+
5969
sql = query % records._table
70+
71+
with_suffix_str = f" with suffix{suffix}" if suffix else ""
72+
_logger.debug(
73+
f"Trying to acquire {for_update_str} lock{with_suffix_str} on "
74+
f"{records._table} for IDs {sorted(records.ids)}"
75+
)
76+
77+
start_time = time.perf_counter()
78+
6079
self.env.cr.execute(sql, (tuple(records.ids),), log_exceptions=log_exceptions)
80+
81+
end_time = time.perf_counter()
82+
execute_time = end_time - start_time
83+
84+
rows = self.env.cr.fetchall()
85+
_logger.debug(
86+
f"Lock was acquired on {records._table} for IDs "
87+
f"{sorted([row[0] for row in rows])} in {execute_time:0.4f} seconds"
88+
)
89+
90+
self.env.cr.postcommit.add(partial(self._log_lock_release, records))
91+
self.env.cr.postrollback.add(partial(self._log_lock_release, records))
92+
6193
if skip_locked:
62-
rows = self.env.cr.fetchall()
6394
return len(rows) == len(records)
6495
return True
96+
97+
def _log_lock_release(self, records):
98+
_logger.debug(
99+
f"Lock was released on {records._table} for IDs {sorted(records.ids)}"
100+
)

0 commit comments

Comments
 (0)