X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?a=blobdiff_plain;f=backends%2Finnduct.c;h=8f4e29e8e2ca91f125ae3a5c00b08f6205d6bfc3;hb=8e079d66f9df85fca87d28847376b301a67cfd67;hp=b5fb0176cf5e8adc29ca33c5f5161994ff521ac0;hpb=e16776331bc287b4fda59165fc4425de205bbcd8;p=innduct.git diff --git a/backends/innduct.c b/backends/innduct.c index b5fb017..8f4e29e 100644 --- a/backends/innduct.c +++ b/backends/innduct.c @@ -373,7 +373,7 @@ static const char *inndconffile; static int max_connections=10; static int max_queue_per_conn=200; static int target_max_feedfile_size=100000; -static int period_seconds=60; +static int period_seconds=30; static int filepoll_seconds=5; static int max_queue_per_ipf=-1; @@ -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 */ @@ -532,7 +533,7 @@ static char *globpat_backlog; static pid_t self_pid; static int *lowvol_perperiod; static int lowvol_circptr; -static int lowvol_total; +static int lowvol_total; /* does not include current period */ /* statemc_init initialises */ static StateMachineState sms; @@ -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; @@ -1190,9 +1191,10 @@ static void conn_idle_close(Conn *conn, const char *why) { static void check_idle_conns(void) { Conn *conn; - int verylowvol= lowvol_perperiod[lowvol_circptr]; + int volthisperiod= lowvol_perperiod[lowvol_circptr]; lowvol_circptr++; lowvol_circptr %= lowvol_periods; + lowvol_total += volthisperiod; lowvol_total -= lowvol_perperiod[lowvol_circptr]; lowvol_perperiod[lowvol_circptr]= 0; @@ -1205,7 +1207,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) @@ -1220,9 +1223,9 @@ static void check_idle_conns(void) { } conn= LIST_HEAD(conns); - if (!verylowvol && + if (!volthisperiod && conns.count==1 && - lowvol_total+verylowvol < lowvol_thresh && + lowvol_total < lowvol_thresh && !conn_busy(conn)) conn_idle_close(conn, "low volume"); } @@ -1372,7 +1375,7 @@ static void connect_start(void) { assert(!connecting_fdpass_sock); info("starting connection attempt"); - int ok_reconnect_delay_periods= reconnect_delay_periods; + int ok_until_connect= until_connect; reconnect_blocking_event(); int socks[2]; @@ -1468,7 +1471,7 @@ static void connect_start(void) { on_fd_read_except(connecting_fdpass_sock, connchild_event); if (!conns.count) - reconnect_delay_periods= ok_reconnect_delay_periods; + until_connect= ok_until_connect; } /*---------- assigning articles to conns, and transmitting ----------*/ @@ -1639,6 +1642,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 +1653,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 +1955,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); } @@ -3307,11 +3312,11 @@ static void period(void) { debug("PERIOD" " sms=%s[%d] conns=%d until_connect=%d" " input_files main:%s flushing:%s backlog:%s[%d]" - " children connecting=%ld inndcomm=%ld" + " children connecting=%ld inndcomm=%ld lowvol_total=%d" , sms_names[sms], until_flush, conns.count, until_connect, dipf_main, dipf_flushing, dipf_backlog, until_backlog_nextscan, - (long)connecting_child, (long)inndcomm_child + (long)connecting_child, (long)inndcomm_child, lowvol_total ); free(dipf_main); @@ -3402,6 +3407,17 @@ CCMD(dump) { DUMPV("%d", , cli_master); fprintf(f,"\n"); + fprintf(f,"lowvol"); + DUMPV("%d", , lowvol_circptr); + DUMPV("%d", , lowvol_total); + fprintf(f,":"); + for (i=0; ifd); 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"); @@ -3770,6 +3786,7 @@ int main(int argc, char **argv) { lowvol_perperiod[i]= lowvol_thresh; lowvol_total += lowvol_thresh; } + lowvol_total -= lowvol_thresh; /* set things up */