chiark
/
gitweb
/
~ian
/
innduct.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
store and print reason for idle timeouts ("quitting")
[innduct.git]
/
backends
/
innduct.c
diff --git
a/backends/innduct.c
b/backends/innduct.c
index b5fb0176cf5e8adc29ca33c5f5161994ff521ac0..fb5ddca266c491a63463724f7e378dd9c7546013 100644
(file)
--- 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 */
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 */
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) {
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;
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)
/* 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)
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 void autodefer_input_file(InputFile *ipf) {
+ static const char *const abandon= "stuck";
ipf->autodefer= 0;
autodefer_input_file_articles(ipf);
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))
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)
}
while (ipf->inprogress) {
FOR_CONN(walk)
- if (walk->quitting
< 0
) goto found;
+ if (walk->quitting
== abandon
) goto found;
abort(); /* where are they ?? */
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) {
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);
} 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);
}
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);
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");
DUMPV("%d",conn->,since_activity);
fprintf(f,"\n");