[tor-commits] [stem/master] Limit number of events buffered by interpreter
atagar at torproject.org
atagar at torproject.org
Mon Oct 30 06:59:51 UTC 2017
commit 66243c4110d9116e6dfabdb0d8694fe1f04e6227
Author: Damian Johnson <atagar at 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
More information about the tor-commits
mailing list