chiark / gitweb /
wip filepoll poll interval variable
[innduct.git] / backends / innduct.c
index acbae608ad4ecef16452814f886d56ef3a565d8d..9014309a89b4126fa5277a14e6563c7467cb14ce 100644 (file)
@@ -1,26 +1,12 @@
 /*
- * bugs
- *
-
- [740] <sit> info: processed feedfile(null) read=4(+0bl,+6err) offered=5(ch5,nc0) accepted=0(ch0+nc0) unwanted=0(0id+0bd+0nc) rejected=0(0id+0bd+0nc) deferred=0(0id+0bd+0nc) missing=2(0id+2bd+0nc) connretry=0(0id+0bd+0nc)
-
-    (null) ?!
-
-   also unwanted should be nonzero I think
-
-   %d(  is too hard to read
-
- [740] <sit> warning: corrupted file: /home/ian/things/Innfeed/inn2-2.4.5/fee, offset 349: line partially blanked: in `                                                  @050000002D130000006A0000000000000000@ <mi'..
-
-
  * todo
- *  - actually do something with readable on control master
+ *  - inotify not working ?
+ *  - some per-conn info thing for control
  *  - option for realsockdir
- *  - option for filepoll
  *  - option for no inotify
  *  - manpage: document control master stuff
- *  - manpage: innconf is used for communicating with innd
- *  - debug this:
+ *
+ * debugging rune:
  *      build-lfs/backends/innduct --no-daemon -f `pwd`/fee sit dom
  */
 
@@ -348,6 +334,7 @@ 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 filepoll_seconds=5;
 
 static int connection_setup_timeout=200;
 static int inndcomm_flush_timeout=100;
@@ -387,7 +374,7 @@ typedef enum {      /* in queue                 in conn->sent             */
   RCN(missing)                                 \
   RCN(connretry)
 
-#define RCI_TRIPLE_FMT_BASE "%d(%did+%dbd+%dnc)"
+#define RCI_TRIPLE_FMT_BASE "%d (id=%d,bod=%d,nc=%d)"
 #define RCI_TRIPLE_VALS_BASE(counts,x)         \
        counts[art_Unchecked] x                 \
        + counts[art_Wanted] x                  \
@@ -503,7 +490,7 @@ static InputFile *main_input_file, *flushing_input_file, *backlog_input_file;
 static int sm_period_counter;
 
 /* initialisation to 0 is good */
-static int until_connect, until_backlog_nextscan;
+static int until_connect, until_backlog_nextscan, until_backup_filepoll;
 static double accept_proportion;
 static int nocheck, nocheck_reported;
 
@@ -1674,6 +1661,11 @@ static void article_done(Conn *conn, Article *art, int whichcount) {
 
   while (art->blanklen) {
     static const char spaces[]=
+      "                                                                "
+      "                                                                "
+      "                                                                "
+      "                                                                "
+      "                                                                "
       "                                                                "
       "                                                                "
       "                                                                "
@@ -1917,7 +1909,7 @@ static void *feedfile_got_article(oop_source *lp, oop_read *rd,
   art->midlen= midlen;
   art->ipf= ipf;  ipf->inprogress++;
   art->token= TextToToken(tokentextbuf);
-  art->offset= ipf->offset;
+  art->offset= old_offset;
   art->blanklen= recsz;
   strcpy(art->messageid, space+1);
   LIST_ADDTAIL(queue, art);
@@ -1995,10 +1987,10 @@ static ssize_t tailing_try_read(struct oop_readable *rable, void *buffer,
 
 /*---------- filemon implemented with inotify ----------*/
 
-#if defined(HAVE_INOTIFY) && !defined(HAVE_FILEMON)
+#if defined(HAVE_SYS_INOTIFY_H) && !defined(HAVE_FILEMON)
 #define HAVE_FILEMON
 
-#include <linux/inotify.h>
+#include <sys/inotify.h>
 
 static int filemon_inotify_fd;
 static int filemon_inotify_wdmax;
@@ -2014,7 +2006,7 @@ static void filemon_method_startfile(InputFile *ipf, Filemon_Perfile *pf) {
 
   if (wd >= filemon_inotify_wdmax) {
     int newmax= wd+2;
-    filemon_inotify_wd= xrealloc(filemon_inotify_wd2ipf,
+    filemon_inotify_wd2ipf= xrealloc(filemon_inotify_wd2ipf,
                                 sizeof(*filemon_inotify_wd2ipf) * newmax);
     memset(filemon_inotify_wd2ipf + filemon_inotify_wdmax, 0,
           sizeof(*filemon_inotify_wd2ipf) * (newmax - filemon_inotify_wdmax));
@@ -2033,7 +2025,7 @@ static void filemon_method_startfile(InputFile *ipf, Filemon_Perfile *pf) {
 static void filemon_method_stopfile(InputFile *ipf, Filemon_Perfile *pf) {
   int wd= pf->wd;
   debug("filemon inotify stopfile %p wd=%d", ipf, wd);
-  int r= inotify_rm_watch(filemon_inotify_fd, filemon_inotify_wd);
+  int r= inotify_rm_watch(filemon_inotify_fd, wd);
   if (r) sysdie("inotify_rm_watch");
   filemon_inotify_wd2ipf[wd]= 0;
 }
@@ -2052,7 +2044,7 @@ static void *filemon_inotify_readable(oop_source *lp, int fd,
       die("inotify read %d bytes wanted struct of %d", r, (int)sizeof(iev));
     }
     InputFile *ipf= filemon_inotify_wd2ipf[iev.wd];
-    debug("filemon inotify readable read %p wd=%p", iev.wd, ipf);
+    debug("filemon inotify readable read %d wd=%p", iev.wd, ipf);
     filemon_callback(ipf);
   }
   return OOP_CONTINUE;
@@ -2061,11 +2053,11 @@ static void *filemon_inotify_readable(oop_source *lp, int fd,
 static int filemon_method_init(void) {
   filemon_inotify_fd= inotify_init();
   if (filemon_inotify_fd<0) {
-    syswarn("could not initialise inotify: inotify_init failed");
+    syswarn("filemon/inotify: inotify_init failed");
     return 0;
   }
-  set nonblock;
-  loop->on_fd(loop, filemon_inotify_fd, OOP_READ, filemon_inotify_readable);
+  xsetnonblock(filemon_inotify_fd, 1);
+  loop->on_fd(loop, filemon_inotify_fd, OOP_READ, filemon_inotify_readable, 0);
 
   debug("filemon inotify init filemon_inotify_fd=%d", filemon_inotify_fd);
   return 1;
@@ -2079,7 +2071,10 @@ static int filemon_method_init(void) {
 
 struct Filemon_Perfile { int dummy; };
 
-static int filemon_method_init(void) { return 0; }
+static int filemon_method_init(void) {
+  warn("filemon/dummy: no filemon method compiled in");
+  return 0;
+}
 static void filemon_method_startfile(InputFile *ipf, Filemon_Perfile *pf) { }
 static void filemon_method_stopfile(InputFile *ipf, Filemon_Perfile *pf) { }
 
@@ -2408,8 +2403,8 @@ static void notice_processed(InputFile *ipf, const char *what,
 
 #define CNT(art,rc) (ipf->counts[art_##art][RC_##rc])
 
-  info("processed %s%s read=%d(+%dbl,+%derr)"
-       " offered=%d(ch%d,nc%d) accepted=%d(ch%d+nc%d)"
+  info("processed %s%s read=%d (+bl=%d,+err=%d)"
+       " offered=%d (ch=%d,nc=%d) accepted=%d (ch=%d,nc=%d)"
        RESULT_COUNTS(RCI_NOTHING, RCI_TRIPLE_FMT)
        ,
        what, spec,
@@ -2433,7 +2428,7 @@ static void statemc_check_backlog_done(void) {
   const char *under= strchr(slash, '_');
   const char *rest= under ? under+1 : leaf;
   if (!strncmp(rest,"backlog",7)) rest += 7;
-  notice_processed(ipf,"backlog:",rest);
+  notice_processed(ipf,"backlog ",rest);
 
   close_input_file(ipf);
   if (unlink(ipf->path)) {
@@ -2455,7 +2450,7 @@ static void statemc_check_flushing_done(void) {
 
   assert(sms==sm_SEPARATED || sms==sm_DROPPING);
 
-  notice_processed(ipf,"feedfile",0);
+  notice_processed(ipf,"feedfile","");
 
   close_defer();
 
@@ -2467,7 +2462,7 @@ static void statemc_check_flushing_done(void) {
 
   if (sms==sm_SEPARATED) {
     notice("flush complete");
-    SMS(NORMAL, 0, "flush complete");
+    SMS(NORMAL, spontaneous_flush_periods, "flush complete");
   } else if (sms==sm_DROPPING) {
     SMS(DROPPED, 0, "old flush complete");
     search_backlog_file();
@@ -2905,7 +2900,7 @@ static char *debug_report_ipf(InputFile *ipf) {
   return xasprintf("%p/%s:ip=%ld,off=%ld,fd=%d%s",
                   ipf, path,
                   ipf->inprogress, (long)ipf->offset,
-                  ipf->fd, ipf->rd ? "+" : "");
+                  ipf->fd, ipf->rd ? "" : ",!rd");
 }
 
 static void period(void) {
@@ -2915,7 +2910,7 @@ static void period(void) {
 
   debug("PERIOD"
        " sms=%s[%d] conns=%d queue=%d until_connect=%d"
-       " input_files main:%s old:%s flushing:%s"
+       " input_files main:%s flushing:%s backlog:%s"
        " children connecting=%ld inndcomm=%ld"
        ,
        sms_names[sms], sm_period_counter,
@@ -3117,8 +3112,9 @@ static const Option innduct_options[]= {
 {0,"feedfile-flush-size","BYTES", &target_max_feedfile_size, op_integer     },
 {0,"period-interval",    "TIME",  &period_seconds,           op_seconds     },
 
-{0,"connection-timeout", "TIME",  &connection_setup_timeout, op_seconds     },
-{0,"stuck-flush-timeout","TIME",  &inndcomm_flush_timeout,   op_seconds     },
+{0,"connection-timeout",   "TIME",  &connection_setup_timeout, op_seconds   },
+{0,"stuck-flush-timeout",  "TIME",  &inndcomm_flush_timeout,   op_seconds   },
+{0,"feedfile-poll",        "TIME",  &filepoll_seconds,         op_seconds   },
 
 {0,"no-check-proportion",   "PERCENT",   &nocheck_thresh,       op_double   },
 {0,"no-check-response-time","ARTICLES",  &nocheck_decay,        op_double   },
@@ -3266,8 +3262,8 @@ int main(int argc, char **argv) {
   control_init();
 
   if (!filemon_method_init()) {
-    warn("no file monitoring available, polling");
-    every(5,0,filepoll);
+    warn("filemon: no file monitoring available, polling");
+    every(filepoll_seconds,0,filepoll);
   }
 
   every(period_seconds,1,period);