Просмотр исходного кода

Merge remote-tracking branch 'origin/maint-0.2.2'

Nick Mathewson 13 лет назад
Родитель
Сommit
b0a7e0d6ca
4 измененных файлов с 24 добавлено и 4 удалено
  1. 5 0
      changes/bug3039
  2. 1 1
      src/or/circuitbuild.c
  3. 17 3
      src/or/config.c
  4. 1 0
      src/or/config.h

+ 5 - 0
changes/bug3039

@@ -0,0 +1,5 @@
+  o Minor bugfixes:
+    - Write the current time into the LastWritten line in our state file,
+      rather than the time from the previous write attempt. Also, stop
+      trying to use a time of -1 in our log statements. Fixes bug 3039;
+      bugfix on 0.2.2.14-alpha.

+ 1 - 1
src/or/circuitbuild.c

@@ -120,7 +120,7 @@ circuit_build_times_disabled(void)
                                                      0, 0, 1);
     int config_disabled = !get_options()->LearnCircuitBuildTimeout;
     int dirauth_disabled = get_options()->AuthoritativeDir;
-    int state_disabled = (get_or_state()->LastWritten == -1);
+    int state_disabled = did_last_state_file_write_fail() ? 1 : 0;
 
     if (consensus_disabled || config_disabled || dirauth_disabled ||
            state_disabled) {

+ 17 - 3
src/or/config.c

@@ -5285,6 +5285,18 @@ or_state_load(void)
   return r;
 }
 
+/** Did the last time we tried to write the state file fail? If so, we
+ * should consider disabling such features as preemptive circuit generation
+ * to compute circuit-build-time. */
+static int last_state_file_write_failed = 0;
+
+/** Return whether the state file failed to write last time we tried. */
+int
+did_last_state_file_write_fail(void)
+{
+  return last_state_file_write_failed;
+}
+
 /** If writing the state to disk fails, try again after this many seconds. */
 #define STATE_WRITE_RETRY_INTERVAL 3600
 
@@ -5309,11 +5321,13 @@ or_state_save(time_t now)
   if (accounting_is_enabled(get_options()))
     accounting_run_housekeeping(now);
 
+  global_state->LastWritten = now;
+
   tor_free(global_state->TorVersion);
   tor_asprintf(&global_state->TorVersion, "Tor %s", get_version());
 
   state = config_dump(&state_format, global_state, 1, 0);
-  format_local_iso_time(tbuf, time(NULL));
+  format_local_iso_time(tbuf, now);
   tor_asprintf(&contents,
                "# Tor state file last generated on %s local time\n"
                "# Other times below are in GMT\n"
@@ -5324,7 +5338,7 @@ or_state_save(time_t now)
   if (write_str_to_file(fname, contents, 0)<0) {
     log_warn(LD_FS, "Unable to write state to file \"%s\"; "
              "will try again later", fname);
-    global_state->LastWritten = -1;
+    last_state_file_write_failed = 1;
     tor_free(fname);
     tor_free(contents);
     /* Try again after STATE_WRITE_RETRY_INTERVAL (or sooner, if the state
@@ -5333,7 +5347,7 @@ or_state_save(time_t now)
     return -1;
   }
 
-  global_state->LastWritten = time(NULL);
+  last_state_file_write_failed = 0;
   log_info(LD_GENERAL, "Saved state to \"%s\"", fname);
   tor_free(fname);
   tor_free(contents);

+ 1 - 0
src/or/config.h

@@ -60,6 +60,7 @@ char *options_get_datadir_fname2_suffix(or_options_t *options,
 int get_num_cpus(const or_options_t *options);
 
 or_state_t *get_or_state(void);
+int did_last_state_file_write_fail(void);
 int or_state_save(time_t now);
 
 int options_need_geoip_info(or_options_t *options, const char **reason_out);