typedef struct link_history_t {
/** When did we start tracking this list? */
time_t since;
+ /** When did we most recently note a change to this link */
+ time_t changed;
/** How many times did extending from OR1 to OR2 succeeed? */
unsigned long n_extend_ok;
/** How many times did extending from OR1 to OR2 fail? */
typedef struct or_history_t {
/** When did we start tracking this OR? */
time_t since;
+ /** When did we most recently note a change to this OR? */
+ time_t changed;
/** How many times did we successfully connect? */
unsigned long n_conn_ok;
/** How many times did we try to connect and fail?*/
if (!hist) {
hist = tor_malloc_zero(sizeof(or_history_t));
hist->link_history_map = strmap_new();
- hist->since = time(NULL);
+ hist->since = hist->changed = time(NULL);
strmap_set(history_map, hexid, hist);
}
return hist;
lhist = (link_history_t*) strmap_get(orhist->link_history_map, to_hexid);
if (!lhist) {
lhist = tor_malloc_zero(sizeof(link_history_t));
- lhist->since = time(NULL);
+ lhist->since = lhist->changed = time(NULL);
strmap_set(orhist->link_history_map, to_hexid, lhist);
}
return lhist;
}
+static void
+_free_link_history(void *val)
+{
+ tor_free(val);
+}
+
+static void
+free_or_history(or_history_t *hist)
+{
+ strmap_free(hist->link_history_map, _free_link_history);
+ tor_free(hist);
+}
+
/** Update an or_history_t object <b>hist</b> so that its uptime/downtime
* count is up-to-date as of <b>when</b>.
*/
}
if (!hist->down_since)
hist->down_since = when;
+ hist->changed = when;
}
/** Remember that an attempt to connect to the OR with identity digest
}
if (!hist->up_since)
hist->up_since = when;
+ hist->changed = when;
}
/** Remember that we intentionally closed our connection to the OR
hist->uptime += (when - hist->up_since);
hist->up_since = 0;
}
+ hist->changed = when;
}
/** Remember that our connection to the OR with identity digest
}
if (!hist->down_since)
hist->down_since = when;
+ hist->changed = when;
}
/** Remember that we successfully extended from the OR with identity
if (!hist)
return;
++hist->n_extend_ok;
+ hist->changed = time(NULL);
}
/** Remember that we tried to extend from the OR with identity digest
if (!hist)
return;
++hist->n_extend_fail;
+ hist->changed = time(NULL);
}
/** Log all the reliability data we have rememberred, with the chosen
unsigned long upt, downt;
routerinfo_t *r;
+ rep_history_clean(now-24*60*60);
+
log(severity, "--------------- Dumping history information:");
for (orhist_it = strmap_iter_init(history_map); !strmap_iter_done(orhist_it);
}
}
+/** Remove history info for routers/links that haven't changed since
+ * <b>before</b> */
+void rep_history_clean(time_t before)
+{
+ or_history_t *or_history;
+ link_history_t *link_history;
+ void *or_history_p, *link_history_p;
+ strmap_iter_t *orhist_it, *lhist_it;
+ const char *hd1, *hd2;
+
+ orhist_it = strmap_iter_init(history_map);
+ while (!strmap_iter_done(orhist_it)) {
+ strmap_iter_get(orhist_it, &hd1, &or_history_p);
+ or_history = or_history_p;
+ if (or_history->changed < before) {
+ free_or_history(or_history);
+ orhist_it = strmap_iter_next_rmv(history_map, orhist_it);
+ continue;
+ }
+ for (lhist_it = strmap_iter_init(or_history->link_history_map);
+ !strmap_iter_done(lhist_it); ) {
+ strmap_iter_get(lhist_it, &hd2, &link_history_p);
+ link_history = link_history_p;
+ if (link_history->changed < before) {
+ tor_free(link_history);
+ lhist_it = strmap_iter_next_rmv(or_history->link_history_map,lhist_it);
+ continue;
+ }
+ lhist_it = strmap_iter_next(or_history->link_history_map,lhist_it);
+ }
+ orhist_it = strmap_iter_next(history_map, orhist_it);
+ }
+}
+
#if 0
void write_rep_history(const char *filename)
{