From 75c59d1a92e0f4956bd249844c188c432aae1712 Mon Sep 17 00:00:00 2001 From: Karsten Loesing Date: Wed, 19 Aug 2009 23:36:27 +0200 Subject: [PATCH] Some final (?) cleanups of proposal 166 implementation. --- ChangeLog | 23 +++++++-------- doc/spec/proposals/000-index.txt | 4 +-- .../proposals/166-statistics-extra-info-docs.txt | 2 +- src/or/geoip.c | 33 +++++++++++++++++++++- src/or/main.c | 1 - src/or/router.c | 14 ++++----- 6 files changed, 53 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6901cf24c4..97f9a3b629 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,20 +4,21 @@ Changes in version 0.2.2.1-alpha - 2009-0?-?? via new AccelName and AccelDir options. o New options for gathering stats safely: - - Directories that set "DirReqStatistics 1" write directory request - stats to disk every 24 hours. As compared to the --enable-geoip-stats - flag in 0.2.1.x, there are a few improvements: 1) stats are written - to disk exactly every 24 hours; 2) estimated shares of v2 and v3 - requests are determined as mean values, not at the end of a - measurement period; 3) unresolved requests are listed with country - code '??'; 4) directories also measure download times. + - Directories that set "DirReqStatistics 1" write statistics on + directory request to disk every 24 hours. As compared to the + --enable-geoip-stats flag in 0.2.1.x, there are a few improvements: + 1) stats are written to disk exactly every 24 hours; 2) estimated + shares of v2 and v3 requests are determined as mean values, not at + the end of a measurement period; 3) unresolved requests are listed + with country code '??'; 4) directories also measure download times. - Exit nodes that set "ExitPortStatistics 1" write statistics on the number of exit streams and transferred bytes per port to disk every 24 hours. - - Relays that set "CellStatistics 1" write statistics to disk every - 24 hours on how long cells spend in their circuit queues. - - Entry nodes that set "EntryStatistics 1" write statistics to disk - every 24 hours on the rough number and origins of connecting clients. + - Relays that set "CellStatistics 1" write statistics on how long + cells spend in their circuit queues to disk every 24 hours. + - Entry nodes that set "EntryStatistics 1" write statistics on the + rough number and origins of connecting clients to disk every 24 + hours. - Relays that write any of the above statistics to disk and set "ExtraInfoStatistics 1" include the past 24 hours of statistics in their extra-info documents. diff --git a/doc/spec/proposals/000-index.txt b/doc/spec/proposals/000-index.txt index af1f40bf6d..d2d3ca5d72 100644 --- a/doc/spec/proposals/000-index.txt +++ b/doc/spec/proposals/000-index.txt @@ -86,7 +86,7 @@ Proposals by number: 163 Detecting whether a connection comes from a client [OPEN] 164 Reporting the status of server votes [OPEN] 165 Easy migration for voting authority sets [OPEN] -166 Including Network Statistics in Extra-Info Documents [OPEN] +166 Including Network Statistics in Extra-Info Documents [ACCEPTED] Proposals by status: @@ -114,7 +114,6 @@ Proposals by status: 163 Detecting whether a connection comes from a client [for 0.2.2] 164 Reporting the status of server votes [for 0.2.2] 165 Easy migration for voting authority sets - 166 Including Network Statistics in Extra-Info Documents [for 0.2.2] ACCEPTED: 110 Avoiding infinite length circuits [for 0.2.1.x] [in 0.2.1.3-alpha] 117 IPv6 exits [for 0.2.1.x] @@ -122,6 +121,7 @@ Proposals by status: 140 Provide diffs between consensuses [for 0.2.2.x] 147 Eliminate the need for v2 directories in generating v3 directories [for 0.2.1.x] 157 Make certificate downloads specific [for 0.2.1.x] + 166 Including Network Statistics in Extra-Info Documents [for 0.2.2] META: 000 Index of Tor Proposals 001 The Tor Proposal Process diff --git a/doc/spec/proposals/166-statistics-extra-info-docs.txt b/doc/spec/proposals/166-statistics-extra-info-docs.txt index 6bc71cafd8..ab2716a71c 100644 --- a/doc/spec/proposals/166-statistics-extra-info-docs.txt +++ b/doc/spec/proposals/166-statistics-extra-info-docs.txt @@ -3,7 +3,7 @@ Title: Including Network Statistics in Extra-Info Documents Author: Karsten Loesing Created: 21-Jul-2009 Target: 0.2.2 -Status: Open +Status: Accepted Change history: diff --git a/src/or/geoip.c b/src/or/geoip.c index 786c40e5b1..622b582173 100644 --- a/src/or/geoip.c +++ b/src/or/geoip.c @@ -388,6 +388,36 @@ geoip_note_client_seen(geoip_client_action_t action, return; } + /* As a bridge that doesn't rotate request periods every 24 hours, + * possibly rotate now. */ + if (options->BridgeRelay) { + while (current_request_period_starts + REQUEST_HIST_PERIOD < now) { + if (!geoip_countries) + geoip_countries = smartlist_create(); + if (!current_request_period_starts) { + current_request_period_starts = now; + break; + } + /* Also discard all items in the client history that are too old. + * (This only works here because bridge and directory stats are + * independent. Otherwise, we'd only want to discard those items + * with action GEOIP_CLIENT_NETWORKSTATUS{_V2}.) */ + geoip_remove_old_clients(current_request_period_starts); + /* Now rotate request period */ + SMARTLIST_FOREACH(geoip_countries, geoip_country_t *, c, { + memmove(&c->n_v2_ns_requests[0], &c->n_v2_ns_requests[1], + sizeof(uint32_t)*(REQUEST_HIST_LEN-1)); + memmove(&c->n_v3_ns_requests[0], &c->n_v3_ns_requests[1], + sizeof(uint32_t)*(REQUEST_HIST_LEN-1)); + c->n_v2_ns_requests[REQUEST_HIST_LEN-1] = 0; + c->n_v3_ns_requests[REQUEST_HIST_LEN-1] = 0; + }); + current_request_period_starts += REQUEST_HIST_PERIOD; + if (n_old_request_periods < REQUEST_HIST_LEN-1) + ++n_old_request_periods; + } + } + lookup.ipaddr = addr; lookup.action = (int)action; ent = HT_FIND(clientmap, &client_history, &lookup); @@ -949,7 +979,8 @@ geoip_dirreq_stats_write(time_t now) if (!out) goto done; if (fprintf(out, "dirreq-stats-end %s (%d s)\ndirreq-v3-ips %s\n" - "dirreq-v2-ips %s\n", written, REQUEST_HIST_PERIOD, + "dirreq-v2-ips %s\n", written, + (unsigned) (now - start_of_dirreq_stats_interval), data_v3 ? data_v3 : "", data_v2 ? data_v2 : "") < 0) goto done; tor_free(data_v2); diff --git a/src/or/main.c b/src/or/main.c index 16136cb27f..fb6b1ea0e7 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -962,7 +962,6 @@ run_scheduled_events(time_t now) */ if (time_to_write_stats_files >= 0 && time_to_write_stats_files < now) { #define WRITE_STATS_INTERVAL (24*60*60) - or_options_t *options = get_options(); if (options->CellStatistics || options->DirReqStatistics || options->EntryStatistics || options->ExitPortStatistics) { if (!time_to_write_stats_files) { diff --git a/src/or/router.c b/src/or/router.c index bb63dc205e..64267f242c 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -1847,18 +1847,18 @@ load_stats_file(const char *filename, const char *end_line, time_t after, if (start != contents) start++; /* Avoid infinite loops. */ if (!(start = strstr(start, end_line))) - goto err; - if (strlen(start) < strlen(end_line) + sizeof(timestr)) - goto err; + goto notfound; + if (strlen(start) < strlen(end_line) + 1 + sizeof(timestr)) + goto notfound; strlcpy(timestr, start + 1 + strlen(end_line), sizeof(timestr)); if (parse_iso_time(timestr, &written) < 0) - goto err; - } while (written < after); + goto notfound; + } while (written <= after); *out = tor_malloc(strlen(start)); strlcpy(*out, start, strlen(start)); r = 1; } - err: + notfound: tor_free(contents); break; case FN_NOENT: @@ -2011,8 +2011,6 @@ extrainfo_dump_to_string(char *s, size_t maxlen, extrainfo_t *extrainfo, extrainfo_free(ei_tmp); } - log_info(LD_GENERAL, "Done with dumping our extra-info descriptor."); - return (int)strlen(s)+1; } -- 2.11.4.GIT