Bug 27783: Add queue handling in packaging tools
authorTomas Cohen Arazi <tomascohen@theke.io>
Mon, 4 Apr 2022 18:23:09 +0000 (20:23 +0200)
committerFridolin Somers <fridolin.somers@biblibre.com>
Wed, 13 Apr 2022 13:55:40 +0000 (15:55 +0200)
This patch adds queue name handling in is_worker_running and a handy
method to centralize process name handling for queue-specific workers.

To test:
1. Apply this patch
2. Run:
   $ source debian/scripts/koha-functions.sh
   $ get_worker_name kohadev
   kohadev-koha-worker
=> SUCCESS: Default queue means no queue name included
   $ get_worker_name kohadev default
   kohadev-koha-worker
=> SUCCESS: Default queue means no queue name included
   $ get_worker_name kohadev long_tasks
   kohadev-koha-worker-long_tasks
=> SUCCESS: Queue name appended to the name
4. Run:
   $ perl misc4dev/cp_debian_files.pl \
              --koha_dir /kohadevbox/koha \
              --gitify /kohadevbox/gitify \
              --instance kohadev
5. Run:
   $ koha-worker --start --queue oleonard kohadev
=> SUCCESS: Starts!
6. Check:
   $ ps waux | grep oleonard
=> SUCCESS: It is running
7. Play with --stop, --restart, --status and different queue names,
   including 'default' and without the --queue param as well.
=> SUCCESS: All as expected!
8. Sign off :-D

Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
debian/docs/koha-worker.xml
debian/koha-common.init
debian/scripts/koha-functions.sh
debian/scripts/koha-worker

index 3cb19e6..42c1ae7 100644 (file)
@@ -26,6 +26,7 @@
       <command>koha-worker</command>
       <arg><option>--start</option>|<option>--stop</option>|<option>--restart</option></arg>
       <arg><option>--status</option></arg>
+      <arg><option>--queue</option></arg>
       <arg><option>--quiet</option>|<option>-q</option></arg>
       <arg><option>-h</option>|<option>--help</option></arg>
     </cmdsynopsis>
       </listitem>
     </varlistentry>
     <varlistentry>
+        <term><option>--queue</option></term>
+        <listitem>
+          <para>Allows specifying the queue worker (defaults to 'default').</para>
+        </listitem>
+    </varlistentry>
+    <varlistentry>
       <term><option>-v</option>|<option>--verbose</option></term>
       <listitem>
         <para>Enable verbose output.</para>
index 4b8e759..12a85a6 100755 (executable)
@@ -62,7 +62,10 @@ do_start()
     koha-sip   --start $(koha-list --enabled --sip)
     koha-plack --start $(koha-list --enabled --plack)
     koha-z3950-responder --start --quiet $(koha-list --enabled --z3950)
+    # default queue
     koha-worker --start $(koha-list --enabled)
+    # long_tasks queue
+    koha-worker --start --queue long_tasks $(koha-list --enabled)
 
     if [ "$USE_INDEXER_DAEMON" = "yes" ]; then
         koha-indexer --start --quiet $(koha-list --enabled)
@@ -79,7 +82,10 @@ do_stop()
     koha-sip   --stop $(koha-list --sip)
     koha-plack --stop --quiet $(koha-list --enabled --plack)
     koha-z3950-responder --stop --quiet $(koha-list --enabled --z3950)
+    # default queue
     koha-worker --stop --quiet $(koha-list --enabled)
+    # long_tasks queue
+    koha-worker --stop --queue long_tasks --quiet $(koha-list --enabled)
 
     if [ "$USE_INDEXER_DAEMON" = "yes" ]; then
         koha-indexer --stop --quiet $(koha-list --enabled)
@@ -94,7 +100,10 @@ do_reload() {
     koha-sip   --restart $(koha-list --enabled --sip)
     koha-plack --restart --quiet $(koha-list --enabled --plack)
     koha-z3950-responder --restart --quiet $(koha-list --enabled --z3950)
+    # default queue
     koha-worker --restart --quiet $(koha-list --enabled)
+    # long_tasks queue
+    koha-worker --restart --queue long_tasks --quiet $(koha-list --enabled)
 
     if [ "$USE_INDEXER_DAEMON" = "yes" ]; then
         koha-indexer --restart --quiet $(koha-list --enabled)
index 8888ad6..12832cb 100755 (executable)
@@ -202,8 +202,11 @@ is_indexer_running()
 is_worker_running()
 {
     local instancename=$1
+    local queue=$2
 
-    if daemon --name="$instancename-koha-worker" \
+    local name=`get_worker_name $instancename $queue`
+
+    if daemon --name="$name" \
             --pidfiles="/var/run/koha/$instancename/" \
             --user="$instancename-koha.$instancename-koha" \
             --running ; then
@@ -213,6 +216,18 @@ is_worker_running()
     fi
 }
 
+get_worker_name()
+{
+    local name=$1
+    local queue=$2
+
+    if [ "$queue" = "" ] || [ "$queue" = "default" ]; then
+        echo "${name}-koha-worker"
+    else
+        echo "${name}-koha-worker-${queue}"
+    fi
+}
+
 is_plack_enabled_opac()
 {
     local instancefile=$1
index 207d503..faecfa6 100755 (executable)
@@ -58,11 +58,15 @@ EOF
 start_worker()
 {
     local name=$1
+    local queue=$2
+
+    if ! is_worker_running $name $queue; then
+
+        worker_name=`get_worker_name $name $queue`
 
-    if ! is_worker_running $name; then
         export KOHA_CONF="/etc/koha/sites/$name/koha-conf.xml"
 
-        DAEMONOPTS="--name=$name-koha-worker \
+        DAEMONOPTS="--name=${worker_name} \
             --errlog=/var/log/koha/$name/worker-error.log \
             --stdout=/var/log/koha/$name/worker.log \
             --output=/var/log/koha/$name/worker-output.log \
@@ -70,15 +74,15 @@ start_worker()
             --verbose=1 --respawn --delay=30 \
             --user=$name-koha.$name-koha"
 
-        log_daemon_msg "Starting Koha worker daemon for $name"
+        log_daemon_msg "Starting Koha worker daemon for $name ($queue)"
 
-        if daemon $DAEMONOPTS -- $worker_DAEMON; then
+        if daemon $DAEMONOPTS -- $worker_DAEMON --job-queue ${queue}; then
             log_end_msg 0
         else
             log_end_msg 1
         fi
     else
-        log_daemon_msg "Error: worker already running for $name"
+        log_daemon_msg "Error: worker already running for $name ($queue)"
         log_end_msg 1
     fi
 }
@@ -86,11 +90,14 @@ start_worker()
 stop_worker()
 {
     local name=$1
+    local queue=$2
 
-    if is_worker_running $name; then
+    if is_worker_running $name $queue; then
         export KOHA_CONF="/etc/koha/sites/$name/koha-conf.xml"
 
-        DAEMONOPTS="--name=$name-koha-worker \
+        worker_name=`get_worker_name $name $queue`
+
+        DAEMONOPTS="--name=${worker_name} \
             --errlog=/var/log/koha/$name/worker-error.log \
             --stdout=/var/log/koha/$name/worker.log \
             --output=/var/log/koha/$name/worker-output.log \
@@ -98,15 +105,15 @@ stop_worker()
             --verbose=1 --respawn --delay=30 \
             --user=$name-koha.$name-koha"
 
-        log_daemon_msg "Stopping Koha worker daemon for $name"
+        log_daemon_msg "Stopping Koha worker daemon for $name ($queue)"
 
-        if daemon $DAEMONOPTS --stop -- $worker_DAEMON; then
+        if daemon $DAEMONOPTS --stop -- $worker_DAEMON --job-queue ${queue}; then
             log_end_msg 0
         else
             log_end_msg 1
         fi
     else
-        log_daemon_msg "Error: worker not running for $name"
+        log_daemon_msg "Error: worker not running for $name ($queue)"
         log_end_msg 1
     fi
 }
@@ -114,11 +121,14 @@ stop_worker()
 restart_worker()
 {
     local name=$1
+    local queue=$2
 
-    if is_worker_running $name; then
+    if is_worker_running $name $queue; then
         export KOHA_CONF="/etc/koha/sites/$name/koha-conf.xml"
 
-        DAEMONOPTS="--name=$name-koha-worker \
+        worker_name=`get_worker_name $name $queue`
+
+        DAEMONOPTS="--name=${worker_name} \
             --errlog=/var/log/koha/$name/worker-error.log \
             --stdout=/var/log/koha/$name/worker.log \
             --output=/var/log/koha/$name/worker-output.log \
@@ -126,15 +136,15 @@ restart_worker()
             --verbose=1 --respawn --delay=30 \
             --user=$name-koha.$name-koha"
 
-        log_daemon_msg "Restarting Koha worker daemon for $name"
+        log_daemon_msg "Restarting Koha worker daemon for $name ($queue)"
 
-        if daemon $DAEMONOPTS --restart -- $worker_DAEMON; then
+        if daemon $DAEMONOPTS --restart -- $worker_DAEMON --job-queue ${queue}; then
             log_end_msg 0
         else
             log_end_msg 1
         fi
     else
-        log_daemon_msg "Error: worker not running for $name"
+        log_daemon_msg "Error: worker not running for $name ($queue)"
         log_end_msg 1
     fi
 }
@@ -142,12 +152,13 @@ restart_worker()
 worker_status()
 {
     local name=$1
+    local queue=$2
 
-    if is_worker_running ${name}; then
-        log_daemon_msg "worker running for ${name}"
+    if is_worker_running ${name} ${queue}; then
+        log_daemon_msg "worker running for ${name} ($queue)"
         log_end_msg 0
     else
-        log_daemon_msg "worker not running for ${name}"
+        log_daemon_msg "worker not running for ${name} ($queue)"
         log_end_msg 3
     fi
 }
@@ -162,6 +173,7 @@ set_action()
 }
 
 op=""
+queue="default"
 quiet="no"
 
 # Read command line parameters
@@ -185,6 +197,9 @@ while [ $# -gt 0 ]; do
         --status)
             set_action "status"
             shift ;;
+        --queue)
+            queue="$2"
+            shift 2 ;;
         -*)
             die "Error: invalid option switch ($1)" ;;
         *)
@@ -214,16 +229,16 @@ if [ $# -gt 0 ]; then
 
             case $op in
                 "start")
-                    start_worker $name
+                    start_worker $name $queue
                     ;;
                 "stop")
-                    stop_worker $name
+                    stop_worker $name $queue
                     ;;
                 "restart")
-                    restart_worker $name
+                    restart_worker $name $queue
                     ;;
                 "status")
-                    worker_status $name
+                    worker_status $name $queue
             esac
 
         else