mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-27 22:03:31 +01:00
Merge remote-tracking branch 'tor-github/pr/1661/head' into maint-0.3.5
This commit is contained in:
commit
98e14720b5
4
changes/log_32868
Normal file
4
changes/log_32868
Normal file
@ -0,0 +1,4 @@
|
||||
o Minor features (debugging, directory system):
|
||||
- Don't crash when we find a non-guard with a guard-fraction value set.
|
||||
Instead, log a bug warning, in an attempt to figure out how this
|
||||
happened. Diagnostic for ticket 32868.
|
@ -540,6 +540,51 @@ bridge_get_advertised_bandwidth_bounded(routerinfo_t *router)
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* We have found an instance of bug 32868: log our best guess about where the
|
||||
* routerstatus was found.
|
||||
**/
|
||||
static void
|
||||
log_buggy_rs_source(const routerstatus_t *rs)
|
||||
{
|
||||
static ratelim_t buggy_rs_ratelim = RATELIM_INIT(1200);
|
||||
char *m;
|
||||
if ((m = rate_limit_log(&buggy_rs_ratelim, approx_time()))) {
|
||||
log_warn(LD_BUG,
|
||||
"Found a routerstatus %p with has_guardfraction=%u "
|
||||
" and guardfraction_percentage=%u, but is_possible_guard=%u.%s",
|
||||
rs,
|
||||
rs->has_guardfraction,
|
||||
rs->guardfraction_percentage,
|
||||
rs->is_possible_guard,
|
||||
m);
|
||||
tor_free(m);
|
||||
networkstatus_t *ns;
|
||||
int in_ns_count = 0;
|
||||
if ((ns = networkstatus_get_latest_consensus_by_flavor(FLAV_NS))) {
|
||||
int pos = smartlist_pos(ns->routerstatus_list, rs);
|
||||
if (pos >= 0) {
|
||||
++in_ns_count;
|
||||
log_warn(LD_BUG, "Found the routerstatus at position %d of the "
|
||||
"NS consensus.", pos);
|
||||
}
|
||||
}
|
||||
if ((ns = networkstatus_get_latest_consensus_by_flavor(FLAV_MICRODESC))) {
|
||||
int pos = smartlist_pos(ns->routerstatus_list, rs);
|
||||
if (pos >= 0) {
|
||||
++in_ns_count;
|
||||
log_warn(LD_BUG, "Found the routerstatus at position %d of the "
|
||||
"MD consensus.", pos);
|
||||
}
|
||||
}
|
||||
if (in_ns_count == 0) {
|
||||
log_warn(LD_BUG, "Could not find the routerstatus in any "
|
||||
"latest consensus.");
|
||||
}
|
||||
tor_assert_nonfatal_unreached();
|
||||
}
|
||||
}
|
||||
|
||||
/** Given a list of routers and a weighting rule as in
|
||||
* smartlist_choose_node_by_bandwidth_weights, compute weighted bandwidth
|
||||
* values for each node and store them in a freshly allocated
|
||||
@ -715,10 +760,11 @@ compute_weighted_bandwidths(const smartlist_t *sl,
|
||||
* choose N proportionally to F*Wpf*B + (1-F)*Wpn*B.
|
||||
*/
|
||||
if (node->rs && node->rs->has_guardfraction && rule != WEIGHT_FOR_GUARD) {
|
||||
/* XXX The assert should actually check for is_guard. However,
|
||||
* that crashes dirauths because of #13297. This should be
|
||||
* equivalent: */
|
||||
tor_assert(node->rs->is_possible_guard);
|
||||
/* We should only have guardfraction set if the node has the Guard
|
||||
flag. */
|
||||
if (! node->rs->is_possible_guard) {
|
||||
log_buggy_rs_source(node->rs);
|
||||
}
|
||||
|
||||
guard_get_guardfraction_bandwidth(&guardfraction_bw,
|
||||
this_bw,
|
||||
|
Loading…
Reference in New Issue
Block a user