about summary refs log tree commit homepage
path: root/t
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2017-06-24 07:33:44 +0000
committerEric Wong <e@80x24.org>2017-06-26 03:44:30 +0000
commitf9b70eb6ebbf96c2fe79ab2738ea4954c5a124f3 (patch)
tree4f5785aa3252bbf4330c385f652926e48103dc42 /t
parentd9c9dc5af637e097d545a828d887aae99ddcd2a7 (diff)
downloadpublic-inbox-f9b70eb6ebbf96c2fe79ab2738ea4954c5a124f3.tar.gz
We need to ensure new messages are being processed
fairly during full rescans, so have the ->scan subroutine
yield and reschedule itself.  Additionally, having a
long-running task inside the signal handler is dangerous
and subject to reentrancy bugs.

Due to the limitations of the Filesys::Notify::Simple interface,
we cannot rely on multiplexing I/O interfaces (select, IO::Poll,
Danga::Socket, etc...) for this.  Forking a separate process
was considered, but it is more expensive for a mostly-idle
process.

So, we use a variant of the "self-pipe trick" via inotify (or
whatever Filesys::Notify::Simple gives us).  Instead of writing
to our own pipe, we write to a file in our own temporary
directory watched by Filesys::Notify::Simple to trigger events
in signal handlers.
Diffstat (limited to 't')
-rw-r--r--t/watch_maildir.t12
1 files changed, 6 insertions, 6 deletions
diff --git a/t/watch_maildir.t b/t/watch_maildir.t
index 3969c80d..e12e0836 100644
--- a/t/watch_maildir.t
+++ b/t/watch_maildir.t
@@ -42,7 +42,7 @@ my $config = PublicInbox::Config->new({
         "publicinboxlearn.watchspam" => "maildir:$spamdir",
 });
 
-PublicInbox::WatchMaildir->new($config)->scan;
+PublicInbox::WatchMaildir->new($config)->scan('full');
 my $git = PublicInbox::Git->new($git_dir);
 my @list = $git->qx(qw(rev-list refs/heads/master));
 is(scalar @list, 1, 'one revision in rev-list');
@@ -59,7 +59,7 @@ my $write_spam = sub {
 };
 $write_spam->();
 is(unlink(glob("$maildir/new/*")), 1, 'unlinked old spam');
-PublicInbox::WatchMaildir->new($config)->scan;
+PublicInbox::WatchMaildir->new($config)->scan('full');
 @list = $git->qx(qw(rev-list refs/heads/master));
 is(scalar @list, 2, 'two revisions in rev-list');
 @list = $git->qx(qw(ls-tree -r --name-only refs/heads/master));
@@ -72,7 +72,7 @@ To unsubscribe from this list: send the line "unsubscribe git" in
 the body of a message to majordomo\@vger.kernel.org
 More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
         PublicInbox::Emergency->new($maildir)->prepare(\$msg);
-        PublicInbox::WatchMaildir->new($config)->scan;
+        PublicInbox::WatchMaildir->new($config)->scan('full');
         @list = $git->qx(qw(ls-tree -r --name-only refs/heads/master));
         is(scalar @list, 1, 'tree has one file');
         my $mref = $git->cat_file('HEAD:'.$list[0]);
@@ -80,7 +80,7 @@ More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
 
         is(unlink(glob("$maildir/new/*")), 1, 'unlinked spam');
         $write_spam->();
-        PublicInbox::WatchMaildir->new($config)->scan;
+        PublicInbox::WatchMaildir->new($config)->scan('full');
         @list = $git->qx(qw(ls-tree -r --name-only refs/heads/master));
         is(scalar @list, 0, 'tree is empty');
         @list = $git->qx(qw(rev-list refs/heads/master));
@@ -96,7 +96,7 @@ More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
         $config->{'publicinboxwatch.spamcheck'} = 'spamc';
         {
                 local $SIG{__WARN__} = sub {}; # quiet spam check warning
-                PublicInbox::WatchMaildir->new($config)->scan;
+                PublicInbox::WatchMaildir->new($config)->scan('full');
         }
         @list = $git->qx(qw(ls-tree -r --name-only refs/heads/master));
         is(scalar @list, 0, 'tree has no files spamc checked');
@@ -111,7 +111,7 @@ More majordomo info at  http://vger.kernel.org/majordomo-info.html\n);
         PublicInbox::Emergency->new($maildir)->prepare(\$msg);
         $config->{'publicinboxwatch.spamcheck'} = 'spamc';
         @list = $git->qx(qw(ls-tree -r --name-only refs/heads/master));
-        PublicInbox::WatchMaildir->new($config)->scan;
+        PublicInbox::WatchMaildir->new($config)->scan('full');
         @list = $git->qx(qw(ls-tree -r --name-only refs/heads/master));
         is(scalar @list, 1, 'tree has one file after spamc checked');