[tor-commits] [stem/master] Compressing unparsed exit policy content

atagar at torproject.org atagar at torproject.org
Tue Oct 8 07:50:18 UTC 2013


commit 1920baff1ad557a2a556dcb0cb46609f50f3cde1
Author: Damian Johnson <atagar at torproject.org>
Date:   Tue Oct 8 00:37:11 2013 -0700

    Compressing unparsed exit policy content
    
    Exit policies constitute a rather substantial chunch of server descriptors. We
    already optimize our runtime by lazily parsing policies on demand. On
    reflection though, we can improve our memory usage quite a bit too by
    compressing the unparsed content. This drops our memory usage by roughly 6%
    without impacting runtime.
---
 stem/exit_policy.py |   20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/stem/exit_policy.py b/stem/exit_policy.py
index 930c8bb..cc91124 100644
--- a/stem/exit_policy.py
+++ b/stem/exit_policy.py
@@ -56,6 +56,8 @@ exiting to a destination is permissible or not. For instance...
   ============ ===========
 """
 
+import zlib
+
 import stem.prereq
 import stem.util.connection
 import stem.util.enum
@@ -152,7 +154,16 @@ class ExitPolicy(object):
     # This is lazily evaluated so we don't need to actually parse the exit
     # policy if it's never used.
 
-    self._input_rules = rules
+    is_all_str = True
+
+    for rule in rules:
+      if not isinstance(rule, (bytes, unicode)):
+        is_all_str = False
+
+    if rules and is_all_str:
+      self._input_rules = zlib.compress(','.join(rules))
+    else:
+      self._input_rules = rules
 
     # Result when no rules apply. According to the spec policies default to 'is
     # allowed', but our microdescriptor policy subclass might want to change
@@ -287,7 +298,12 @@ class ExitPolicy(object):
     rules = []
     is_all_accept, is_all_reject = True, True
 
-    for rule in self._input_rules:
+    if isinstance(self._input_rules, str):
+      decompressed_rules = zlib.decompress(self._input_rules).split(',')
+    else:
+      decompressed_rules = self._input_rules
+
+    for rule in decompressed_rules:
       if isinstance(rule, (bytes, unicode)):
         rule = ExitPolicyRule(rule.strip())
 





More information about the tor-commits mailing list