commit 66243c4110d9116e6dfabdb0d8694fe1f04e6227 Author: Damian Johnson atagar@torproject.org Date: Sun Oct 29 23:56:48 2017 -0700
Limit number of events buffered by interpreter
Sweet jesus that was a pita to track down. Nyx has a memory leak, holding onto events tor emits indefinitely. Spent all day headscratching and finally found it. Our control interpreter intercepts events and enqueues them without bound. Finally caught thanks to the gc module...
to_ignore = [ locals(), globals(), gc.garbage ] log.warn("refs: %s" % [inspect.getframeinfo(r) for r in gc.get_referrers(event_message) if r not in to_ignore])
... which gave...
06:44:50 [NYX_WARNING] refs: [Traceback(filename='/home/ubuntu/nyx/stem/interpreter/commands.py', lineno=135, function='handle_event_wrapper', code_context=[' handle_event_real(event_message)\n'], index=0), Traceback(filename='/home/ubuntu/nyx/stem/control.py', lineno=3812, function='_handle_event', code_context=[' log.warn("refs: %s" % [inspect.getframeinfo(r) for r in gc.get_referrers(event_message) if r not in to_ignore])\n'], index=0), Traceback(filename='/home/ubuntu/nyx/stem/control.py', lineno=975, function='_event_loop', code_context=[' self._handle_event(event_message)\n'], index=0)] [998 duplicates hidden] --- stem/interpreter/commands.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/stem/interpreter/commands.py b/stem/interpreter/commands.py index 45f2e2ca..d47cccdd 100644 --- a/stem/interpreter/commands.py +++ b/stem/interpreter/commands.py @@ -26,6 +26,8 @@ try: except ImportError: from io import StringIO
+MAX_EVENTS = 100 +
def _get_fingerprint(arg, controller): """ @@ -133,7 +135,10 @@ class ControlInterpreter(code.InteractiveConsole):
def handle_event_wrapper(event_message): handle_event_real(event_message) - self._received_events.append(event_message) + self._received_events.insert(0, event_message) + + if len(self._received_events) > MAX_EVENTS: + self._received_events.pop()
self._controller._handle_event = handle_event_wrapper