Merge branch 'master' of git://git.evergreen-ils.org/OpenSRF
authorEquinox <info@esilibrary.com>
Mon, 5 Nov 2018 18:12:01 +0000 (13:12 -0500)
committerEquinox <info@esilibrary.com>
Mon, 5 Nov 2018 18:12:01 +0000 (13:12 -0500)
src/perl/lib/OpenSRF/AppSession.pm
src/perl/lib/OpenSRF/Server.pm

index b90e52c..ec5ebb4 100644 (file)
@@ -146,6 +146,7 @@ sub server_build {
 
        my $self = bless { recv_queue  => [],
                           request_queue  => [],
+               force_recycle => 0,
                           requests  => 0,
                           session_data  => {},
                           callbacks  => {},
@@ -228,6 +229,15 @@ sub stateless {
        return $self->{stateless};
 }
 
+# When true, indicates the server drone should be killed (recycled)
+# after the current session has completed.  This overrides the
+# configured max_request value.
+sub force_recycle {
+    my ($self, $force) = @_;
+    $self->{force_recycle} = $force if defined $force;
+    return $self->{force_recycle};
+}
+
 # When we're a client and we want to connect to a remote service
 sub create {
        my $class = shift;
index ba463e4..8efbc4c 100644 (file)
@@ -653,10 +653,16 @@ sub run {
             OpenSRF::Transport::SlimJabber::XMPPMessage->new(xml => $data)
         );
 
-        $self->keepalive_loop($session);
+        my $recycle = $self->keepalive_loop($session);
 
         last if ++$self->{num_requests} == $self->{parent}->{max_requests};
 
+        if ($recycle) {
+            $chatty && $logger->internal(
+                "server: child exiting early on force_recycle");
+            last;
+        }
+
         # Tell the parent process we are available to process requests
         $self->send_status;
 
@@ -772,7 +778,15 @@ sub keepalive_loop {
     }
 
     $chatty and $logger->internal("server: child done with request(s)");
+
+    # Capture the recycle option value before it's clobbered.
+    # The option may be set at any point along the life of the 
+    # session.  Once set, it remains set unless 
+    # $session->force_recycle(0) is explicitly called.
+    my $recycle = $session->force_recycle;
+
     $session->kill_me;
+    return $recycle;
 }
 
 # ----------------------------------------------------------------