]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
collect and log statistics about onionskins received/processed
authorRoger Dingledine <arma@torproject.org>
Wed, 4 Sep 2013 21:43:15 +0000 (17:43 -0400)
committerRoger Dingledine <arma@torproject.org>
Thu, 5 Sep 2013 05:44:52 +0000 (01:44 -0400)
we skip onionskins that came from non-relays, so we're less likely to
run into privacy troubles.

starts to implement ticket 9658.

changes/ticket9658 [new file with mode: 0644]
src/or/command.c
src/or/cpuworker.c
src/or/main.c
src/or/rephist.c
src/or/rephist.h

diff --git a/changes/ticket9658 b/changes/ticket9658
new file mode 100644 (file)
index 0000000..a8db2ef
--- /dev/null
@@ -0,0 +1,4 @@
+  o Minor features:
+    - Track how many "TAP" and "NTor" circuit handshake requests we get,
+      and how many we complete, and log it every hour to help relay
+      operators follow trends in network load. Addresses ticket 9658.
index 876ff526a6a6f82ece5b8990552ca0e066941a36..699b02fb479fca5aed674465c85ff61501cc823e 100644 (file)
@@ -29,6 +29,7 @@
 #include "hibernate.h"
 #include "nodelist.h"
 #include "onion.h"
+#include "rephist.h"
 #include "relay.h"
 #include "router.h"
 #include "routerlist.h"
@@ -277,6 +278,8 @@ command_process_create_cell(cell_t *cell, channel_t *chan)
 
   if (create_cell->handshake_type != ONION_HANDSHAKE_TYPE_FAST) {
     /* hand it off to the cpuworkers, and then return. */
+    if (connection_or_digest_is_known_relay(chan->identity_digest))
+      rep_hist_note_circuit_handshake_requested(create_cell->handshake_type);
     if (assign_onionskin_to_cpuworker(NULL, circ, create_cell) < 0) {
       log_debug(LD_GENERAL,"Failed to hand off onionskin. Closing.");
       circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT);
index 61f9faa394d87a8951e74507a528b8e103786a1c..ecf0d2035da553fa83f0f132bba5854a4fd5587e 100644 (file)
 #include "circuitlist.h"
 #include "config.h"
 #include "connection.h"
+#include "connection_or.h"
 #include "cpuworker.h"
 #include "main.h"
 #include "onion.h"
+#include "rephist.h"
 #include "router.h"
 
 /** The maximum number of cpuworker processes we will keep around. */
@@ -683,6 +685,9 @@ assign_onionskin_to_cpuworker(connection_t *cpuworker,
       return -1;
     }
 
+    if (connection_or_digest_is_known_relay(circ->p_chan->identity_digest))
+      rep_hist_note_circuit_handshake_completed(onionskin->handshake_type);
+
     should_time = should_time_request(onionskin->handshake_type);
     memset(&req, 0, sizeof(req));
     req.magic = CPUWORKER_REQUEST_MAGIC;
index bd23141b9748f248175f0112548e96f1b72b7ad2..deed798e803e60c5b47959f1a06ffcb6b684819f 100644 (file)
@@ -1353,6 +1353,11 @@ run_scheduled_events(time_t now)
         next_time_to_write_stats_files = next_write;
     }
     time_to_write_stats_files = next_time_to_write_stats_files;
+
+    /* Also commandeer this opportunity to log how our circuit handshake
+     * stats have been doing. */
+    if (public_server_mode(options))
+      rep_hist_log_circuit_handshake_stats(now);
   }
 
   /* 1h. Check whether we should write bridge statistics to disk.
index 55f321d5ff89bbe66179da2872b4e60804b4d41a..131e531b1983d4dc65ece2dd4486e8be9964ca0f 100644 (file)
@@ -3011,6 +3011,47 @@ rep_hist_conn_stats_write(time_t now)
   return start_of_conn_stats_interval + WRITE_STATS_INTERVAL;
 }
 
+/** Internal statistics to track how many requests of each type of
+ * handshake we've received, and how many we've completed. Useful for
+ * seeing trends in cpu load.
+ * @{ */
+static int onion_handshakes_requested[MAX_ONION_HANDSHAKE_TYPE+1] = {0};
+static int onion_handshakes_completed[MAX_ONION_HANDSHAKE_TYPE+1] = {0};
+/**@}*/
+
+/** A new onionskin (using the <b>type</b> handshake) has arrived. */
+void
+rep_hist_note_circuit_handshake_requested(uint16_t type)
+{
+  if (type <= MAX_ONION_HANDSHAKE_TYPE)
+    onion_handshakes_requested[type]++;
+}
+
+/** We've sent an onionskin (using the <b>type</b> handshake) to a
+ * cpuworker. */
+void
+rep_hist_note_circuit_handshake_completed(uint16_t type)
+{
+  if (type <= MAX_ONION_HANDSHAKE_TYPE)
+    onion_handshakes_completed[type]++;
+}
+
+/** Log our onionskin statistics since the last time we were called. */
+void
+rep_hist_log_circuit_handshake_stats(time_t now)
+{
+  (void)now;
+  /* XXX024 maybe quiet this log message before 0.2.4 goes stable for real */
+  log_notice(LD_HIST, "Circuit handshake stats since last time: "
+             "%d/%d TAP, %d/%d NTor.",
+             onion_handshakes_completed[ONION_HANDSHAKE_TYPE_TAP],
+             onion_handshakes_requested[ONION_HANDSHAKE_TYPE_TAP],
+             onion_handshakes_completed[ONION_HANDSHAKE_TYPE_NTOR],
+             onion_handshakes_requested[ONION_HANDSHAKE_TYPE_NTOR]);
+  memset(onion_handshakes_completed, 0, sizeof(onion_handshakes_completed));
+  memset(onion_handshakes_requested, 0, sizeof(onion_handshakes_requested));
+}
+
 /** Free all storage held by the OR/link history caches, by the
  * bandwidth history arrays, by the port history, or by statistics . */
 void
index 811cd8d450341d59ee8d42a44164380b6f969509..de824749b4ff93025ecabd65f67af28e8247bd55 100644 (file)
@@ -64,8 +64,6 @@ int rep_hist_circbuilding_dormant(time_t now);
 void note_crypto_pk_op(pk_op_t operation);
 void dump_pk_ops(int severity);
 
-void rep_hist_free_all(void);
-
 void rep_hist_exit_stats_init(time_t now);
 void rep_hist_reset_exit_stats(time_t now);
 void rep_hist_exit_stats_term(void);
@@ -98,5 +96,11 @@ char *rep_hist_format_conn_stats(time_t now);
 time_t rep_hist_conn_stats_write(time_t now);
 void rep_hist_conn_stats_term(void);
 
+void rep_hist_note_circuit_handshake_requested(uint16_t type);
+void rep_hist_note_circuit_handshake_completed(uint16_t type);
+void rep_hist_log_circuit_handshake_stats(time_t now);
+
+void rep_hist_free_all(void);
+
 #endif