[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r17987: {torflow} Implement circuit throttling, extend time logging, and fixed (torflow/trunk/CircuitAnalysis/BuildTimes)



Author: mikeperry
Date: 2009-01-06 17:07:21 -0500 (Tue, 06 Jan 2009)
New Revision: 17987

Modified:
   torflow/trunk/CircuitAnalysis/BuildTimes/buildtimes.py
Log:

Implement circuit throttling, extend time logging, and fixed
an issue with guard node usage during percentile operation.



Modified: torflow/trunk/CircuitAnalysis/BuildTimes/buildtimes.py
===================================================================
--- torflow/trunk/CircuitAnalysis/BuildTimes/buildtimes.py	2009-01-06 21:42:05 UTC (rev 17986)
+++ torflow/trunk/CircuitAnalysis/BuildTimes/buildtimes.py	2009-01-06 22:07:21 UTC (rev 17987)
@@ -4,6 +4,7 @@
 
 import socket,sys,time,getopt,os,threading
 sys.path.append("../../")
+import TorCtl
 from TorCtl.TorUtil import meta_port,meta_host,control_port,control_host,control_pass
 from TorCtl.StatsSupport import StatsHandler
 from TorCtl import PathSupport, TorCtl
@@ -18,13 +19,18 @@
       uniform=True,
       use_exit=None,
       use_guards=True,
-      restrict_guards=True)
+      restrict_guards=False)
 
+# Maximum number of concurrent circuits to build:
+# (Gets divided by the number of slices)
+max_circuits = 60
+
 class StatsGatherer(StatsHandler):
   def __init__(self,c, selmgr,basefile_name,nstats):
     StatsHandler.__init__(self,c, selmgr)
 
     self.detailfile = open(basefile_name + '.detail','w')
+    self.extendtimesfile = open(basefile_name + '.extendtimes','w')
     self.buildtimesfile = open(basefile_name + '.buildtimes','w')
     self.circ_built = 0
     self.nstats = nstats
@@ -74,7 +80,8 @@
       if circ_event.status == 'BUILT':
         circ = self.circuits[circ_event.circ_id]
         buildtime = reduce(lambda x,y:x+y,circ.extend_times,0.0)
-        # XXX: Write out circ.extend_times as well to get per-hop data
+        self.extendtimesfile.write(str(circ.circ_id)+'\t'+'\t'.join(map(str, circ.extend_times))+'\n')
+        self.extendtimesfile.flush()
         self.buildtimesfile.write(str(circ.circ_id) + '\t' + str(buildtime) + '\n')
         self.buildtimesfile.flush()
 
@@ -83,7 +90,9 @@
       self.detailfile.flush()
 
       # check to see if done gathering data
-      if circ_event.status == 'BUILT': self.circ_built += 1
+      if circ_event.status == 'BUILT': 
+        self.circ_built += 1
+        self.close_circuit(circ_event.circ_id)
     else:
       #eventstr = 
       #if circ_event.circ_id in self.othercircs.keys():
@@ -92,7 +101,7 @@
       self.othercircs[circ_event.circ_id] += [self.circ_event_str(now,circ_event)]
     StatsHandler.circ_status_event(self,circ_event)
 
-def getdata(filename,ncircuits):
+def open_controller(filename,ncircuits):
   """ starts stat gathering thread """
 
   s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
@@ -170,22 +179,27 @@
   if s-p >= end:
     print 'Using bandwidth weighted selection'
     __selmgr.uniform = False 
+    __selmgr.use_guards = True
   else: 
     print 'Using uniform weighted selection'
     __selmgr.uniform = True
+    __selmgr.use_guards = False
  
-  c = getdata(basefile_name,ncircuits)
+  c = open_controller(basefile_name,ncircuits)
 
   for i in xrange(0,ncircuits):
     print 'Building circuit',i
     try:
-      def notlambda(h):
-        # XXX: reschedule if some number n circuits outstanding?
-        # This may result in a large number of circuits at once..
-        # Potentially also close cicuits periodically or on built
+      def circuit_builder(h):
+        # reschedule if some number n circuits outstanding
+        if h.circ_count - h.circ_succeeded > max_circuits:
+          from TorCtl.TorUtil import plog
+          plog("DEBUG", "Too many circuits: "+str(h.circ_count-h.circ_succeeded)+", delaying build")
+          h.schedule_low_prio(circuit_builder)
+          return
         circ = h.c.build_circuit(h.selmgr.pathlen, h.selmgr.path_selector)   
         h.circuits[circ.circ_id] = circ
-      c._handler.schedule_low_prio(notlambda)
+      c._handler.schedule_low_prio(circuit_builder)
     except TorCtl.ErrorReply,e:
       plog("NOTICE","Error building circuit: " + str(e.args))
 
@@ -214,7 +228,12 @@
 
 def main():
   ncircuits,begin,end,pct,dirname = getargs()
+  
+  global max_circuits
+  max_circuits = max_circuits/((end-begin)/pct)
 
+  print "Using max_circuits: "+str(max_circuits)
+
   for p in xrange(begin,end,pct):
     guardslice(p,p+pct,end,ncircuits,dirname)
 if __name__ == '__main__':