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