about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2023-10-04 03:49:14 +0000
committerEric Wong <e@80x24.org>2023-10-04 17:46:30 +0000
commit2f946a02bc324612febdfe31604b79e0196a215f (patch)
treea225827b35718f40cd0d6c50d584895e211a5ae1 /lib
parent1cbad18d329faad67c85f4d56f79afc80a2c80c4 (diff)
downloadpublic-inbox-2f946a02bc324612febdfe31604b79e0196a215f.tar.gz
It's shared by both by lei and public-facing daemons in using
the ->busy callback.
Diffstat (limited to 'lib')
-rw-r--r--lib/PublicInbox/DS.pm10
-rw-r--r--lib/PublicInbox/Daemon.pm10
-rw-r--r--lib/PublicInbox/LEI.pm12
3 files changed, 13 insertions, 19 deletions
diff --git a/lib/PublicInbox/DS.pm b/lib/PublicInbox/DS.pm
index c476311b..ecfb581d 100644
--- a/lib/PublicInbox/DS.pm
+++ b/lib/PublicInbox/DS.pm
@@ -233,6 +233,16 @@ sub enqueue_reap () { $reap_armed //= requeue(\&reap_pids) }
 
 sub in_loop () { $in_loop }
 
+# use inside @post_loop_do, returns number of busy clients
+sub close_non_busy () {
+        my $n = 0;
+        for my $s (values %DescriptorMap) {
+                # close as much as possible, early as possible
+                ($s->busy ? ++$n : $s->close) if $s->can('busy');
+        }
+        $n;
+}
+
 # Internal function: run the post-event callback, send read events
 # for pushed-back data, and close pending connections.  returns 1
 # if event loop should continue, or 0 to shut it all down.
diff --git a/lib/PublicInbox/Daemon.pm b/lib/PublicInbox/Daemon.pm
index 7546105e..5250610b 100644
--- a/lib/PublicInbox/Daemon.pm
+++ b/lib/PublicInbox/Daemon.pm
@@ -364,16 +364,8 @@ sub worker_quit { # $_[0] = signal name or number (unused)
         # drop idle connections and try to quit gracefully
         @PublicInbox::DS::post_loop_do = (sub {
                 my ($dmap, undef) = @_;
-                my $n = 0;
                 my $now = now();
-                for my $s (values %$dmap) {
-                        $s->can('busy') or next;
-                        if ($s->busy) {
-                                ++$n;
-                        } else { # close as much as possible, early as possible
-                                $s->close;
-                        }
-                }
+                my $n = PublicInbox::DS::close_non_busy();
                 if ($n) {
                         if (($warn + 5) < now()) {
                                 warn "$$ quitting, $n client(s) left\n";
diff --git a/lib/PublicInbox/LEI.pm b/lib/PublicInbox/LEI.pm
index 368eee26..977a94c6 100644
--- a/lib/PublicInbox/LEI.pm
+++ b/lib/PublicInbox/LEI.pm
@@ -1367,16 +1367,8 @@ sub lazy_start {
                         $quit->();
                 }
                 return 1 if defined($path);
-                my $n = 0;
-                for my $s (values %$dmap) {
-                        $s->can('busy') or next;
-                        if ($s->busy) {
-                                ++$n;
-                        } else {
-                                $s->close;
-                        }
-                }
-                drop_all_stores() if !$n; # drop stores only if no clients
+                my $n = PublicInbox::DS::close_non_busy() or
+                        drop_all_stores(); # drop stores only if no clients
                 # returns true: continue, false: stop
                 $n + scalar(keys(%$PublicInbox::DS::AWAIT_PIDS));
         });