Bug 8773 - Start per-instance koha-index-daemon in .deb setup

Short:

Launch an indexing daemon (rebuild_zebra.pl -daemon) process for each
enabled instance. Enabling/disabling the use of the indexer is handled
by global configuration variables in /etc/default/koha-common.

Also provides command line tools to manage the running indexer daemons
for your instances.

Long:

Using an indexing daemon avoids launching a new interpreter each time
the cron triggers the indexing, and also allows sub-minute incremental
reindexing, a requirement from our librarians.[1]

Using the indexer daemon could remain "experimental" until it gets more
testing; so is disabled by default initially. To enable the use of the
indexer the user has to tweak the /etc/default/koha-common config file.
Specifically the USE_INDEXER_DAEMON variable, which is clearly explained
in the file.

Frecquency defaults to 5 sec, and can be changed by tweaking the
/etc/default/koha-common config file too.

This patch uses rebuild_zebra.pl in daemon mode, but it is crafted to
allow changing the indexing daemon and passing specific option switches
it might need.

Regards
To+

[1] This is the .deb version of http://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=8519

Sponsored-by: Universidad Nacional de Cordoba
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Signed-off-by: Chris Cormack <chrisc@catalyst.net.nz>
Signed-off-by: Tomas Cohen Arazi <tomascohen@gmail.com>
This commit is contained in:
Tomas Cohen Arazi 2012-09-14 15:26:12 -03:00
parent 56ffda0a70
commit eed7f263d0
9 changed files with 396 additions and 1 deletions

View File

@ -145,6 +145,13 @@
<para>Stop Zebra for named Koha instances.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>koha-indexer</option></term>
<listitem>
<para>Manage the indexer daemon for named Koha instances.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect2>

86
debian/docs/koha-indexer.xml vendored Normal file
View File

@ -0,0 +1,86 @@
<article xmlns='http://docbook.org/ns/docbook'>
<title>koha-indexer</title>
<info>
<productname>Koha</productname> is the first free software library automation package.
<author>
<orgname>The Koha Community</orgname>
<uri>http://koha-community.org/</uri>
</author>
</info>
<refentry xml:id="koha-indexer">
<refmeta>
<refentrytitle>koha-indexer</refentrytitle>
<manvolnum>8</manvolnum>
</refmeta>
<refnamediv>
<refname>koha-indexer</refname>
<refpurpose>Manage the indexer daemon for Koha instances.</refpurpose>
<refclass>UNIX/Linux</refclass>
</refnamediv>
<refsynopsisdiv>
<cmdsynopsis>
<command>koha-indexer</command>
<arg choice="req"><option>--start</option>|<option>--stop</option>|<option>--restart</option>|<option>--help</option>|<option>-h</option>|<option>--quiet</option>|<option>-q</option></arg>
<arg choice="req" rep="repeat"><replaceable>instancename</replaceable></arg>
</cmdsynopsis>
</refsynopsisdiv>
<refsect1><title>Options</title>
<variablelist>
<varlistentry>
<term><option>--start</option></term>
<listitem>
<para>Start the indexer daemon for the desired Koha instances.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--stop</option></term>
<listitem>
<para>Stop the indexer daemon for the desired Koha instances.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--restart</option></term>
<listitem>
<para>Restart the indexer daemon for the desired Koha instances.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--quiet|-q</option></term>
<listitem>
<para>Make the script quiet about non existent instance names. Useful when calling <command>koha-indexer</command> from another scripts.</para>
</listitem>
</varlistentry>
<varlistentry>
<term><option>--help|-h</option></term>
<listitem>
<para>Show usage information.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1><title>Description</title>
<para>The <command>koha-indexer</command> script lets you manage your Koha instances indexer daemon.</para>
</refsect1>
<refsect1><title>See also</title>
<simplelist type="inline">
<member><command>/etc/default/koha-common</command></member>
</simplelist>
</refsect1>
</refentry>
</article>

View File

@ -6,5 +6,6 @@
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Comment the following line if you want to use the experimental koha-index-daemon integration
*/5 * * * * root test -x /usr/sbin/koha-rebuild-zebra && koha-rebuild-zebra -q $(koha-list --enabled)
*/15 * * * * root koha-foreach --enabled --email /usr/share/koha/bin/cronjobs/process_message_queue.pl

View File

@ -1,5 +1,40 @@
## General koha-common default options
## General koha-common default options file
PERL5LIB="/usr/share/koha/lib"
KOHA_HOME="/usr/share/koha"
## Background record indexing
#
# The following options control the use of an indexing daemon for
# Koha instances.
#
# More information can be found here:
#
# http://wiki.koha-community.org/wiki/PackagesIndexDaemon
#
# IMPORTANT: You should comment the relevant line in /etc/cron.d/koha-common
# (the one that calls koha-rebuild-zebra)
#
# USE_INDEXER_DAEMON: "no" | "yes"
#
USE_INDEXER_DAEMON="no"
# Set an alternate indexer daemon. The default is to use the rebuild_zebra.pl
# in daemon mode.
#
# Example: ALTERNATE_INDEXER_DAEMON="koha-index-daemon"
#
# ALTERNATE_INDEXER_DAEMON=""
# Lookup/indexing frecquency (in seconds) for the indexing daemon.
#
# The default value is 5
#
INDEXER_TIMEOUT=5
# Parameters to be passed to the indexer daemon. Useful for alternate indexers.
# Defaults to INDEXER_PARAMS="-daemon -x -sleep $INDEXER_TIMEOUT"
#
# INDEXER_PARAMS=""
## End of general koha-common default options

View File

@ -49,6 +49,10 @@ do_start()
koha-create-dirs $(koha-list)
koha-start-zebra $(koha-list --enabled)
koha-start-sip $(koha-list --enabled)
if [ "$USE_INDEXER_DAEMON" = "yes" ]; then
koha-indexer --start --quiet $(koha-list --enabled)
fi
}
#
@ -59,6 +63,10 @@ do_stop()
# We stop everything, including disabled ones.
koha-stop-zebra $(koha-list) || true
koha-stop-sip $(koha-list) || true
if [ "$USE_INDEXER_DAEMON" = "yes" ]; then
koha-indexer --stop --quiet $(koha-list --enabled)
fi
}
#
@ -68,6 +76,10 @@ do_reload() {
koha-restart-zebra $(koha-list --enabled)
koha-stop-sip $(koha-list) || true
koha-start-sip $(koha-list --enabled)
if [ "$USE_INDEXER_DAEMON" = "yes" ]; then
koha-indexer --restart --quiet $(koha-list --enabled)
fi
}
#

View File

@ -17,6 +17,7 @@ debian/scripts/koha-email-disable usr/sbin
debian/scripts/koha-email-enable usr/sbin
debian/scripts/koha-enable usr/sbin
debian/scripts/koha-foreach usr/sbin
debian/scripts/koha-indexer usr/sbin
debian/scripts/koha-list usr/sbin
debian/scripts/koha-mysql usr/sbin
debian/scripts/koha-rebuild-zebra usr/sbin

View File

@ -16,6 +16,8 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# Read configuration variable file if it is present
[ -r /etc/default/koha-common ] && . /etc/default/koha-common
set -e
@ -642,6 +644,11 @@ then
# Start Zebra.
koha-start-zebra "$name"
if [ "$USE_INDEXER_DAEMON" = "yes" ]; then
# Start Indexer daemon
koha-indexer --start "$name"
fi
fi

View File

@ -108,6 +108,19 @@ is_zebra_running()
fi
}
is_indexer_running()
{
local instancename=$1
if daemon --name="$instancename-koha-indexer" \
--user="$instancename-koha.$instancename-koha" \
--running ; then
return 0
else
return 1
fi
}
get_instances()
{
find /etc/koha/sites -mindepth 1 -maxdepth 1\

233
debian/scripts/koha-indexer vendored Executable file
View File

@ -0,0 +1,233 @@
#!/bin/bash
#
# koha-indexer - Manage Indexer Daemons for Koha instances
# Copyright 2014 Tomás Cohen Arazi @ Universidad Nacional de Córdoba
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
set -e
. /lib/lsb/init-functions
# Read configuration variable file if it is present
[ -r /etc/default/koha-common ] && . /etc/default/koha-common
# include helper functions
if [ -f "/usr/share/koha/bin/koha-functions.sh" ]; then
. "/usr/share/koha/bin/koha-functions.sh"
else
echo "Error: /usr/share/koha/bin/koha-functions.sh not present." 1>&2
exit 1
fi
usage()
{
local scriptname=$(basename $0)
cat <<EOF
$scriptname
This script lets you manage the indexer daemon for your Koha instances.
Usage:
$scriptname [--start|--stop|--restart] [--quiet|-q] instancename1 [instancename2...]
$scriptname -h|--help
--start Start the indexer daemon for the specified instances
--stop Stop the indexer daemon for the specified instances
--restart Restart the indexer daemon for the specified instances
--quiet|-q Make the script quiet about non existent instance names
(useful for calling from another scripts).
--help|-h Display this help message
EOF
}
start_indexer()
{
local name=$1
if ! is_indexer_running $name; then
export KOHA_CONF="/etc/koha/sites/$name/koha-conf.xml"
DAEMONOPTS="--name=$name-koha-indexer \
--errlog=/var/log/koha/$name/indexer-error.log \
--stdout=/var/log/koha/$name/indexer.log \
--output=/var/log/koha/$name/indexer-output.log \
--verbose=1 --respawn --delay=30 \
--user=$name-koha.$name-koha"
log_daemon_msg "Starting Koha indexing daemon for $name"
if daemon $DAEMONOPTS -- $INDEXER_DAEMON $INDEXER_PARAMS; then
log_end_msg 0
else
log_end_msg 1
fi
else
log_daemon_msg "Error: Indexer already running for $name"
log_end_msg 1
fi
}
stop_indexer()
{
local name=$1
if is_indexer_running $name; then
export KOHA_CONF="/etc/koha/sites/$name/koha-conf.xml"
DAEMONOPTS="--name=$name-koha-indexer \
--errlog=/var/log/koha/$name/indexer-error.log \
--stdout=/var/log/koha/$name/indexer.log \
--output=/var/log/koha/$name/indexer-output.log \
--verbose=1 --respawn --delay=30 \
--user=$name-koha.$name-koha"
log_daemon_msg "Stopping Koha indexing daemon for $name"
if daemon $DAEMONOPTS --stop -- $INDEXER_DAEMON $INDEXER_PARAMS; then
log_end_msg 0
else
log_end_msg 1
fi
else
log_daemon_msg "Error: Indexer not running for $name"
log_end_msg 1
fi
}
restart_indexer()
{
local name=$1
if is_indexer_running $name; then
export KOHA_CONF="/etc/koha/sites/$name/koha-conf.xml"
DAEMONOPTS="--name=$name-koha-indexer \
--errlog=/var/log/koha/$name/indexer-error.log \
--stdout=/var/log/koha/$name/indexer.log \
--output=/var/log/koha/$name/indexer-output.log \
--verbose=1 --respawn --delay=30 \
--user=$name-koha.$name-koha"
log_daemon_msg "Stopping Koha indexing daemon for $name"
if daemon $DAEMONOPTS --restart -- $INDEXER_DAEMON $INDEXER_PARAMS; then
log_end_msg 0
else
log_end_msg 1
fi
else
log_daemon_msg "Error: Indexer not running for $name"
log_end_msg 1
fi
}
set_action()
{
if [ "$op" = "" ]; then
op=$1
else
die "Error: only one action can be specified."
fi
}
op=""
quiet="no"
# Read command line parameters
while [ $# -gt 0 ]; do
case "$1" in
-h|--help)
usage ; exit 0 ;;
-q|--quiet)
quiet="yes"
shift ;;
--start)
set_action "start"
shift ;;
--stop)
set_action "stop"
shift ;;
--restart)
set_action "restart"
shift ;;
-*)
die "Error: invalid option switch ($1)" ;;
*)
# We expect the remaining stuff are the instance names
break ;;
esac
done
# Check if an alternate indexer has been set
if [ -z $ALTERNATE_INDEXER_DAEMON ]; then
INDEXER_DAEMON="$ALTERNATE_INDEXER_DAEMON"
else
# We default to rebuild_zebra.pl if no alternate indexer set
INDEXER_DAEMON="${KOHA_HOME}/bin/migration_tools/rebuild_zebra.pl"
fi
if [ $INDEXER_TIMEOUT -lt 1 ]; then
# Something's wrong, default to 5 seconds
INDEXER_TIMEOUT=5
fi
if [ -z $INDEXER_PARAMS ]; then
# Default to the parameters required by rebuild_zebra.pl
INDEXER_PARAMS="-daemon -x -sleep $INDEXER_TIMEOUT"
fi
if [ -z $PERL5LIB ]; then
PERL5LIB="/usr/share/koha/lib"
fi
export PERL5LIB
if [ $# -gt 0 ]; then
# We have at least one instance name
for name in "$@"; do
if is_instance $name; then
case $op in
"start")
start_indexer $name
;;
"stop")
stop_indexer $name
;;
"restart")
restart_indexer $name
;;
esac
else
if [ "$quiet" = "no" ]; then
log_daemon_msg "Error: Invalid instance name $name"
log_end_msg 1
fi
fi
done
else
if [ "$quiet" = "no" ]; then
warn "Error: you must provide at least one instance name"
fi
fi
exit 0