From a976a51e5d7a19c33ddccfc29de9928dfa3a431b Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Wed, 5 May 2010 21:40:35 +0100 Subject: [PATCH] store and print reason for idle timeouts ("quitting") --- backends/innduct.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/backends/innduct.c b/backends/innduct.c index b5fb017..fb5ddca 100644 --- a/backends/innduct.c +++ b/backends/innduct.c @@ -511,7 +511,8 @@ struct Conn { ISNODE(Conn); int fd; /* may be 0, meaning closed (during construction/destruction) */ oop_read *rd; /* likewise */ - int max_queue, stream, quitting; + int max_queue, stream; + const char *quitting; int since_activity; /* periods */ ArticleList waiting; /* not yet told peer */ ArticleList priority; /* peer says send it now */ @@ -1175,7 +1176,7 @@ static void conn_idle_close(Conn *conn, const char *why) { assert(r<=todo); todo -= r; if (!todo) { - conn->quitting= 1; + conn->quitting= why; conn->since_activity= 0; debug("C%d is idle (%s), quitting", conn->fd, why); break; @@ -1205,7 +1206,8 @@ static void check_idle_conns(void) { /* We need to shut this down */ if (conn->quitting) - connfail(conn,"timed out waiting for response to QUIT"); + connfail(conn,"timed out waiting for response to QUIT (%s)", + conn->quitting); else if (conn->sent.count) connfail(conn,"timed out waiting for responses"); else if (conn->waiting.count || conn->priority.count) @@ -1639,6 +1641,7 @@ static void autodefer_input_file_articles(InputFile *ipf) { } static void autodefer_input_file(InputFile *ipf) { + static const char *const abandon= "stuck"; ipf->autodefer= 0; autodefer_input_file_articles(ipf); @@ -1649,11 +1652,11 @@ static void autodefer_input_file(InputFile *ipf) { if (has_article_in(&walk->waiting, ipf) || has_article_in(&walk->priority, ipf) || has_article_in(&walk->sent, ipf)) - walk->quitting= -1; + walk->quitting= abandon; } while (ipf->inprogress) { FOR_CONN(walk) - if (walk->quitting < 0) goto found; + if (walk->quitting == abandon) goto found; abort(); /* where are they ?? */ found: @@ -1951,11 +1954,12 @@ static void *peer_rd_ok(oop_source *lp, oop_read *oread, oop_rd_event ev, if (conn->quitting) { if (code!=205 && code!=400) { - connfail(conn, "peer gave unexpected response to QUIT: %s", sani); + connfail(conn, "peer gave unexpected response to QUIT (%s): %s", + conn->quitting, sani); } else { LIST_REMOVE(conns,conn); - notice("C%d (now %d) idle connection closed by us", - conn->fd, conns.count); + notice("C%d (now %d) idle connection closed (%s)", + conn->fd, conns.count, conn->quitting); assert(!busy); conn_dispose(conn); } @@ -3416,7 +3420,7 @@ CCMD(dump) { fprintf(f,"C%d",conn->fd); DUMPV("%p",conn->,rd); DUMPV("%d",conn->,max_queue); - DUMPV("%d",conn->,stream); DUMPV("%d",conn->,quitting); + DUMPV("%d",conn->,stream); DUMPV("\"%s\"",conn->,quitting); DUMPV("%d",conn->,since_activity); fprintf(f,"\n"); -- 2.30.2