chiark / gitweb /
Rename some of the files
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 18 Apr 2010 13:57:04 +0000 (14:57 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sun, 18 Apr 2010 13:57:04 +0000 (14:57 +0100)
backends/innduct.c

index 092c693..f64a453 100644 (file)
  * or might be blanked out
  *    <spc><spc><spc><spc>....
  *
- *   site.name_duct.lock       lock preventing multiple ducts
- *                                holder of this lock is "duct"
  * F site.name                 main feed file
  *                                opened/created, then written, by innd
  *                                read by duct
  *                                unlinked by duct
  *                                tokens blanked out by duct when processed
- * D site.name_duct            temporary feed file during flush (or crash)
+ *   site.name_lock            lock preventing multiple ducts
+ *                                to hold lock must open,F_SETLK[W]
+ *                                  and then stat to check that locked file
+ *                                  still has name site.name_lock
+ *                                holder of this lock is "duct"
+ *                                (only) lockholder may remove the lockfile
+ * D site.name_flushing        temporary feed file during flush (or crash)
  *                                hardlink created by duct
  *                                unlinked by duct
- *   site.name_duct.defer      431'd articles, still being written,
+ *   site.name_defer           431'd articles, still being written,
  *                                created, written, used by duct
  *
- *   site.name_backlog_<date>.<inum>
+ *   site.name_backlog.<date>.<inum>
  *                             431'd articles, ready for innxmit or duct
  *                                created (link/mv) by duct
- *   site.name_backlog_<anything-else> eg
- *   site.name_backlog_manual
+ *   site.name_backlog<anything-else>  (where <anything-else> does not
+ *                                      contain '#' or '~') eg
+ *   site.name_backlog.manual
  *                             anything the sysadmin likes (eg, feed files
  *                             from old feeds to be merged into this one)
  *                                created (link/mv) by admin
@@ -291,7 +296,7 @@ static int nconns;
 static LIST(Conn) idle, working, full;
 static LIST(Article) *queue;
 
-static char *path_ductlock, *path_duct, *path_ductdefer;
+static char *path_lock, *path_flushing, *path_defer;
 
 #define SMS(newstate, periods, why) \
    (statemc_setstate(sm_##newstate,(periods),#newstate,(why)))
@@ -1063,7 +1068,7 @@ static void *peer_rd_ok(oop_source *lp, oop_read *oread, oop_event ev,
     open_defer();
     if (fprintf(defer, "%s %s\n", TokenToText(art->token), art->messageid) <0
        || fflush(defer))
-      sysfatal("write to defer file %s",path_ductdefer);
+      sysfatal("write to defer file %s",path_defer);
     article_done(conn, art, RC_deferred);
     break;
 
@@ -1177,7 +1182,7 @@ typedef void *feedfile_got_article(oop_source *lp, oop_read *rd,
           (unsigned long)ipf->offset, (unsigned long)flush_threshold);
 
     int r= link(feedfile, duct_path);
-    if (r) sysdie("link feedfile %s to ductfile %s", feedfile, dut_path);
+    if (r) sysdie("link feedfile %s to flushing file %s", feedfile, dut_path);
     /* => Hardlinked */
 
     r= unlink(feedfile);
@@ -1476,14 +1481,14 @@ static void statemc_init(void) {
   struct stat stab, stabf;
   int noent;
 
-  path_ductlock=   xasprintf("%s_duct.lock",  feedfile);
-  path_duct=       xasprintf("%s_duct",       feedfile);
-  path_ductdefer=  xasprintf("%s_duct.defer", feedfile);
-  globpat_backlog= xasprintf("%s_backlog_*",  feedfile);
+  path_lock=        xasprintf("%s_lock",      feedfile);
+  path_flushing=    xasprintf("%s_flushing",  feedfile);
+  path_defer=       xasprintf("%s_defer",     feedfile);
+  globpat_backlog=  xasprintf("%s_backlog*",  feedfile);
 
   for (;;) {
-    int lockfd= open(path_ductlock, O_CREAT|O_RDWR, 0600);
-    if (lockfd<0) sysfatal("open lockfile %s", path_ductlock);
+    int lockfd= open(path_lock, O_CREAT|O_RDWR, 0600);
+    if (lockfd<0) sysfatal("open lockfile %s", path_lock);
 
     struct flock fl;
     memset(&fl,0,sizeof(fl));
@@ -1495,23 +1500,23 @@ static void statemc_init(void) {
        if (quiet_if_locked) exit(0);
        fatal("another duct holds the lockfile");
       }
-      sysdie("fcntl F_SETLK lockfile %s", path_ductlock);
+      sysdie("fcntl F_SETLK lockfile %s", path_lock);
     }
 
     xfstat_isreg(lockfd, &stabf, "lockfile");
-    xlstat_isreg(path_ductlock, &stab, &noent, "lockfile");
+    xlstat_isreg(path_lock, &stab, &noent, "lockfile");
 
     if (!noent && samefile(&stab, &stabf))
       break;
 
     if (close(lockfd))
-      sysdie("could not close stale lockfile %s", path_ductlock);
+      sysdie("could not close stale lockfile %s", path_lock);
   }
   debug("startup: locked");
 
   search_backlog_file();
 
-  xlstat_isreg(path_ductdefer, &stab, &noent, "defer file");
+  xlstat_isreg(path_defer, &stab, &noent, "defer file");
   if (noent) {
     debug("startup: ductdefer ENOENT");
   } else {
@@ -1531,7 +1536,7 @@ static void statemc_init(void) {
     }
   }
 
-  InputFile *file_d= open_input_file(path_duct);
+  InputFile *file_d= open_input_file(path_flushing);
 
   if (file_d) {
     struct stat stab_f, stab_d;
@@ -1544,11 +1549,11 @@ static void statemc_init(void) {
 
     debug("startup: F and D both exist");
 
-    xfstat_isreg(file_d->fd, &stab_d, "ductfile");
+    xfstat_isreg(file_d->fd, &stab_d, "flushing file");
 
     if (samefile(&stab_d, &stab_f)) {
       debug("startup: F==D => Hardlinked");
-      r= unlink(path_duct);
+      r= unlink(path_flushing);
       if (r) sysdie("unlink feed file %s during startup", feedfile);
     found_moved:
       debug(" => Moved");
@@ -1627,8 +1632,8 @@ static void *statemc_check_input_done(oop_source *lp,
 
   close_defer();
 
-  if (unlink(path_duct))
-    sysdie("could not unlink old duct file %s", path_duct);
+  if (unlink(path_flushing))
+    sysdie("could not unlink old flushing file %s", path_flushing);
 
   if (sms==sm_DROPPING) {
     if (search_backlog_file()) {
@@ -1636,8 +1641,8 @@ static void *statemc_check_input_done(oop_source *lp,
       return;
     }
     notice("feed dropped and our work is complete");
-    r= unlink(path_ductlock);
-    if (r) sysdie("unlink lock file for old feed %s", path_ductlock);
+    r= unlink(path_lock);
+    if (r) sysdie("unlink lockfile for old feed %s", path_lock);
     exit(0);
   }
 
@@ -1668,15 +1673,15 @@ static void open_defer(void) {
 
   if (defer) return;
 
-  defer= fopen(path_ductdefer, "a+");
-  if (!defer) sysfatal("could not open defer file %s", path_ductdefer);
+  defer= fopen(path_defer, "a+");
+  if (!defer) sysfatal("could not open defer file %s", path_defer);
 
   /* truncate away any half-written records */
 
   xfstat_isreg(fileno(defer), &stab, "newly opened defer file");
 
   if (stab.st_size > LONG_MAX)
-    die("defer file %s size is far too large", path_ductdefer);
+    die("defer file %s size is far too large", path_defer);
 
   if (!stab.st_size)
     return;
@@ -1686,14 +1691,14 @@ static void open_defer(void) {
   for (;;) {
     if (!truncto) break; /* was only (if anything) one half-truncated record */
     if (fseek(defer, truncto-1, SEEK_SET) < 0)
-      sysdie("seek in defer file %s while truncating partial", path_ductdefer);
+      sysdie("seek in defer file %s while truncating partial", path_defer);
 
     r= getc(defer);
     if (r==EOF) {
       if (ferror(defer))
-       sysdie("failed read from defer file %s", path_ductdefer);
+       sysdie("failed read from defer file %s", path_defer);
       else
-       die("defer file %s shrank while we were checking it!", path_ductdefer);
+       die("defer file %s shrank while we were checking it!", path_defer);
     }
     if (r=='\n') break;
     truncto--;
@@ -1702,19 +1707,19 @@ static void open_defer(void) {
   if (stab.st_size != truncto) {
     warn("truncating half-record at end of defer file %s -"
         " shrinking by %ld bytes from %ld to %ld",
-        path_ductdefer, orgsize - truncto, orgsize, truncto);
+        path_defer, orgsize - truncto, orgsize, truncto);
 
     if (fflush(defer))
-      sysfatal("could not flush defer file %s", path_ductdefer);
+      sysfatal("could not flush defer file %s", path_defer);
     if (ftruncate(fileno(defer), truncto))
-      sysdie("could not truncate defer file %s", path_ductdefer);
+      sysdie("could not truncate defer file %s", path_defer);
 
   } else {
     info("continuing existing defer file %s (%ld bytes)",
-        path_ductdefer, orgsize);
+        path_defer, orgsize);
   }
   if (fseek(defer, truncto, SEEK_SET))
-    sysdie("could not seek to new end of defer file %s", path_ductdefer);
+    sysdie("could not seek to new end of defer file %s", path_defer);
 }
 
 static void close_defer(void) {
@@ -1770,6 +1775,11 @@ static int search_backlog_file(void) {
   case 0:
     for (i=0; i<gl.gl_pathc; i++) {
       const char *path= gl.gl_pathv[i];
+
+      if (strchr(path,'#') || strchr(path,'~')) {
+       debug("backlog file search skipping %s", path);
+       continue;
+      }
       r= stat(path, &stab);
       if (r) {
        syswarn("failed to stat backlog file %s", path);