summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changes/bug194763
-rw-r--r--src/or/config.c4
-rw-r--r--src/or/config.h4
-rw-r--r--src/or/main.c19
4 files changed, 21 insertions, 9 deletions
diff --git a/changes/bug19476 b/changes/bug19476
new file mode 100644
index 0000000000..25a0578686
--- /dev/null
+++ b/changes/bug19476
@@ -0,0 +1,3 @@
+ o Minor changes:
+ - If we fail to write a heartbeat message, schedule a retry for the minimum
+ heartbeat interval number of seconds in the future. Fixes bug 19476.
diff --git a/src/or/config.c b/src/or/config.c
index 6c0856b141..5e7fb18deb 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -2805,10 +2805,6 @@ compute_publishserverdescriptor(or_options_t *options)
* will generate too many circuits and potentially overload the network. */
#define MIN_CIRCUIT_STREAM_TIMEOUT 10
-/** Lowest allowable value for HeartbeatPeriod; if this is too low, we might
- * expose more information than we're comfortable with. */
-#define MIN_HEARTBEAT_PERIOD (30*60)
-
/** Lowest recommended value for CircuitBuildTimeout; if it is set too low
* and LearnCircuitBuildTimeout is off, the failure rate for circuit
* construction may be very high. In that case, if it is set below this
diff --git a/src/or/config.h b/src/or/config.h
index 27aec7fe3d..3cfa7c4e5b 100644
--- a/src/or/config.h
+++ b/src/or/config.h
@@ -18,6 +18,10 @@
#define KERNEL_MAY_SUPPORT_IPFW
#endif
+/** Lowest allowable value for HeartbeatPeriod; if this is too low, we might
+ * expose more information than we're comfortable with. */
+#define MIN_HEARTBEAT_PERIOD (30*60)
+
MOCK_DECL(const char*, get_dirportfrontpage, (void));
MOCK_DECL(const or_options_t *, get_options, (void));
MOCK_DECL(or_options_t *, get_options_mutable, (void));
diff --git a/src/or/main.c b/src/or/main.c
index 7e2652cb86..0a0943d344 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -2060,6 +2060,9 @@ check_fw_helper_app_callback(time_t now, const or_options_t *options)
/**
* Periodic callback: write the heartbeat message in the logs.
+ *
+ * If writing the heartbeat message to the logs fails for some reason, retry
+ * again after <b>MIN_HEARTBEAT_PERIOD</b> seconds.
*/
static int
heartbeat_callback(time_t now, const or_options_t *options)
@@ -2071,14 +2074,20 @@ heartbeat_callback(time_t now, const or_options_t *options)
return PERIODIC_EVENT_NO_UPDATE;
}
- /* Write the heartbeat message */
+ /* Skip the first one. */
if (first) {
- first = 0; /* Skip the first one. */
- } else {
- log_heartbeat(now);
+ first = 0;
+ return options->HeartbeatPeriod;
}
- return options->HeartbeatPeriod;
+ /* Write the heartbeat message */
+ if (log_heartbeat(now) == 0) {
+ return options->HeartbeatPeriod;
+ } else {
+ /* If we couldn't write the heartbeat log message, try again in the minimum
+ * interval of time. */
+ return MIN_HEARTBEAT_PERIOD;
+ }
}
#define CDM_CLEAN_CALLBACK_INTERVAL 600