Browse Source

Optionally use sympy to keep track of bytes sent and received symbolically

The totals will look like "3*DirAuthGetConsensusMsg +
36*DirAuthUploadDescMsg + 3*RelayRandomHopMsg", counting the number of
each type of message.

Set symbolic_byte_counters = True in network.py to turn this on.
Ian Goldberg 4 years ago
parent
commit
49fc2d3f4e
2 changed files with 32 additions and 12 deletions
  1. 4 4
      client.py
  2. 28 8
      network.py

+ 4 - 4
client.py

@@ -233,22 +233,22 @@ if __name__ == '__main__':
         print(d.perfstats)
         dirasent += d.perfstats.bytes_sent
         dirarecv += d.perfstats.bytes_received
-    print("DirAuths sent=%d recv=%d" % (dirasent, dirarecv))
+    print("DirAuths sent=%s recv=%s" % (dirasent, dirarecv))
     totsent += dirasent
     totrecv += dirarecv
     for r in relays:
         print(r.perfstats)
         relaysent += r.perfstats.bytes_sent
         relayrecv += r.perfstats.bytes_received
-    print("Relays sent=%d recv=%d" % (relaysent, relayrecv))
+    print("Relays sent=%s recv=%s" % (relaysent, relayrecv))
     totsent += relaysent
     totrecv += relayrecv
     for c in clients:
         print(c.perfstats)
         clisent += c.perfstats.bytes_sent
         clirecv += c.perfstats.bytes_received
-    print("Client sent=%d recv=%d" % (clisent, clirecv))
+    print("Client sent=%s recv=%s" % (clisent, clirecv))
     totsent += clisent
     totrecv += clirecv
 
-    print("Total sent=%d recv=%d" % (totsent, totrecv))
+    print("Total sent=%s recv=%s" % (totsent, totrecv))

+ 28 - 8
network.py

@@ -4,6 +4,14 @@ import random
 import pickle
 from enum import Enum
 
+# Set this to True if you want the bytes sent and received to be added
+# symbolically, in terms of the numbers of each type of network message.
+# You will need sympy installed for this to work.
+symbolic_byte_counters = False
+
+if symbolic_byte_counters:
+    import sympy
+
 class WOMode(Enum):
     """The different Walking Onion modes"""
     VANILLA     = 0  # No Walking Onions
@@ -37,6 +45,17 @@ class PerfStats:
         self.ent_type = ent_type
         # A printable name for the entity
         self.name = None
+        self.reset()
+
+    def __str__(self):
+        return "%s: type=%s boot=%s sent=%s recv=%s keygen=%d sig=%d verif=%d dh=%d" % \
+            (self.name, self.ent_type.name, self.is_bootstrapping, \
+            self.bytes_sent, self.bytes_received, self.keygens, \
+            self.sigs, self.verifs, self.dhs)
+
+    def reset(self):
+        """Reset the counters, typically at the beginning of each
+        epoch."""
         # True if bootstrapping this epoch
         self.is_bootstrapping = False
         # Bytes sent and received
@@ -49,12 +68,6 @@ class PerfStats:
         self.verifs = 0
         self.dhs = 0
 
-    def __str__(self):
-        return "%s: type=%s boot=%s sent=%d recv=%d keygen=%d sig=%d verif=%d dh=%d" % \
-            (self.name, self.ent_type.name, self.is_bootstrapping, \
-            self.bytes_sent, self.bytes_received, self.keygens, \
-            self.sigs, self.verifs, self.dhs)
-
 
 class NetAddr:
     """A class representing a network address"""
@@ -203,8 +216,15 @@ class NetMsg:
         pickle it and return the length of that.  There's some
         unnecessary overhead in this method; if you want specific
         messages to have more accurate sizes, override this method in
-        the subclass."""
-        sz = len(pickle.dumps(self))
+        the subclass.  Alternately, if symbolic_byte_counters is set,
+        return a symbolic representation of the message size instead, so
+        that the total byte counts will clearly show how many of each
+        message type were sent and received."""
+        if symbolic_byte_counters:
+            sz = sympy.symbols(type(self).__name__)
+        else:
+            sz = len(pickle.dumps(self))
+
         return sz