aboutsummaryrefslogtreecommitdiff
path: root/src/or/main.c
diff options
context:
space:
mode:
authorKarsten Loesing <karsten.loesing@gmx.net>2010-06-21 18:52:46 +0200
committerKarsten Loesing <karsten.loesing@gmx.net>2010-08-05 13:05:25 +0200
commit166c2f4d92e0d1f55a6141acb076b10ad356f285 (patch)
treec295b983388f8beea15c7271423897edbfb4e8c5 /src/or/main.c
parentcafd868a7898a0aac7eaf58f76a8e1180766d3a8 (diff)
downloadtor-166c2f4d92e0d1f55a6141acb076b10ad356f285.tar.gz
tor-166c2f4d92e0d1f55a6141acb076b10ad356f285.zip
Allow enabling or disabling *Statistics while Tor is running.
With this patch we stop scheduling when we should write statistics using a single timestamp in run_scheduled_events(). Instead, we remember when a statistics interval starts separately for each statistic type in geoip.c and rephist.c. Every time run_scheduled_events() tries to write stats to disk, it learns when it should schedule the next such attempt. This patch also enables all statistics to be stopped and restarted at a later time. This patch comes with a few refactorings, some of which were not easily doable without the patch.
Diffstat (limited to 'src/or/main.c')
-rw-r--r--src/or/main.c58
1 files changed, 24 insertions, 34 deletions
diff --git a/src/or/main.c b/src/or/main.c
index ff674f386a..2d75a58088 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -997,42 +997,32 @@ run_scheduled_events(time_t now)
/* 1g. Check whether we should write statistics to disk.
*/
- if (time_to_write_stats_files >= 0 && time_to_write_stats_files < now) {
-#define WRITE_STATS_INTERVAL (24*60*60)
- if (options->CellStatistics || options->DirReqStatistics ||
- options->EntryStatistics || options->ExitPortStatistics) {
- if (!time_to_write_stats_files) {
- /* Initialize stats. We're doing this here and not in options_act,
- * so that we know exactly when the 24 hours interval ends. */
- if (options->CellStatistics)
- rep_hist_buffer_stats_init(now);
- if (options->DirReqStatistics)
- geoip_dirreq_stats_init(now);
- if (options->EntryStatistics)
- geoip_entry_stats_init(now);
- if (options->ExitPortStatistics)
- rep_hist_exit_stats_init(now);
- log_notice(LD_CONFIG, "Configured to measure statistics. Look for "
- "the *-stats files that will first be written to the "
- "data directory in %d hours from now.",
- WRITE_STATS_INTERVAL / (60 * 60));
- time_to_write_stats_files = now + WRITE_STATS_INTERVAL;
- } else {
- /* Write stats to disk. */
- if (options->CellStatistics)
+ if (time_to_write_stats_files < now) {
+#define CHECK_WRITE_STATS_INTERVAL (60*60)
+ time_t next_time_to_write_stats_files = (time_to_write_stats_files > 0 ?
+ time_to_write_stats_files : now) + CHECK_WRITE_STATS_INTERVAL;
+ if (options->CellStatistics) {
+ time_t next_write =
rep_hist_buffer_stats_write(time_to_write_stats_files);
- if (options->DirReqStatistics)
- geoip_dirreq_stats_write(time_to_write_stats_files);
- if (options->EntryStatistics)
- geoip_entry_stats_write(time_to_write_stats_files);
- if (options->ExitPortStatistics)
- rep_hist_exit_stats_write(time_to_write_stats_files);
- time_to_write_stats_files += WRITE_STATS_INTERVAL;
- }
- } else {
- /* Never write stats to disk */
- time_to_write_stats_files = -1;
+ if (next_write && next_write < next_time_to_write_stats_files)
+ next_time_to_write_stats_files = next_write;
+ }
+ if (options->DirReqStatistics) {
+ time_t next_write = geoip_dirreq_stats_write(time_to_write_stats_files);
+ if (next_write && next_write < next_time_to_write_stats_files)
+ next_time_to_write_stats_files = next_write;
+ }
+ if (options->EntryStatistics) {
+ time_t next_write = geoip_entry_stats_write(time_to_write_stats_files);
+ if (next_write && next_write < next_time_to_write_stats_files)
+ next_time_to_write_stats_files = next_write;
+ }
+ if (options->ExitPortStatistics) {
+ time_t next_write = rep_hist_exit_stats_write(time_to_write_stats_files);
+ if (next_write && next_write < next_time_to_write_stats_files)
+ next_time_to_write_stats_files = next_write;
}
+ time_to_write_stats_files = next_time_to_write_stats_files;
}
/* 1h. Check whether we should write bridge statistics to disk.