summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2011-04-28 20:53:44 -0400
committerNick Mathewson <nickm@torproject.org>2011-04-28 20:53:44 -0400
commit4010427b519c3727351905bbe5a75e85a055dd58 (patch)
tree04127e9647817d2c7ee9c65f37045a128bd2650b
parent5693fedb60ee19048d45ed892edb07925b52678b (diff)
parentdf3cf881d1d217b6ff3757bf95f8c2784584fec8 (diff)
downloadtor-4010427b519c3727351905bbe5a75e85a055dd58.tar.gz
tor-4010427b519c3727351905bbe5a75e85a055dd58.zip
Merge remote-tracking branch 'arma/bug3039' into maint-0.2.2
-rw-r--r--changes/bug30395
-rw-r--r--src/or/circuitbuild.c2
-rw-r--r--src/or/config.c20
-rw-r--r--src/or/config.h1
4 files changed, 24 insertions, 4 deletions
diff --git a/changes/bug3039 b/changes/bug3039
new file mode 100644
index 0000000000..7347ee38e1
--- /dev/null
+++ b/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.
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index fe94264555..85765e3e6b 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -119,7 +119,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) {
diff --git a/src/or/config.c b/src/or/config.c
index 9384b3a68a..7534cc7f69 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -5119,6 +5119,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
@@ -5143,11 +5155,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"
@@ -5158,7 +5172,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
@@ -5167,7 +5181,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);
diff --git a/src/or/config.h b/src/or/config.h
index defda35e0b..78a67dddf5 100644
--- a/src/or/config.h
+++ b/src/or/config.h
@@ -58,6 +58,7 @@ char *options_get_datadir_fname2_suffix(or_options_t *options,
get_datadir_fname2_suffix((sub1), NULL, (suffix))
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);