We don't want FS activity to delay lei-daemon shutdown.
---
lib/PublicInbox/DirIdle.pm | 12 +++++++++---
lib/PublicInbox/LEI.pm | 5 +++++
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/lib/PublicInbox/DirIdle.pm b/lib/PublicInbox/DirIdle.pm
index af99811c..de6f229b 100644
--- a/lib/PublicInbox/DirIdle.pm
+++ b/lib/PublicInbox/DirIdle.pm
@@ -68,10 +68,16 @@ sub rm_watches {
}
}
+sub close {
+ my ($self) = @_;
+ delete $self->{cb};
+ $self->SUPER::close; # if using real kevent/inotify
+}
+
sub event_step {
my ($self) = @_;
- my $cb = $self->{cb};
- local $PublicInbox::DS::in_loop = 0; # waitpid() synchronously
+ my $cb = $self->{cb} or return;
+ local $PublicInbox::DS::in_loop = 0; # waitpid() synchronously (FIXME)
eval {
my @events = $self->{inot}->read; # Linux::Inotify2->read
$cb->($_) for @events;
@@ -83,7 +89,7 @@ sub force_close {
my ($self) = @_;
my $inot = delete $self->{inot} // return;
if ($inot->can('fh')) { # Linux::Inotify2 2.3+
- close($inot->fh) or warn "CLOSE ERROR: $!";
+ CORE::close($inot->fh) or warn "CLOSE ERROR: $!";
} elsif ($inot->isa('Linux::Inotify2')) {
require PublicInbox::LI2Wrap;
PublicInbox::LI2Wrap::wrapclose($inot);
diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm
index 74a7f5b9..8362800d 100644
--- a/lib/PublicInbox/LEI.pm
+++ b/lib/PublicInbox/LEI.pm
@@ -1285,8 +1285,11 @@ sub can_stay_alive { # PublicInbox::DS::post_loop_do cb
}
return 1 if defined($$path);
my $n = PublicInbox::DS::close_non_busy() or do {
+ eval 'PublicInbox::LeiNoteEvent::flush_task()';
# drop stores only if no clients
for my $cfg (values %PATH2CFG) {
+ my $lne = delete($cfg->{-lei_note_event});
+ $lne->wq_close if $lne;
my $sto = delete($cfg->{-lei_store}) // next;
eval { $sto->wq_io_do('done') };
warn "E: $@ (dropping store for $cfg->{-f})" if $@;
@@ -1346,6 +1349,8 @@ sub lazy_start {
my (undef, $eof_p) = PublicInbox::PktOp->pair;
sub {
$exit_code //= eval("POSIX::SIG$_[0] + 128") if @_;
+ $dir_idle->close if $dir_idle; # EPOLL_CTL_DEL
+ $dir_idle = undef; # let RC take care of it
eval 'PublicInbox::LeiNoteEvent::flush_task()';
my $lis = $pil or exit($exit_code // 0);
# closing eof_p triggers \&noop wakeup