diff options
| author | Denis Vermylen <dve@odoo.com> | 2019-09-19 07:36:36 +0000 |
|---|---|---|
| committer | fw-bot <otis@odoo.com> | 2019-09-23 14:16:04 +0000 |
| commit | bd3e510edbcd62f508dae28f573ee4d1a51bcf87 (patch) | |
| tree | b7225c214ff715d2ef19f99f629a1ec2616eec96 /odoo | |
| parent | c987515c9fd192d365bffb3bc3c3e8bdfe466645 (diff) | |
[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>
Diffstat (limited to 'odoo')
| -rw-r--r-- | odoo/service/server.py | 2 | ||||
| -rw-r--r-- | odoo/tools/misc.py | 23 |
2 files changed, 15 insertions, 10 deletions
diff --git a/odoo/service/server.py b/odoo/service/server.py index 9c4eafcc948..e6ad74bd027 100644 --- a/odoo/service/server.py +++ b/odoo/service/server.py @@ -507,6 +507,8 @@ class ThreadedServer(CommonServer): # We wait there is no processing requests # other than the ones exceeding the limits, up to 1 min, # 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() # `reload` increments `self.quit_signals_received` # and the loop will end after this iteration, diff --git a/odoo/tools/misc.py b/odoo/tools/misc.py index a551d8d829b..e8bf26b4af3 100644 --- a/odoo/tools/misc.py +++ b/odoo/tools/misc.py @@ -909,8 +909,10 @@ class ConstantMapping(Mapping): return self._value -def dumpstacks(sig=None, frame=None): - """ Signal handler: dump a stack trace for each existing thread.""" +def dumpstacks(sig=None, frame=None, thread_idents=None): + """ Signal handler: dump a stack trace for each existing thread or given + thread(s) specified through the ``thread_idents`` sequence. + """ code = [] def extract_stack(stack): @@ -927,14 +929,15 @@ def dumpstacks(sig=None, frame=None): 'url': getattr(th, 'url', 'n/a')} for th in threading.enumerate()} for threadId, stack in sys._current_frames().items(): - thread_info = threads_info.get(threadId, {}) - code.append("\n# Thread: %s (db:%s) (uid:%s) (url:%s)" % - (thread_info.get('repr', threadId), - thread_info.get('dbname', 'n/a'), - thread_info.get('uid', 'n/a'), - thread_info.get('url', 'n/a'))) - for line in extract_stack(stack): - code.append(line) + if not thread_idents or threadId in thread_idents: + thread_info = threads_info.get(threadId, {}) + code.append("\n# Thread: %s (db:%s) (uid:%s) (url:%s)" % + (thread_info.get('repr', threadId), + thread_info.get('dbname', 'n/a'), + thread_info.get('uid', 'n/a'), + thread_info.get('url', 'n/a'))) + for line in extract_stack(stack): + code.append(line) if odoo.evented: # code from http://stackoverflow.com/questions/12510648/in-gevent-how-can-i-dump-stack-traces-of-all-running-greenlets |
