[or-cvs] [tor/master 2/2] Even more accurate handling for shifting accounting intervals

nickm at torproject.org nickm at torproject.org
Fri Sep 24 03:14:12 UTC 2010


Author: Nick Mathewson <nickm at torproject.org>
Date: Tue, 21 Sep 2010 14:59:43 -0400
Subject: Even more accurate handling for shifting accounting intervals
Commit: 52db5c2539413aded9a7fb855030c6a3a7a25798

Roger correctly pointed out that my code was broken for accounting
periods that shifted forwards, since
start_of_accounting_period_containing(interval_start_time) would not
be equal to interval_start_time, but potentially much earlier.
---
 src/or/hibernate.c |   29 ++++++++++++++++++-----------
 1 files changed, 18 insertions(+), 11 deletions(-)

diff --git a/src/or/hibernate.c b/src/or/hibernate.c
index 994b7ea..eb9c1cf 100644
--- a/src/or/hibernate.c
+++ b/src/or/hibernate.c
@@ -354,31 +354,38 @@ length_of_accounting_period_containing(time_t now)
 void
 configure_accounting(time_t now)
 {
+  time_t s_now;
   /* Try to remember our recorded usage. */
   if (!interval_start_time)
     read_bandwidth_usage(); /* If we fail, we'll leave values at zero, and
                              * reset below.*/
-  if (!interval_start_time ||
-      start_of_accounting_period_after(interval_start_time) <= now) {
-    /* We didn't have recorded usage, or we don't have recorded usage
-     * for this interval. Start a new interval. */
+
+  s_now = start_of_accounting_period_containing(now);
+
+  if (!interval_start_time) {
+    /* We didn't have recorded usage; Start a new interval. */
     log_info(LD_ACCT, "Starting new accounting interval.");
     reset_accounting(now);
-  } else if (interval_start_time ==
-             start_of_accounting_period_containing(interval_start_time)) {
+  } else if (s_now == interval_start_time) {
     log_info(LD_ACCT, "Continuing accounting interval.");
     /* We are in the interval we thought we were in. Do nothing.*/
     interval_end_time = start_of_accounting_period_after(interval_start_time);
   } else {
-    time_t s_now = start_of_accounting_period_containing(interval_start_time);
-    long duration = length_of_accounting_period_containing(interval_start_time);
+    long duration = length_of_accounting_period_containing(now);
     double delta = ((double)(s_now - interval_start_time)) / duration;
     if (-0.50 <= delta && delta <= 0.50) {
-      /* The start of the period is now a little later than we remembered.
-       * That's fine; we might lose a little time, but that's ok.  */
+      /* The start of the period is now a little later or earlier than we
+       * remembered.  That's fine; we might lose some bytes we could otherwise
+       * have written, but better to err on the side of obeying people's
+       * accounting settings. */
       log_info(LD_ACCT, "Accounting interval moved by %.02f%%; "
                "that's fine.", delta*100);
-      interval_end_time = start_of_accounting_period_after(interval_start_time);
+      interval_end_time = start_of_accounting_period_after(now);
+    } else if (delta >= 0.99) {
+      /* This is the regular time-moved-forward case; don't be too noisy
+       * about it or people will complain */
+      log_info(LD_ACCT, "Accounting interval elapsed; starting a new one");
+      reset_accounting(now);
     } else {
       log_warn(LD_ACCT,
                "Mismatched accounting interval: moved by %.02f%%. "
-- 
1.7.1



More information about the tor-commits mailing list