[IMP] odoo: dump stacktrace of timed out threaded workers
So the logs contain some indication as to what was exceeding the limits. closes odoo/odoo#37303 X-original-commit: 0a266f444a0abda026d09ad88024dca1c50c92b9 Signed-off-by: Denis Vermylen <Icallhimtest@users.noreply.github.com>
This commit is contained in:
@@ -507,6 +507,8 @@ class ThreadedServer(CommonServer):
|
|||||||
# We wait there is no processing requests
|
# We wait there is no processing requests
|
||||||
# other than the ones exceeding the limits, up to 1 min,
|
# other than the ones exceeding the limits, up to 1 min,
|
||||||
# before asking for a reload.
|
# before asking for a reload.
|
||||||
|
_logger.info('Dumping stacktrace of limit exceeding threads before reloading')
|
||||||
|
dumpstacks(thread_idents=[thread.ident for thread in self.limits_reached_threads])
|
||||||
self.reload()
|
self.reload()
|
||||||
# `reload` increments `self.quit_signals_received`
|
# `reload` increments `self.quit_signals_received`
|
||||||
# and the loop will end after this iteration,
|
# and the loop will end after this iteration,
|
||||||
|
|||||||
+13
-10
@@ -909,8 +909,10 @@ class ConstantMapping(Mapping):
|
|||||||
return self._value
|
return self._value
|
||||||
|
|
||||||
|
|
||||||
def dumpstacks(sig=None, frame=None):
|
def dumpstacks(sig=None, frame=None, thread_idents=None):
|
||||||
""" Signal handler: dump a stack trace for each existing thread."""
|
""" Signal handler: dump a stack trace for each existing thread or given
|
||||||
|
thread(s) specified through the ``thread_idents`` sequence.
|
||||||
|
"""
|
||||||
code = []
|
code = []
|
||||||
|
|
||||||
def extract_stack(stack):
|
def extract_stack(stack):
|
||||||
@@ -927,14 +929,15 @@ def dumpstacks(sig=None, frame=None):
|
|||||||
'url': getattr(th, 'url', 'n/a')}
|
'url': getattr(th, 'url', 'n/a')}
|
||||||
for th in threading.enumerate()}
|
for th in threading.enumerate()}
|
||||||
for threadId, stack in sys._current_frames().items():
|
for threadId, stack in sys._current_frames().items():
|
||||||
thread_info = threads_info.get(threadId, {})
|
if not thread_idents or threadId in thread_idents:
|
||||||
code.append("\n# Thread: %s (db:%s) (uid:%s) (url:%s)" %
|
thread_info = threads_info.get(threadId, {})
|
||||||
(thread_info.get('repr', threadId),
|
code.append("\n# Thread: %s (db:%s) (uid:%s) (url:%s)" %
|
||||||
thread_info.get('dbname', 'n/a'),
|
(thread_info.get('repr', threadId),
|
||||||
thread_info.get('uid', 'n/a'),
|
thread_info.get('dbname', 'n/a'),
|
||||||
thread_info.get('url', 'n/a')))
|
thread_info.get('uid', 'n/a'),
|
||||||
for line in extract_stack(stack):
|
thread_info.get('url', 'n/a')))
|
||||||
code.append(line)
|
for line in extract_stack(stack):
|
||||||
|
code.append(line)
|
||||||
|
|
||||||
if odoo.evented:
|
if odoo.evented:
|
||||||
# code from http://stackoverflow.com/questions/12510648/in-gevent-how-can-i-dump-stack-traces-of-all-running-greenlets
|
# code from http://stackoverflow.com/questions/12510648/in-gevent-how-can-i-dump-stack-traces-of-all-running-greenlets
|
||||||
|
|||||||
Reference in New Issue
Block a user