[tor-commits] [metrics-tasks/master] store all server descs in memory

karsten at torproject.org karsten at torproject.org
Sun Nov 25 20:27:54 UTC 2012


commit d008ecfa68fee00fd63e75129677edd1b0502337
Author: Sathyanarayanan Gunasekaran <gsathya.ceg at gmail.com>
Date:   Wed Nov 21 23:19:12 2012 +0530

    store all server descs in memory
---
 task-1854/pylinf.py |   44 +++++++++++++++++++++++++++++++++++---------
 1 files changed, 35 insertions(+), 9 deletions(-)

diff --git a/task-1854/pylinf.py b/task-1854/pylinf.py
index 3bc6de1..4dff224 100644
--- a/task-1854/pylinf.py
+++ b/task-1854/pylinf.py
@@ -12,12 +12,14 @@ import sys
 import math
 import os
 import pygeoip
+import tarfile
 import StringIO
-import stem.descriptor
+import stem.descriptor.server_descriptor
 
 from optparse import OptionParser
 from binascii import b2a_hex, a2b_base64, a2b_hex
-from stem.descriptor.server_descriptor import RelayDescriptor, BridgeDescriptor
+
+descriptors = {}
 
 class Router:
     def __init__(self):
@@ -54,13 +56,7 @@ class Router:
 
     def get_advertised_bw(self, hex_digest):
         try:
-            with open(options.server_desc+'/'+hex_digest) as f:
-                data = f.read()
-
-            desc_iter = stem.descriptor.server_descriptor.parse_file(StringIO.StringIO(data))
-            desc_entries = list(desc_iter)
-            desc = desc_entries[0]
-            return min(desc.average_bandwidth, desc.burst_bandwidth, desc.observed_bandwidth)
+            return descriptors[self.hex_digest]
         except:
             return 0
 
@@ -74,6 +70,33 @@ def parse_bw_weights(values):
     except:
         return None
 
+def load_server_desc(tar_file_path):
+    """
+    tar_file_path -> 'string' or 'list'
+    represents path{s} to tar file{s}
+    """
+    global descriptors
+
+    if type(tar_file_path) == str: tar_file_path = [tar_file_path]
+
+    for file_path in tar_file_path:
+        with tarfile.open(file_path) as tar_fh:
+            for member in tar_fh:
+                if not member.isfile():
+                    continue
+
+                tar_file_data=tar_fh.extractfile(member)
+                data=tar_file_data.read()
+                desc_iter = stem.descriptor.server_descriptor.parse_file(
+                    StringIO.StringIO(data))
+                desc_entries = list(desc_iter)
+                desc = desc_entries[0]
+
+                # currently we require only advertised_bw
+                descriptors[desc.digest()] = min(desc.average_bandwidth,
+                                                 desc.burst_bandwidth,
+                                                 desc.observed_bandwidth)
+
 def run(file_name):
     routers = []
     router = None
@@ -180,6 +203,9 @@ if __name__ == "__main__":
     gi_db = pygeoip.GeoIP(options.gi_db)
     as_db = pygeoip.GeoIP(options.as_db)
 
+    # load all server descs into memeory
+    load_server_desc(options.server_desc)
+
     with open(options.output, 'w') as f:
         for file_name in os.listdir(options.consensus):
             string = run(os.path.join(options.consensus, file_name))





More information about the tor-commits mailing list