Supply better and less frequent warnings on circID exhaustion

Fixes the surface behavior of #11553
This commit is contained in:
Nick Mathewson 2014-04-18 12:28:30 -04:00
parent f3c20a28ab
commit bb9b4c37f8
3 changed files with 15 additions and 1 deletions

5
changes/bug11553 Normal file
View File

@ -0,0 +1,5 @@
o Minor features:
- When we run out of usable circuit IDs on a channel, log only one
warning for the whole channel, and include a description of
how many circuits there were on the channel. Fix for part of ticket
#11553.

View File

@ -148,6 +148,8 @@ struct channel_s {
ENUM_BF(circ_id_type_t) circ_id_type:2;
/** DOCDOC*/
unsigned wide_circ_ids:1;
/** Have we logged a warning about circID exhaustion on this channel? */
unsigned warned_circ_ids_exhausted:1;
/*
* Which circ_id do we try to use next on this connection? This is
* always in the range 0..1<<15-1.

View File

@ -127,7 +127,14 @@ get_unique_circ_id_by_chan(channel_t *chan)
/* Make sure we don't loop forever if all circ_id's are used. This
* matters because it's an external DoS opportunity.
*/
log_warn(LD_CIRC,"No unused circ IDs. Failing.");
if (! chan->warned_circ_ids_exhausted) {
chan->warned_circ_ids_exhausted = 1;
log_warn(LD_CIRC,"No unused circIDs found on channel %s wide "
"circID support, with %u inbound and %u outbound circuits. "
"Failing a circuit.",
chan->wide_circ_ids ? "with" : "without",
chan->num_p_circuits, chan->num_n_circuits);
}
return 0;
}
test_circ_id |= high_bit;