LP#1706147 Perl Force-Recycle drone option
authorBill Erickson <berickxx@gmail.com>
Mon, 24 Jul 2017 16:08:56 +0000 (12:08 -0400)
committerGalen Charlton <gmc@equinoxinitiative.org>
Mon, 5 Nov 2018 18:09:15 +0000 (13:09 -0500)
Creates an API-level option to inform the OpenSRF drone management code
that the running drone should be recycled upon completion of the current
OpenSRF session.  This allows for quicker release of resources consumed
by the drone.

To use:

sub some_api_method {
    my ($self, $client, ...) = @_;
    $self->session->force_recycle(1);
    ...
}

Signed-off-by: Bill Erickson <berickxx@gmail.com>
Signed-off-by: Galen Charlton <gmc@equinoxinitiative.org>
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;
 }
 
 # ----------------------------------------------------------------