[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