[tor-commits] [tor/master] Log info on ancient one-hop circuits in heartbeat

nickm at torproject.org nickm at torproject.org
Thu May 8 02:17:06 UTC 2014


commit b0e078d5af9d30d87060990e3a52fd16c63148e2
Author: Nick Mathewson <nickm at torproject.org>
Date:   Tue Apr 29 14:02:12 2014 -0400

    Log info on ancient one-hop circuits in heartbeat
    
    This is an attempt to diagnose 8387.
---
 changes/diagnose_8387 |    4 ++++
 src/or/circuituse.c   |   58 +++++++++++++++++++++++++++++++++++++++++++++++++
 src/or/circuituse.h   |    1 +
 src/or/status.c       |    3 +++
 4 files changed, 66 insertions(+)

diff --git a/changes/diagnose_8387 b/changes/diagnose_8387
new file mode 100644
index 0000000..3dfc845
--- /dev/null
+++ b/changes/diagnose_8387
@@ -0,0 +1,4 @@
+  o Minor features (diagnostic):
+    - When we log a heartbeat, log how many one-hop circuits we have that
+      are at least 30 minutes old, and log status information about a
+      few of them. This is an attempt to track down bug 8387.
diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index d104306..7820e88 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -783,6 +783,64 @@ circuit_expire_building(void)
   }
 }
 
+/**
+ * As a diagnostic for bug 8387, log information about how many one-hop
+ * circuits we have around that have been there for at least <b>age</b>
+ * seconds. Log a few of them.
+ */
+void
+circuit_log_ancient_one_hop_circuits(int age)
+{
+#define MAX_ANCIENT_ONEHOP_CIRCUITS_TO_LOG 10
+  time_t cutoff = time(NULL) - age;
+  int n_found = 0;
+  smartlist_t *log_these = smartlist_new();
+  const circuit_t *circ;
+
+  TOR_LIST_FOREACH(circ, circuit_get_global_list(), head) {
+    const origin_circuit_t *ocirc;
+    if (! CIRCUIT_IS_ORIGIN(circ))
+      continue;
+    if (circ->timestamp_created.tv_sec >= cutoff)
+      continue;
+    ocirc = CONST_TO_ORIGIN_CIRCUIT(circ);
+
+    if (ocirc->build_state && ocirc->build_state->onehop_tunnel) {
+      ++n_found;
+
+      if (smartlist_len(log_these) < MAX_ANCIENT_ONEHOP_CIRCUITS_TO_LOG)
+        smartlist_add(log_these, (origin_circuit_t*) ocirc);
+    }
+  }
+
+  if (n_found == 0)
+    goto done;
+
+  log_notice(LD_HEARTBEAT,
+             "Problem: Found %d one-hop circuits more than %d seconds old! "
+             "Logging %d...",
+             n_found, age, smartlist_len(log_these));
+
+  SMARTLIST_FOREACH_BEGIN(log_these, const origin_circuit_t *, ocirc) {
+    char created[ISO_TIME_LEN+1];
+    circ = TO_CIRCUIT(ocirc);
+    format_local_iso_time(created,
+                          circ->timestamp_created.tv_sec);
+
+    log_notice(LD_HEARTBEAT, "  #%d created at %s. %s, %s. %s for close. "
+               "%s for new conns.",
+               ocirc_sl_idx,
+               created,
+               circuit_state_to_string(circ->state),
+               circuit_purpose_to_string(circ->purpose),
+               circ->marked_for_close ? "Marked" : "Not marked",
+               ocirc->unusable_for_new_conns ? "Not usable" : "usable");
+  } SMARTLIST_FOREACH_END(ocirc);
+
+ done:
+  smartlist_free(log_these);
+}
+
 /** Remove any elements in <b>needed_ports</b> that are handled by an
  * open or in-progress circuit.
  */
diff --git a/src/or/circuituse.h b/src/or/circuituse.h
index 11e5a64..f228a67 100644
--- a/src/or/circuituse.h
+++ b/src/or/circuituse.h
@@ -16,6 +16,7 @@ void circuit_expire_building(void);
 void circuit_remove_handled_ports(smartlist_t *needed_ports);
 int circuit_stream_is_being_handled(entry_connection_t *conn, uint16_t port,
                                     int min);
+void circuit_log_ancient_one_hop_circuits(int age);
 #if 0
 int circuit_conforms_to_options(const origin_circuit_t *circ,
                                 const or_options_t *options);
diff --git a/src/or/status.c b/src/or/status.c
index 7e2afbc..afaa9de 100644
--- a/src/or/status.c
+++ b/src/or/status.c
@@ -9,6 +9,7 @@
 #define STATUS_PRIVATE
 
 #include "or.h"
+#include "circuituse.h"
 #include "config.h"
 #include "status.h"
 #include "nodelist.h"
@@ -135,6 +136,8 @@ log_heartbeat(time_t now)
   if (public_server_mode(options))
     rep_hist_log_circuit_handshake_stats(now);
 
+  circuit_log_ancient_one_hop_circuits(1800);
+
   tor_free(uptime);
   tor_free(bw_sent);
   tor_free(bw_rcvd);





More information about the tor-commits mailing list