chiark / gitweb /
store and print reason for idle timeouts ("quitting")
authorIan Jackson <ian@liberator.(none)>
Wed, 5 May 2010 20:40:35 +0000 (21:40 +0100)
committerIan Jackson <ian@liberator.(none)>
Wed, 5 May 2010 20:40:35 +0000 (21:40 +0100)
backends/innduct.c

index b5fb0176cf5e8adc29ca33c5f5161994ff521ac0..fb5ddca266c491a63463724f7e378dd9c7546013 100644 (file)
@@ -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");