Browse Source

Some final (?) cleanups of proposal 166 implementation.

Karsten Loesing 16 years ago
parent
commit
75c59d1a92

+ 12 - 11
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.

+ 2 - 2
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

+ 1 - 1
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:
 

+ 32 - 1
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);

+ 0 - 1
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) {

+ 6 - 8
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;
 }