Remember dirctory bw usage, and log it in the heartbeat

Closes ticket 32720.
This commit is contained in:
Nick Mathewson 2019-12-12 12:11:09 -05:00
parent 17724a7cde
commit 93af83e16a
6 changed files with 61 additions and 0 deletions

4
changes/ticket32720 Normal file
View File

@ -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.

View File

@ -17,6 +17,7 @@
#include "core/or/or.h" #include "core/or/or.h"
#include "core/or/circuituse.h" #include "core/or/circuituse.h"
#include "app/config/config.h" #include "app/config/config.h"
#include "feature/dirclient/dirclient.h"
#include "core/or/status.h" #include "core/or/status.h"
#include "feature/nodelist/nodelist.h" #include "feature/nodelist/nodelist.h"
#include "core/or/relay.h" #include "core/or/relay.h"
@ -146,6 +147,8 @@ log_heartbeat(time_t now)
uptime, count_circuits(), bw_sent, bw_rcvd, uptime, count_circuits(), bw_sent, bw_rcvd,
hibernating?" We are currently hibernating.":""); hibernating?" We are currently hibernating.":"");
dirclient_dump_total_dls();
if (server_mode(options) && accounting_is_enabled(options) && !hibernating) { if (server_mode(options) && accounting_is_enabled(options) && !hibernating) {
log_accounting(now, options); log_accounting(now, options);
} }

View File

@ -171,6 +171,12 @@ control_event_bootstrap_core(int loglevel, bootstrap_status_t status,
control_event_client_status(LOG_NOTICE, "%s", buf); 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 /** Called when Tor has made progress at bootstrapping its directory
* information and initial circuits. * information and initial circuits.
* *

View File

@ -164,6 +164,7 @@ int control_event_buildtimeout_set(buildtimeout_set_event_t type,
int control_event_signal(uintptr_t signal); int control_event_signal(uintptr_t signal);
void control_event_bootstrap(bootstrap_status_t status, int progress); 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, MOCK_DECL(void, control_event_bootstrap_prob_or,(const char *warn,
int reason, int reason,
or_connection_t *or_conn)); or_connection_t *or_conn));

View File

@ -21,6 +21,7 @@
#include "feature/client/entrynodes.h" #include "feature/client/entrynodes.h"
#include "feature/control/control_events.h" #include "feature/control/control_events.h"
#include "feature/dirauth/authmode.h" #include "feature/dirauth/authmode.h"
#include "feature/dirclient/dirclient.h"
#include "feature/dirauth/dirvote.h" #include "feature/dirauth/dirvote.h"
#include "feature/dirauth/shared_random.h" #include "feature/dirauth/shared_random.h"
#include "feature/dircache/dirserv.h" #include "feature/dircache/dirserv.h"
@ -1964,6 +1965,40 @@ dir_client_decompress_response_body(char **bodyp, size_t *bodylenp,
return rv; 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 /** We are a client, and we've finished reading the server's
* response. Parse it and act appropriately. * 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)); 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), switch (connection_fetch_from_buf_http(TO_CONN(conn),
&headers, MAX_HEADERS_SIZE, &headers, MAX_HEADERS_SIZE,
&body, &body_len, MAX_DIR_DL_SIZE, &body, &body_len, MAX_DIR_DL_SIZE,

View File

@ -14,6 +14,8 @@
#include "feature/hs/hs_ident.h" #include "feature/hs/hs_ident.h"
void dirclient_dump_total_dls(void);
int directories_have_accepted_server_descriptor(void); int directories_have_accepted_server_descriptor(void);
void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
dirinfo_type_t type, const char *payload, dirinfo_type_t type, const char *payload,