sched: Use SCHED_BUG() macro in scheduler

When a BUG() occurs, this macro will print extra information about the state
of the scheduler and the given channel if any. This will help us greatly to
fix future bugs in the scheduler especially when they occur rarely.

Fixes #23753

Signed-off-by: David Goulet <dgoulet@torproject.org>
This commit is contained in:
David Goulet 2017-10-03 14:38:30 -04:00 committed by Nick Mathewson
parent 2e8de0de3b
commit 3931a6f264
3 changed files with 9 additions and 5 deletions

4
changes/bug23753 Normal file
View File

@ -0,0 +1,4 @@
o Minor features (logging, scheduler):
- Introduce a SCHED_BUG() function to log extra information about the
scheduler state if we ever catch a bug in the scheduler. Closes ticket
23753.

View File

@ -607,7 +607,7 @@ scheduler_release_channel,(channel_t *chan))
}
if (chan->scheduler_state == SCHED_CHAN_PENDING) {
if (smartlist_pos(channels_pending, chan) == -1) {
if (SCHED_BUG(smartlist_pos(channels_pending, chan) == -1, chan)) {
log_warn(LD_SCHED, "Scheduler asked to release channel %" PRIu64 " "
"but it wasn't in channels_pending",
chan->global_identifier);

View File

@ -116,7 +116,7 @@ channel_outbuf_length(channel_t *chan)
/* In theory, this can not happen because we can not scheduler a channel
* without a connection that has its outbuf initialized. Just in case, bug
* on this so we can understand a bit more why it happened. */
if (BUG(BASE_CHAN_TO_TLS(chan)->conn == NULL)) {
if (SCHED_BUG(BASE_CHAN_TO_TLS(chan)->conn == NULL, chan)) {
return 0;
}
return buf_datalen(TO_CONN(BASE_CHAN_TO_TLS(chan)->conn)->outbuf);
@ -370,7 +370,7 @@ socket_can_write(socket_table_t *table, const channel_t *chan)
{
socket_table_ent_t *ent = NULL;
ent = socket_table_search(table, chan);
IF_BUG_ONCE(!ent) {
if (SCHED_BUG(!ent, chan)) {
return 1; // Just return true, saying that kist wouldn't limit the socket
}
@ -390,7 +390,7 @@ update_socket_info(socket_table_t *table, const channel_t *chan)
{
socket_table_ent_t *ent = NULL;
ent = socket_table_search(table, chan);
IF_BUG_ONCE(!ent) {
if (SCHED_BUG(!ent, chan)) {
return; // Whelp. Entry didn't exist for some reason so nothing to do.
}
update_socket_info_impl(ent);
@ -402,7 +402,7 @@ update_socket_written(socket_table_t *table, channel_t *chan, size_t bytes)
{
socket_table_ent_t *ent = NULL;
ent = socket_table_search(table, chan);
IF_BUG_ONCE(!ent) {
if (SCHED_BUG(!ent, chan)) {
return; // Whelp. Entry didn't exist so nothing to do.
}