]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Remember dirctory bw usage, and log it in the heartbeat
authorNick Mathewson <nickm@torproject.org>
Thu, 12 Dec 2019 17:11:09 +0000 (12:11 -0500)
committerNick Mathewson <nickm@torproject.org>
Tue, 18 Feb 2020 16:25:18 +0000 (11:25 -0500)
Closes ticket 32720.

changes/ticket32720 [new file with mode: 0644]
src/core/or/status.c
src/feature/control/control_bootstrap.c
src/feature/control/control_events.h
src/feature/dirclient/dirclient.c
src/feature/dirclient/dirclient.h

diff --git a/changes/ticket32720 b/changes/ticket32720
new file mode 100644 (file)
index 0000000..87c540b
--- /dev/null
@@ -0,0 +1,4 @@
+  o Minor features (directory):
+    - Remember the number of bytes we have downloaded for each directory
+      purpose while bootstrapping, and while fully bootstrapped. Log this
+      information as part of the heartbeat message. Closes ticket 32720.
index f9f603f3b769e95f58b8f4ebefe912bcf4519fec..ed8448883c0dfcf5bbb38ff5c2dc6830d320d4be 100644 (file)
@@ -17,6 +17,7 @@
 #include "core/or/or.h"
 #include "core/or/circuituse.h"
 #include "app/config/config.h"
+#include "feature/dirclient/dirclient.h"
 #include "core/or/status.h"
 #include "feature/nodelist/nodelist.h"
 #include "core/or/relay.h"
@@ -146,6 +147,8 @@ log_heartbeat(time_t now)
          uptime, count_circuits(), bw_sent, bw_rcvd,
          hibernating?" We are currently hibernating.":"");
 
+  dirclient_dump_total_dls();
+
   if (server_mode(options) && accounting_is_enabled(options) && !hibernating) {
     log_accounting(now, options);
   }
index 2e78fad690ef01cb983352b5d9b939af8960d7c2..fee7612ba2666ea2814fec572c0743f60ab947a7 100644 (file)
@@ -171,6 +171,12 @@ control_event_bootstrap_core(int loglevel, bootstrap_status_t status,
   control_event_client_status(LOG_NOTICE, "%s", buf);
 }
 
+int
+control_get_bootstrap_percent(void)
+{
+  return bootstrap_percent;
+}
+
 /** Called when Tor has made progress at bootstrapping its directory
  * information and initial circuits.
  *
index 74bbc0047da1c6201feb419e4d0451ba6eb15fc8..4f960b2443e4c42842932c42b0b41aac5a056495 100644 (file)
@@ -164,6 +164,7 @@ int control_event_buildtimeout_set(buildtimeout_set_event_t type,
 int control_event_signal(uintptr_t signal);
 
 void control_event_bootstrap(bootstrap_status_t status, int progress);
+int control_get_bootstrap_percent(void);
 MOCK_DECL(void, control_event_bootstrap_prob_or,(const char *warn,
                                                  int reason,
                                                  or_connection_t *or_conn));
index 1b6eed12f0157753c6bcc07b478ef20bc99d5427..7c7057b102f6e9169b9f13fddefb0c3eb7ca2b52 100644 (file)
@@ -21,6 +21,7 @@
 #include "feature/client/entrynodes.h"
 #include "feature/control/control_events.h"
 #include "feature/dirauth/authmode.h"
+#include "feature/dirclient/dirclient.h"
 #include "feature/dirauth/dirvote.h"
 #include "feature/dirauth/shared_random.h"
 #include "feature/dircache/dirserv.h"
@@ -1964,6 +1965,40 @@ dir_client_decompress_response_body(char **bodyp, size_t *bodylenp,
   return rv;
 }
 
+/**
+ * Total number of bytes downloaded of each directory purpose, when
+ * bootstrapped, and when not bootstrapped.
+ *
+ * (For example, the number of bytes downloaded of purpose p while
+ * not fully bootstrapped is total_dl[p][false].)
+ **/
+static uint64_t total_dl[DIR_PURPOSE_MAX_][2];
+
+/**
+ * Heartbeat: dump a summary of how many bytes of which purpose we've
+ * downloaded, when bootstrapping and when not bootstrapping.
+ **/
+void
+dirclient_dump_total_dls(void)
+{
+  log_notice(LD_NET,
+             "While bootstrapping, fetched this many bytes: ");
+  for (int i=0; i < DIR_PURPOSE_MAX_; ++i) {
+    uint64_t n = total_dl[i][0];
+    if (n) {
+      log_notice(LD_NET, "    %zu (%s)", n, dir_conn_purpose_to_string(i));
+    }
+  }
+  log_notice(LD_NET,
+             "While not bootsrapping, fetched this many bytes: ");
+  for (int i=0; i < DIR_PURPOSE_MAX_; ++i) {
+    uint64_t n = total_dl[i][1];
+    if (n) {
+      log_notice(LD_NET, "    %zu (%s)", n, dir_conn_purpose_to_string(i));
+    }
+  }
+}
+
 /** We are a client, and we've finished reading the server's
  * response. Parse it and act appropriately.
  *
@@ -1997,6 +2032,16 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
 
   received_bytes = connection_get_inbuf_len(TO_CONN(conn));
 
+  log_debug(LD_DIR, "Downloaded %zu bytes on connection of purpose "
+             "%s; bootstrap %d%%",
+             received_bytes,
+             dir_conn_purpose_to_string(conn->base_.purpose),
+             control_get_bootstrap_percent());
+  {
+    bool bootstrapped = control_get_bootstrap_percent() == 100;
+    total_dl[conn->base_.purpose][bootstrapped] += received_bytes;
+  }
+
   switch (connection_fetch_from_buf_http(TO_CONN(conn),
                               &headers, MAX_HEADERS_SIZE,
                               &body, &body_len, MAX_DIR_DL_SIZE,
index 08209721bb98c04645353240bc5e9de62ca1722e..096b197526a63aa88bdc087ccc3eeb5b8bed258a 100644 (file)
@@ -14,6 +14,8 @@
 
 #include "feature/hs/hs_ident.h"
 
+void dirclient_dump_total_dls(void);
+
 int directories_have_accepted_server_descriptor(void);
 void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
                                   dirinfo_type_t type, const char *payload,