diff options
author | Nick Mathewson <nickm@torproject.org> | 2007-08-17 20:31:54 +0000 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2007-08-17 20:31:54 +0000 |
commit | 31668172eda0e3798ba18e59f18a0e2c10128595 (patch) | |
tree | 0fe6ca60e37d2ddd9e6465d12b81832ec2823cb2 /src | |
parent | 3f186e6510f0df216ee1f807922745b21c791c68 (diff) | |
download | tor-31668172eda0e3798ba18e59f18a0e2c10128595.tar.gz tor-31668172eda0e3798ba18e59f18a0e2c10128595.zip |
r14626@catbus: nickm | 2007-08-17 11:20:05 -0400
Link note_router_reachable and note_router_unreachable to mtbf code. decouple mtbf from connect/disconnect. log it in USR1. do not blow it away on cleanup if we are an authority.
svn:r11151
Diffstat (limited to 'src')
-rw-r--r-- | src/or/rephist.c | 70 |
1 files changed, 43 insertions, 27 deletions
diff --git a/src/or/rephist.c b/src/or/rephist.c index 628bf794bc..87804182af 100644 --- a/src/or/rephist.c +++ b/src/or/rephist.c @@ -166,13 +166,6 @@ rep_hist_init(void) static void mark_or_down(or_history_t *hist, time_t when, int failed) { - if (hist->start_of_run) { - /*XXXX020 treat failure specially. */ - long run_length = when - hist->start_of_run; - hist->weighted_run_length += run_length; - hist->total_run_weights += 1.0; - hist->start_of_run = 0; - } if (hist->up_since) { hist->uptime += (when - hist->up_since); hist->up_since = 0; @@ -186,9 +179,6 @@ mark_or_down(or_history_t *hist, time_t when, int failed) static void mark_or_up(or_history_t *hist, time_t when) { - if (!hist->start_of_run) { - hist->start_of_run = when; - } if (hist->down_since) { hist->downtime += (when - hist->down_since); hist->down_since = 0; @@ -267,8 +257,10 @@ rep_hist_note_connection_died(const char* id, time_t when) void rep_hist_note_router_reachable(const char *id, time_t when) { - (void)id; - (void)when; + or_history_t *hist = get_or_history(id); + if (hist && !hist->start_of_run) { + hist->start_of_run = when; + } } /** We have just decided that this router is unreachable, meaning @@ -276,8 +268,14 @@ rep_hist_note_router_reachable(const char *id, time_t when) void rep_hist_note_router_unreachable(const char *id, time_t when) { - (void)id; - (void)when; + or_history_t *hist = get_or_history(id); + if (hist && hist->start_of_run) { + /*XXXX020 treat failure specially. */ + long run_length = when - hist->start_of_run; + hist->weighted_run_length += run_length; + hist->total_run_weights += 1.0; + hist->start_of_run = 0; + } } /**DOCDOC*/ @@ -316,18 +314,13 @@ rep_hist_downrate_old_runs(time_t now) return stability_last_downrated + STABILITY_INTERVAL; } -/**DOCDOC*/ -double -rep_hist_get_stability(const char *id, time_t when) +/** DOCDOC */ +static double +get_stability(or_history_t *hist, time_t when) { - or_history_t *hist = get_or_history(id); - unsigned long total; - double total_weights; - if (!hist) - return 0.0; + unsigned long total = hist->weighted_run_length; + double total_weights = hist->total_run_weights; - total = hist->weighted_run_length; - total_weights = hist->total_run_weights; if (hist->start_of_run) { total += (when-hist->start_of_run); total_weights += 1.0; @@ -338,6 +331,17 @@ rep_hist_get_stability(const char *id, time_t when) return total / total_weights; } +/**DOCDOC*/ +double +rep_hist_get_stability(const char *id, time_t when) +{ + or_history_t *hist = get_or_history(id); + if (!hist) + return 0.0; + + return get_stability(hist, when); +} + /** Remember that we successfully extended from the OR with identity * digest <b>from_id</b> to the OR with identity digest * <b>to_name</b>. @@ -397,6 +401,8 @@ rep_hist_dump_stats(time_t now, int severity) for (orhist_it = digestmap_iter_init(history_map); !digestmap_iter_done(orhist_it); orhist_it = digestmap_iter_next(history_map,orhist_it)) { + double s; + long stability; digestmap_iter_get(orhist_it, &digest1, &or_history_p); or_history = (or_history_t*) or_history_p; @@ -408,16 +414,20 @@ rep_hist_dump_stats(time_t now, int severity) update_or_history(or_history, now); upt = or_history->uptime; downt = or_history->downtime; + s = get_stability(or_history, now); + stability = (long)s; if (upt+downt) { uptime = ((double)upt) / (upt+downt); } else { uptime=1.0; } log(severity, LD_GENERAL, - "OR %s [%s]: %ld/%ld good connections; uptime %ld/%ld sec (%.2f%%)", + "OR %s [%s]: %ld/%ld good connections; uptime %ld/%ld sec (%.2f%%); " + "wmtbf %lu:%lu:%lu", name1, hexdigest1, or_history->n_conn_ok, or_history->n_conn_fail+or_history->n_conn_ok, - upt, upt+downt, uptime*100.0); + upt, upt+downt, uptime*100.0, + stability/3600, (stability/60)%60, stability%60); if (!digestmap_isempty(or_history->link_history_map)) { strlcpy(buffer, " Extend attempts: ", sizeof(buffer)); @@ -453,6 +463,7 @@ rep_hist_dump_stats(time_t now, int severity) void rep_history_clean(time_t before) { + int authority = authdir_mode(get_options()); or_history_t *or_history; link_history_t *link_history; void *or_history_p, *link_history_p; @@ -461,9 +472,14 @@ rep_history_clean(time_t before) orhist_it = digestmap_iter_init(history_map); while (!digestmap_iter_done(orhist_it)) { + int remove; digestmap_iter_get(orhist_it, &d1, &or_history_p); or_history = or_history_p; - if (or_history->changed < before) { + + remove = authority ? (or_history->total_run_weights < STABILITY_EPSILON && + !or_history->start_of_run) + : (or_history->changed < before); + if (remove) { orhist_it = digestmap_iter_next_rmv(history_map, orhist_it); free_or_history(or_history); continue; |