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

[or-cvs] r15445: Script takes p% to (p+5)% slices of guard nodes, and builds (torflow/branches/gsoc2008)



Author: fallon
Date: 2008-06-24 04:51:37 -0400 (Tue, 24 Jun 2008)
New Revision: 15445

Added:
   torflow/branches/gsoc2008/guardslices.py
Log:
Script takes p% to (p+5)% slices of guard nodes, and builds circuits using those slices of guards. It outputs detailed circuit events, build times, and aggregate statistics.


Nonfunctional: File that outputs buildtimes contains nothing; details file and agg file should contain data
Bugs: One about a NoneType exception, that is difficult to reproduce



Added: torflow/branches/gsoc2008/guardslices.py
===================================================================
--- torflow/branches/gsoc2008/guardslices.py	                        (rev 0)
+++ torflow/branches/gsoc2008/guardslices.py	2008-06-24 08:51:37 UTC (rev 15445)
@@ -0,0 +1,157 @@
+#!/usr/bin/env python
+# uses metatroller to collect circuit build times for 5% slices of guard nodes
+# [OUTPUT] one directory, with three files: StatsHandler aggregate stats file, file with all circuit events (for detailed reference), file with just buildtimes
+
+import socket,sys,time,getopt,os
+from TorCtl.TorUtil import meta_port,meta_host,control_port,control_host
+from StatsSupport import StatsHandler
+from TorCtl import PathSupport, TorCtl
+__selmgr = PathSupport.SelectionManager(
+      pathlen=3,
+      order_exits=True,
+      percent_fast=80,
+      percent_skip=0,
+      min_bw=1024,
+      use_all_exits=True,
+      uniform=True,
+      use_exit=None,
+      use_guards=True,
+      restrict_guards=True)
+
+class Connection(PathSupport.Connection):
+  
+  """ thread quits when required number of circuits found, otherwise identical"""
+  def __init__(self,s):
+    PathSupport.Connection.__init__(self,s)
+  def _loop(self):
+    while 1:
+      try:
+        isEvent, reply = self._read_reply()
+      except:
+        self._err(sys.exc_info())
+        return
+
+      if isEvent:
+        if self._handler is not None:
+          self._eventQueue.put((time.time(), reply))
+      else:
+        cb = self._queue.get() # atomic..
+        cb(reply)
+
+      if self._handler is not None:
+        if self._handler.circ_failed + self._handler.circ_built >= self._handler.nstats:
+          print 'Finished gathering',self._handler.circ_failed + self._handler.circ_built,'circuits'
+          print self._handler.circ_failed,'failed',self._handler.circ_built,'built'
+          return 
+
+class StatsGatherer(StatsHandler):
+  def __init__(self,c, selmgr,basefile_name,nstats):
+    StatsHandler.__init__(self,c, selmgr)
+
+    self.detailfile = open(basefile_name + '.detail','w')
+    self.timesfile = open(basefile_name + '.buildtimes','w')
+    self.circ_built = 0
+    self.nstats = nstats
+
+
+  def circ_status_event(self, circ_event):
+    now = time.time()
+    now = '%3.10f' % now
+
+    if circ_event.circ_id in self.circuits.keys():
+      output = [circ_event.event_name, str(circ_event.circ_id),
+          circ_event.status]
+      if circ_event.path:
+        output.append(",".join(circ_event.path))
+      if circ_event.reason:
+        output.append("REASON=" + circ_event.reason)
+      if circ_event.remote_reason:
+        output.append("REMOTE_REASON=" + circ_event.remote_reason)
+     
+      output = [now]+ output
+      outstr = ' '.join(output) + '\n'
+      self.detailfile.write(outstr)
+      self.detailfile.flush()
+      if self.circuits[circ_event.circ_id].setup_duration:
+        self.buildtimesfile.write(str(self.circuits[circ_event.circ_id].setup_duration) + '\n')
+      print 'wrote',outstr
+
+      # check to see if done gathering data
+      if circ_event.status == 'BUILT': self.circ_built += 1
+
+    StatsHandler.circ_status_event(self,circ_event)
+
+def getdata(filename,ncircuits):
+  """ starts stat gathering thread """
+
+  s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
+  s.connect((control_host,control_port))
+  c = Connection(s)
+  c.authenticate()  # also launches thread...
+  h = StatsGatherer(c,__selmgr,filename,ncircuits)
+  c.set_event_handler(h)
+
+  c.set_events([TorCtl.EVENT_TYPE.STREAM,
+                TorCtl.EVENT_TYPE.BW,
+                TorCtl.EVENT_TYPE.NS,
+                TorCtl.EVENT_TYPE.CIRC,
+                TorCtl.EVENT_TYPE.STREAM_BW,
+                TorCtl.EVENT_TYPE.NEWDESC], True)
+  return c
+def setargs():
+  ncircuits = ""
+  dirname = ""
+  filename = ""
+  if len(sys.argv[1:]) < 4:
+    usage()
+    sys.exit(2)
+  try:
+    opts,args = getopt.getopt(sys.argv[1:],"p:n:d:")
+  except getopt.GetoptError,err:
+    print str(err)
+    usage()
+  for o,a in opts:
+    if o == '-n': 
+      if a.isdigit(): ncircuits = int(a)
+      else: usage()
+    elif o == '-d': dirname = a  #directory where output files go 
+    elif o == '-p':
+      if a.isdigit(): percentile = int(a)
+      else: usage()
+    else:
+      assert False, "Bad option"
+  return ncircuits,percentile,dirname
+
+def usage():
+    print 'usage: statscontroller.py -p <#percentile>  -n <# circuits> -d <output dir name>'
+    sys.exit(1)
+def main():
+  ncircuits,p,dirname = setargs()
+
+  print 'Making new directory:',dirname
+  if not os.path.isdir(dirname):
+    os.mkdir(dirname)
+  else:
+    print 'Directory',dirname,'exists, not making a new one.'
+
+  print 'Guard percentiles:',p,'to',p+5
+  print '#Circuits',ncircuits
+
+  basefile_name = dirname + '/' + str(p) + '-' + str(p+5) + '.' + str(ncircuits)
+  aggfile_name =  basefile_name + '.agg'
+
+  __selmgr.percent_fast = p+5
+  __selmgr.percent_skip = p
+  
+  c = getdata(basefile_name,ncircuits) 
+  for i in range(0,ncircuits):
+    circ = c.build_circuit(__selmgr.pathlen,__selmgr.path_selector)
+    c._handler.circuits[circ.circ_id] = circ
+  while True:
+    if c._handler.circ_built + c._handler.circ_failed >= ncircuits:
+      print 'Done gathering'
+      break
+  c._handler.write_stats(aggfile_name)
+
+if __name__ == '__main__':
+  main()


Property changes on: torflow/branches/gsoc2008/guardslices.py
___________________________________________________________________
Name: svn:executable
   + *