chiark / gitweb /
longer log messages
[innduct.git] / backends / innduct.c
index 897ec37bc3f94a908b6bf1dec19541f2f1bbf891..af192db149f7952e768315f6d9d35e9de400935e 100644 (file)
@@ -1,28 +1,38 @@
+/*
+ *  innduct
+ *  tailing reliable realtime streaming feeder for inn
+ *
+ *  Copyright (C) 2010 Ian Jackson <ijackson@chiark.greenend.org.uk>
+ * 
+ *  This program is free software: you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation, either version 3 of the License, or
+ *  (at your option) any later version.
+ * 
+ *  This program is distributed in the hope that it will be useful,
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *  GNU General Public License for more details.
+ * 
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ *  (I believe that when you compile and link this as part of the inn2
+ *  build, with the Makefile runes I have provided, all the libraries
+ *  and files which end up included in innduct are licence-compatible
+ *  with GPLv3.  If not then please let me know.  -Ian Jackson.)
+ */
+
+/*
+ * todo
+ *  specify perms of /tmp/innduct.control
+ */
+
 /*
  * debugging rune:
  *  build-lfs/backends/innduct --connection-timeout=30 --no-daemon -C ../inn.conf -f `pwd`/fee sit localhost
  */
 
-/*--
-flow control notes
-to ensure articles go away eventually
-separate queue for each input file
-  queue expiry
-    every period, check head of backlog queue for expiry with SMretrieve
-      if too old: discard, and check next article
-    also check every backlog article as we read it
-  flush expiry
-    after too long in SEPARATED/DROPPING ie Separated/Finishing/Dropping
-    one-off: eat queued articles from flushing and write them to defer
-    one-off: connfail all connections which have any articles from flushing
-    newly read articles from flushing go straight to defer
-    this should take care of it and get us out of this state
-to avoid filling up ram needlessly
-  input control
-    limit number of queued articles for each ipf
-    pause/resume inputfile tailing
---*/
-
 /*
  * Newsfeeds file entries should look like this:
  *     host.name.of.site[/exclude,exclude,...]\
@@ -462,7 +472,7 @@ struct InputFile {
   long autodefer; /* -1 means not doing autodefer */
 
   int counts[art_MaxState][RCI_max];
-  int readcount_ok, readcount_blank, readcount_err;
+  int readcount_ok, readcount_blank, readcount_err, count_nooffer_missing;
   char path[];
 };
 
@@ -554,7 +564,7 @@ static void logv(int sysloglevel, const char *pfx, int errnoval,
                 const char *fmt, va_list al) PRINTF(5,0);
 static void logv(int sysloglevel, const char *pfx, int errnoval,
                 const char *fmt, va_list al) {
-  char msgbuf[256]; /* NB do not call xvasprintf here or you'll recurse */
+  char msgbuf[1024]; /* NB do not call xvasprintf here or you'll recurse */
   vsnprintf(msgbuf,sizeof(msgbuf), fmt,al);
   msgbuf[sizeof(msgbuf)-1]= 0;
 
@@ -1539,6 +1549,26 @@ static void conn_maybe_write(Conn *conn)  {
 
 /*---------- expiry, flow control and deferral ----------*/
 
+/*
+ * flow control notes
+ * to ensure articles go away eventually
+ * separate queue for each input file
+ *   queue expiry
+ *     every period, check head of backlog queue for expiry with SMretrieve
+ *       if too old: discard, and check next article
+ *     also check every backlog article as we read it
+ *   flush expiry
+ *     after too long in SEPARATED/DROPPING ie Separated/Finishing/Dropping
+ *     one-off: eat queued articles from flushing and write them to defer
+ *     one-off: connfail all connections which have any articles from flushing
+ *     newly read articles from flushing go straight to defer
+ *     this should take care of it and get us out of this state
+ * to avoid filling up ram needlessly
+ *   input control
+ *     limit number of queued articles for each ipf
+ *     pause/resume inputfile tailing
+ */
+
 static void check_reading_pause_resume(InputFile *ipf) {
   if (ipf->queue.count >= max_queue_per_ipf)
     inputfile_reading_pause(ipf);
@@ -1560,7 +1590,7 @@ static int article_check_expired(Article *art /* must be queued, not conn */) {
 
   LIST_REMOVE(art->ipf->queue, art);
   art->missing= 1;
-  art->ipf->counts[art_Unchecked][RC_missing]++;
+  art->ipf->count_nooffer_missing++;
   article_done(art,-1);
   return 1;
 }
@@ -1941,11 +1971,12 @@ static void *peer_rd_ok(oop_source *lp, oop_read *oread, oop_rd_event ev,
 
   switch (code) {
 
-  case 400: PEERBADMSG("peer stopped accepting articles");
   default:  PEERBADMSG("peer sent unexpected message");
 
-  case 503:
-    if (conn_busy) PEERBADMSG("peer timed us out");
+  case 400:
+    if (conn_busy)
+      PEERBADMSG("peer timed us out or stopped accepting articles");
+
     notice("C%d idle connection closed by peer", conn->fd);
     LIST_REMOVE(conns,conn);
     conn_dispose(conn);
@@ -2278,7 +2309,7 @@ static void filemon_method_dump_info(FILE *f) {
   DUMPV("%d",,filemon_inotify_fd);
   DUMPV("%d",,filemon_inotify_wdmax);
   for (i=0; i<filemon_inotify_wdmax; i++)
-    fprintf(f," wd2ipf[%d]=%p\n", i, filemon_inotify_wd2ipf[i],);
+    fprintf(f," wd2ipf[%d]=%p\n", i, filemon_inotify_wd2ipf[i]);
 }
 
 #endif /* HAVE_INOTIFY && !HAVE_FILEMON */
@@ -2667,12 +2698,12 @@ static void notice_processed(InputFile *ipf, int completed,
     : xasprintf("%s","");
 
   info("%s %s%s read=%d (+bl=%d,+err=%d)%s%s"
-       " offered=%d (ch=%d,nc=%d) accepted=%d (ch=%d,nc=%d)"
+       " missing=%d offered=%d (ch=%d,nc=%d) accepted=%d (ch=%d,nc=%d)"
        RESULT_COUNTS(RCI_NOTHING, RCI_TRIPLE_FMT)
        ,
        completed?"completed":"processed", what, spec,
        ipf->readcount_ok, ipf->readcount_blank, ipf->readcount_err,
-       inprog, autodefer,
+       inprog, autodefer, ipf->count_nooffer_missing,
        CNT(Unchecked,sent) + CNT(Unsolicited,sent)
        , CNT(Unchecked,sent), CNT(Unsolicited,sent),
        CNT(Wanted,accepted) + CNT(Unsolicited,accepted)
@@ -3304,6 +3335,7 @@ static void dump_input_file(FILE *f, const ControlCommand *c,
     DUMPV("%d", ipf->,readcount_ok);
     DUMPV("%d", ipf->,readcount_blank);
     DUMPV("%d", ipf->,readcount_err);
+    DUMPV("%d", ipf->,count_nooffer_missing);
   }
   fprintf(f,"\n");
   if (ipf) {
@@ -3731,6 +3763,10 @@ int main(int argc, char **argv) {
 
   notice("starting");
 
+  int val= 1;
+  r= SMsetup(SM_PREOPEN, &val); if (!r) warn("SMsetup SM_PREOPEN failed");
+  r= SMinit(); if (!r) die("storage manager initialisation (SMinit) failed");
+
   if (!become_daemon)
     control_stdio();