about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2020-12-26 09:34:39 +0000
committerEric Wong <e@80x24.org>2020-12-26 19:27:15 +0000
commit10bf54305da8422d9ece6b809996092c1c4b1786 (patch)
treefc588a7ba743c1d440beb2e80444503035fd982b /lib
parent5e05c2eb58a450849f1826f3d02ed62b814b6617 (diff)
downloadpublic-inbox-10bf54305da8422d9ece6b809996092c1c4b1786.tar.gz
We don't have to replace a bunch of existing watches
with identical new ones.  On Linux with Linux::Inotify2
installed, this avoids a storm of inotify_add_watch(2)
and inotify_rm_watch(2) syscalls on SIGHUP with -imapd
and "-extindex --watch"
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/InboxIdle.pm15
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/PublicInbox/InboxIdle.pm b/lib/PublicInbox/InboxIdle.pm
index 84b6d26f..508007d7 100644
--- a/lib/PublicInbox/InboxIdle.pm
+++ b/lib/PublicInbox/InboxIdle.pm
@@ -24,17 +24,26 @@ sub in2_arm ($$) { # PublicInbox::Config::each_inbox callback
         my $dir = $ibx->{inboxdir};
         my $inot = $self->{inot};
         my $cur = $self->{pathmap}->{$dir} //= [];
+        my $lock = "$dir/".($ibx->version >= 2 ? 'inbox.lock' : 'ssoma.lock');
 
         # transfer old subscriptions to the current inbox, cancel the old watch
-        if (my $old_ibx = $cur->[0]) {
+        my $old_ibx = $cur->[0];
+        $cur->[0] = $ibx;
+        if ($old_ibx) {
                 $ibx->{unlock_subs} and
                         die "BUG: $dir->{unlock_subs} should not exist";
                 $ibx->{unlock_subs} = $old_ibx->{unlock_subs};
+
+                # Linux::Inotify2::Watch::name matches if watches are the
+                # same, no point in replacing a watch of the same name
+                if ($cur->[1]->name eq $lock) {
+                        $self->{on_unlock}->{$lock} = $ibx;
+                        return;
+                }
+                # rare, name changed (v1 inbox converted to v2)
                 $cur->[1]->cancel; # Linux::Inotify2::Watch::cancel
         }
-        $cur->[0] = $ibx;
 
-        my $lock = "$dir/".($ibx->version >= 2 ? 'inbox.lock' : 'ssoma.lock');
         if (my $w = $cur->[1] = $inot->watch($lock, $IN_MODIFY)) {
                 $self->{on_unlock}->{$w->name} = $ibx;
         } else {