about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2021-10-15 13:30:56 +0000
committerEric Wong <e@80x24.org>2021-10-15 15:58:24 +0000
commit06d0f4419011dc6546ae200e4fbc1558464509c2 (patch)
treefc7bf2305ab96544123d9b84ac471ba5c0a59f60
parenta1733d3406dfbde52d1468e671edd1d76893f546 (diff)
downloadpublic-inbox-06d0f4419011dc6546ae200e4fbc1558464509c2.tar.gz
We need to send the socket over to lei/store and wait for the
kernel to drop the socket refcount down to zero before
script/lei can exit.

This is not a new bug and only caused very sporadic test
failures.  I only noticed it while simplifying IPC stuff.
-rw-r--r--lib/PublicInbox/LeiNoteEvent.pm15
1 files changed, 8 insertions, 7 deletions
diff --git a/lib/PublicInbox/LeiNoteEvent.pm b/lib/PublicInbox/LeiNoteEvent.pm
index ba4dfd49..1749c98f 100644
--- a/lib/PublicInbox/LeiNoteEvent.pm
+++ b/lib/PublicInbox/LeiNoteEvent.pm
@@ -11,10 +11,11 @@ use PublicInbox::DS;
 
 our $to_flush; # { cfgpath => $lei }
 
-sub flush_lei ($) {
-        my ($lei) = @_;
-        my $lne = delete $lei->{cfg}->{-lei_note_event};
-        $lne->wq_close if $lne; # runs _lei_wq_eof;
+sub flush_lei ($;$) {
+        my ($lei, $manual) = @_;
+        my $lne = delete $lei->{cfg}->{-lei_note_event} // return;
+        $lne->{lei_sock} = $lei->{sock} if $manual;
+        $lne->wq_close; # runs _lei_wq_eof;
 }
 
 # we batch up writes and flush every 5s (matching Linux default
@@ -67,7 +68,7 @@ sub lei_note_event {
         die "BUG: unexpected: @rest" if @rest;
         my $cfg = $lei->_lei_cfg or return; # gone (race)
         my $sto = $lei->_lei_store or return; # gone
-        return flush_lei($lei) if $folder eq 'done'; # special case
+        return flush_lei($lei, 1) if $folder eq 'done'; # special case
         my $lms = $lei->lms or return;
         $lms->lms_write_prepare if $new_cur eq ''; # for ->clear_src below
         $lei->{opt}->{quiet} = 1;
@@ -111,8 +112,8 @@ sub ipc_atfork_child {
 
 sub _lei_wq_eof { # EOF callback for main lei daemon
         my ($lei) = @_;
-        delete $lei->{lne} or return $lei->fail;
-        $lei->sto_done_request;
+        my $lne = delete $lei->{lne} or return $lei->fail;
+        $lei->sto_done_request($lne->{lei_sock});
 }
 
 1;