Browse Source

Bug 9001: Remove Zebraqueue_daemon

[This patch was split out from tcohen's excellent patches for bug 8519
 --jcamins]

It removes the obsolete zebraqueue_daemon.pl and koha-zebraqueue-ctl.sh
obsolete scripts too.

Several files are modified to address te removal/addition of these files.

I didn't run the install procedure as I was working on my laptop with a dev
setup, just set the symlinks. Now fixed things as proposed by wajasu
on comment #4. Any other suggestion please let me know.

Tested to work on an up-to-date Ubuntu 12.04.

Asked by wajasu, remove remaining obsolete zebraqueue stuff.

Sponsored-by: Universidad Nacional de Córdoba

Signed-off-by: wajasu <matted-34813@mypacks.net>
Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com>
Signed-off-by: Chris Cormack <chris@bigballofwax.co.nz>
Passed-QA-by: Mason James <mtj@kohaaloha.com>
Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com>
3.12.x
Tomás Cohen Arazi 12 years ago
committed by Jared Camins-Esakov
parent
commit
44c3657cfc
  1. 1
      Makefile.PL
  2. 2
      install_misc/install_koha_on_fresh_debian
  3. 40
      misc/bin/koha-zebraqueue-ctl.sh
  4. 475
      misc/bin/zebraqueue_daemon.pl
  5. 176
      misc/cronjobs/zebraqueue_start.pl
  6. 2
      t/Makefile
  7. 4
      t/db_dependent/lib/KohaTest.pm

1
Makefile.PL

@ -523,7 +523,6 @@ if ($config{'INSTALL_ZEBRA'} eq "yes") {
push @{ $pl_files->{'rewrite-config.PL'} }, (
'blib/SCRIPT_DIR/koha-zebra-ctl.sh',
'blib/SCRIPT_DIR/koha-pazpar2-ctl.sh',
'blib/SCRIPT_DIR/koha-zebraqueue-ctl.sh',
);
if ($config{'INSTALL_PAZPAR2'} eq 'yes') {
push @{ $pl_files->{'rewrite-config.PL'} }, (

2
install_misc/install_koha_on_fresh_debian

@ -523,8 +523,6 @@ a2ensite koha
invoke-rc.d apache2 reload
koha_script=`makefile_value KOHA_DEST_SCRIPT_DIR`
ln -s "$koha_script"/koha-zebraqueue-ctl.sh /etc/init.d/koha-zebraqueue-daemon
update-rc.d koha-zebraqueue-daemon defaults
# TODO:
# - add translator

40
misc/bin/koha-zebraqueue-ctl.sh

@ -1,40 +0,0 @@
#!/bin/bash
USER=__KOHA_USER__
GROUP=__KOHA_GROUP__
DBNAME=__DB_NAME__
NAME=koha-zebraqueue-ctl-$DBNAME
LOGDIR=__LOG_DIR__
PERL5LIB=__PERL_MODULE_DIR__
KOHA_CONF=__KOHA_CONF_DIR__/koha-conf.xml
ERRLOG=$LOGDIR/koha-zebraqueue.err
STDOUT=$LOGDIR/koha-zebraqueue.log
OUTPUT=$LOGDIR/koha-zebraqueue-output.log
export KOHA_CONF
export PERL5LIB
ZEBRAQUEUE=__SCRIPT_DIR__/zebraqueue_daemon.pl
test -f $ZEBRAQUEUE || exit 0
OTHERUSER=''
if [[ $EUID -eq 0 ]]; then
OTHERUSER="--user=$USER.$GROUP"
fi
case "$1" in
start)
echo "Starting Zebraqueue Daemon"
daemon --name=$NAME --errlog=$ERRLOG --stdout=$STDOUT --output=$OUTPUT --verbose=1 --respawn --delay=30 $OTHERUSER -- perl -I $PERL5LIB $ZEBRAQUEUE -f $KOHA_CONF
;;
stop)
echo "Stopping Zebraqueue Daemon"
daemon --name=$NAME --errlog=$ERRLOG --stdout=$STDOUT --output=$OUTPUT --verbose=1 --respawn --delay=30 $OTHERUSER --stop -- perl -I $PERL5LIB $ZEBRAQUEUE -f $KOHA_CONF
;;
restart)
echo "Restarting the Zebraqueue Daemon"
daemon --name=$NAME --errlog=$ERRLOG --stdout=$STDOUT --output=$OUTPUT --verbose=1 --respawn --delay=30 $OTHERUSER --restart -- perl -I $PERL5LIB $ZEBRAQUEUE -f $KOHA_CONF
;;
*)
echo "Usage: /etc/init.d/$NAME {start|stop|restart}"
exit 1
;;
esac

475
misc/bin/zebraqueue_daemon.pl

@ -1,475 +0,0 @@
#!/usr/bin/perl
# daemon to watch the zebraqueue and update zebra as needed
use strict;
#use warnings; FIXME - Bug 2505
BEGIN {
# find Koha's Perl modules
# test carefully before changing this
use FindBin;
eval { require "$FindBin::Bin/kohalib.pl" };
}
use POE qw(Wheel::SocketFactory Wheel::ReadWrite Filter::Stream Driver::SysRW);
use Unix::Syslog qw(:macros);
use C4::Context;
use C4::Biblio;
use C4::Search;
use C4::AuthoritiesMarc;
use XML::Simple;
use POSIX;
use utf8;
# wait periods governing connection attempts
my $min_connection_wait = 1; # start off at 1 second
my $max_connection_wait = 1024; # max about 17 minutes
# keep separate wait period for bib and authority Zebra databases
my %zoom_connection_waits = ();
my $db_connection_wait = $min_connection_wait;
# ZOOM and Z39.50 errors that are potentially
# resolvable by connecting again and retrying
# the operation
my %retriable_zoom_errors = (
10000 => 'ZOOM_ERROR_CONNECT',
10001 => 'ZOOM_ERROR_MEMORY',
10002 => 'ZOOM_ERROR_ENCODE',
10003 => 'ZOOM_ERROR_DECODE',
10004 => 'ZOOM_ERROR_CONNECTION_LOST',
10005 => 'ZOOM_ERROR_INIT',
10006 => 'ZOOM_ERROR_INTERNAL',
10007 => 'ZOOM_ERROR_TIMEOUT',
);
# structure to store updates that have
# failed and are to be retrieved. The
# structure is a hashref of hashrefs,
# e.g.,
#
# $postoned_updates->{$server}->{$record_number} = 1;
#
# If an operation is attempted and fails because
# of a retriable error (see above), the daemon
# will try several times to recover as follows:
#
# 1. close and reopen the connection to the
# Zebra server, unless the error was a timeout,
# in which case
# 2. retry the operation
#
# If, after trying this five times, the operation still
# fails, the daemon will mark the record number as
# postponed, and try to process other entries in
# zebraqueue. When an update is postponed, the
# error will be reported to syslog.
#
# If more than 100 postponed updates are
# accumulated, the daemon will assume that
# something is seriously wrong, complain loudly,
# and abort. If running under the daemon(1) command,
# this means that the daemon will respawn.
#
my $num_postponed_updates = 0;
my $postponed_updates = {};
my $max_operation_attempts = 5;
my $max_postponed_updates = 100;
# Zebra connection timeout
my $zconn_timeout = 30;
my $zconn_timeout_multiplier = 1.5;
my $max_zconn_timeout = 120;
my $ident = "Koha Zebraqueue ";
my $debug = 0;
Unix::Syslog::openlog $ident, LOG_PID, LOG_LOCAL0;
Unix::Syslog::syslog LOG_INFO, "Starting Zebraqueue log at " . scalar localtime(time) . "\n";
sub handler_start {
# Starts session. Only ever called once only really used to set an alias
# for the POE kernel
my ( $kernel, $heap, $session ) = @_[ KERNEL, HEAP, SESSION ];
my $time = localtime(time);
Unix::Syslog::syslog LOG_INFO, "$time POE Session ", $session->ID, " has started.\n";
# check status
# $kernel->yield('status_check');
$kernel->yield('sleep');
}
sub handler_sleep {
# can be used to slow down loop execution if needed
my ( $kernel, $heap, $session ) = @_[ KERNEL, HEAP, SESSION ];
use Time::HiRes qw (sleep);
Time::HiRes::sleep(0.5);
#sleep 1;
$kernel->yield('status_check');
}
sub handler_check {
# check if we need to do anything, at the moment just checks the zebraqueue, it could check other things too
my ( $kernel, $heap, $session ) = @_[ KERNEL, HEAP, SESSION ];
my $dbh = get_db_connection();
my $sth = $dbh->prepare("SELECT count(*) AS opcount FROM zebraqueue WHERE done = 0");
$sth->execute;
my $data = $sth->fetchrow_hashref();
if ($data->{'opcount'} > 0) {
Unix::Syslog::syslog LOG_INFO, "$data->{'opcount'} operations waiting to be run\n";
$sth->finish();
$dbh->commit(); # needed so that we get current state of zebraqueue next time
# we enter handler_check
$kernel->yield('do_ops');
}
else {
$sth->finish();
$dbh->commit(); # needed so that we get current state of zebraqueue next time
# we enter handler_check
$kernel->yield('sleep');
}
}
sub zebraop {
# execute operations waiting in the zebraqueue
my ( $kernel, $heap, $session ) = @_[ KERNEL, HEAP, SESSION ];
my $dbh = get_db_connection();
my $readsth = $dbh->prepare("SELECT id, biblio_auth_number, operation, server FROM zebraqueue WHERE done = 0 ORDER BY id DESC");
$readsth->execute();
Unix::Syslog::syslog LOG_INFO, "Executing zebra operations\n";
my $completed_updates = {};
ZEBRAQUEUE: while (my $data = $readsth->fetchrow_hashref()) {
warn "Inside while loop" if $debug;
my $id = $data->{'id'};
my $op = $data->{'operation'};
$op = 'recordDelete' if $op =~ /delete/i; # delete ops historically have been coded
# either delete_record or recordDelete
my $record_number = $data->{'biblio_auth_number'};
my $server = $data->{'server'};
next ZEBRAQUEUE if exists $postponed_updates->{$server}->{$record_number};
next ZEBRAQUEUE if exists $completed_updates->{$server}->{$record_number}->{$op};
my $ok = 0;
my $record;
if ($op eq 'recordDelete') {
$ok = process_delete($dbh, $server, $record_number);
}
else {
$ok = process_update($dbh, $server, $record_number, $id);
}
if ($ok == 1) {
mark_done($dbh, $record_number, $op, $server);
$completed_updates->{$server}->{$record_number}->{$op} = 1;
if ($op eq 'recordDelete') {
$completed_updates->{$server}->{$record_number}->{'specialUpdate'} = 1;
}
}
}
$readsth->finish();
$dbh->commit();
$kernel->yield('sleep');
}
sub process_delete {
my $dbh = shift;
my $server = shift;
my $record_number = shift;
my $record;
my $ok = 0;
eval {
warn "Searching for record to delete" if $debug;
# 1st read the record in zebra, we have to get it from zebra as its no longer in the db
my $Zconn = get_zebra_connection($server);
my $results = $Zconn->search_pqf( '@attr 1=Local-number '.$record_number);
$results->option(elementSetName => 'marcxml');
$record = $results->record(0)->raw();
};
if ($@) {
# this doesn't exist, so no need to wail on zebra to delete it
if ($@->code() eq 13) {
$ok = 1;
} else {
# caught a ZOOM::Exception
my $message = _format_zoom_error_message($@);
postpone_update($server, $record_number, $message);
}
} else {
# then, delete the record
warn "Deleting record" if $debug;
$ok = zebrado($record, 'recordDelete', $server, $record_number);
}
return $ok;
}
sub process_update {
my $dbh = shift;
my $server = shift;
my $record_number = shift;
my $id = shift;
my $record;
my $ok = 0;
warn "Updating record" if $debug;
# get the XML
my $marcxml;
if ($server eq "biblioserver") {
my $marc = GetMarcBiblio($record_number);
$marcxml = $marc->as_xml_record() if $marc;
}
elsif ($server eq "authorityserver") {
$marcxml = C4::AuthoritiesMarc::GetAuthorityXML($record_number);
}
# check it's XML, just in case
eval {
my $hashed = XMLin($marcxml);
}; ### is it a proper xml? broken xml may crash ZEBRA- slow but safe
## it's Broken XML-- Should not reach here-- but if it does -lets protect ZEBRA
if ($@) {
Unix::Syslog::syslog LOG_ERR, "$server record $record_number is malformed: $@";
mark_done_by_id($dbh, $id, $server);
$ok = 0;
} else {
# ok, we have everything, do the operation in zebra !
$ok = zebrado($marcxml, 'specialUpdate', $server, $record_number);
}
return $ok;
}
sub mark_done_by_id {
my $dbh = shift;
my $id = shift;
my $server = shift;
my $delsth = $dbh->prepare("UPDATE zebraqueue SET done = 1 WHERE id = ? AND server = ? AND done = 0");
$delsth->execute($id, $server);
}
sub mark_done {
my $dbh = shift;
my $record_number = shift;
my $op = shift;
my $server = shift;
my $delsth;
if ($op eq 'recordDelete') {
# if it's a deletion, we can delete every request on this biblio : in case the user
# did a modif (or item deletion) just before biblio deletion, there are some specialUpdate
# that are pending and can't succeed, as we don't have the XML anymore
# so, delete everything for this biblionumber
$delsth = $dbh->prepare_cached("UPDATE zebraqueue SET done = 1
WHERE biblio_auth_number = ?
AND server = ?
AND done = 0");
$delsth->execute($record_number, $server);
} else {
# if it's not a deletion, delete every pending specialUpdate for this biblionumber
# in case the user add biblio, then X items, before this script runs
# this avoid indexing X+1 times where just 1 is enough.
$delsth = $dbh->prepare("UPDATE zebraqueue SET done = 1
WHERE biblio_auth_number = ?
AND operation = 'specialUpdate'
AND server = ?
AND done = 0");
$delsth->execute($record_number, $server);
}
}
sub zebrado {
###Accepts a $server variable thus we can use it to update biblios, authorities or other zebra dbs
my ($record, $op, $server, $record_number) = @_;
unless ($record) {
my $message = "error updating index for $server $record $record_number: no source record";
postpone_update($server, $record_number, $message);
return 0;
}
my $attempts = 0;
my $ok = 0;
ATTEMPT: while ($attempts < $max_operation_attempts) {
$attempts++;
warn "Attempt $attempts for $op for $server $record_number" if $debug;
my $Zconn = get_zebra_connection($server);
my $Zpackage = $Zconn->package();
$Zpackage->option(action => $op);
$Zpackage->option(record => $record);
eval { $Zpackage->send("update") };
if ($@ && $@->isa("ZOOM::Exception")) {
my $message = _format_zoom_error_message($@);
my $error = $@->code();
if (exists $retriable_zoom_errors{$error}) {
warn "reattempting operation $op for $server $record_number" if $debug;
warn "last Zebra error was $message" if $debug;
$Zpackage->destroy();
if ($error == 10007 and $zconn_timeout < $max_zconn_timeout) {
# bump up connection timeout
$zconn_timeout = POSIX::ceil($zconn_timeout * $zconn_timeout_multiplier);
$zconn_timeout = $max_zconn_timeout if $zconn_timeout > $max_zconn_timeout;
Unix::Syslog::syslog LOG_INFO, "increased Zebra connection timeout to $zconn_timeout\n";
warn "increased Zebra connection timeout to $zconn_timeout" if $debug;
}
next ATTEMPT;
} else {
postpone_update($server, $record_number, $message);
}
}
# FIXME - would be more efficient to send a ES commit
# after a batch of records, rather than commiting after
# each one - Zebra handles updates relatively slowly.
eval { $Zpackage->send('commit'); };
if ($@) {
# operation succeeded, but commit
# did not - we have a problem
my $message = _format_zoom_error_message($@);
postpone_update($server, $record_number, $message);
} else {
$ok = 1;
last ATTEMPT;
}
}
unless ($ok) {
my $message = "Made $attempts attempts to index $server record $record_number without success";
postpone_update($server, $record_number, $message);
}
return $ok;
}
sub postpone_update {
my ($server, $record_number, $message) = @_;
warn $message if $debug;
$message .= "\n" unless $message =~ /\n$/;
Unix::Syslog::syslog LOG_ERR, $message;
$postponed_updates->{$server}->{$record_number} = 1;
$num_postponed_updates++;
if ($num_postponed_updates > $max_postponed_updates) {
warn "exiting, over $max_postponed_updates postponed indexing updates";
Unix::Syslog::syslog LOG_ERR, "exiting, over $max_postponed_updates postponed indexing updates";
Unix::Syslog::closelog;
exit;
}
}
sub handler_stop {
my $heap = $_[HEAP];
my $time = localtime(time);
Unix::Syslog::syslog LOG_INFO, "$time Session ", $_[SESSION]->ID, " has stopped.\n";
delete $heap->{session};
}
# get a DB connection
sub get_db_connection {
my $dbh;
$db_connection_wait = $min_connection_wait unless defined $db_connection_wait;
while (1) {
eval {
# note that C4::Context caches the
# DB handle; C4::Context->dbh() will
# check that handle first before returning
# it. If the connection is bad, it
# then tries (once) to create a new one.
$dbh = C4::Context->dbh();
};
unless ($@) {
# C4::Context->dbh dies if it cannot
# establish a connection
$db_connection_wait = $min_connection_wait;
$dbh->{AutoCommit} = 0; # do this to reduce number of
# commits to zebraqueue
return $dbh;
}
# connection failed
my $error = "failed to connect to DB: $DBI::errstr";
warn $error if $debug;
Unix::Syslog::syslog LOG_ERR, $error;
sleep $db_connection_wait;
$db_connection_wait *= 2 unless $db_connection_wait >= $max_connection_wait;
}
}
# get a Zebra connection
sub get_zebra_connection {
my $server = shift;
# start connection retry wait queue if necessary
$zoom_connection_waits{$server} = $min_connection_wait unless exists $zoom_connection_waits{$server};
# try to connect to Zebra forever until we succeed
while (1) {
# what follows assumes that C4::Context->Zconn
# makes only one attempt to create a new connection;
my $Zconn = C4::Context->Zconn($server, 0, 1, '', 'xml');
$Zconn->option('timeout' => $zconn_timeout);
# it is important to note that if the existing connection
# stored by C4::Context has an error (any type of error)
# from the last transaction, C4::Context->Zconn closes
# it and establishes a new one. Therefore, the
# following check will succeed if we have a new, good
# connection or we're using a previously established
# connection that has experienced no errors.
if ($Zconn->errcode() == 0) {
$zoom_connection_waits{$server} = $min_connection_wait;
return $Zconn;
}
# connection failed
my $error = _format_zoom_error_message($Zconn);
warn $error if $debug;
Unix::Syslog::syslog LOG_ERR, $error;
sleep $zoom_connection_waits{$server};
$zoom_connection_waits{$server} *= 2 unless $zoom_connection_waits{$server} >= $max_connection_wait;
}
}
# given a ZOOM::Exception or
# ZOOM::Connection object, generate
# a human-reaable error message
sub _format_zoom_error_message {
my $err = shift;
my $message = "";
if (ref($err) eq 'ZOOM::Connection') {
$message = $err->errmsg() . " (" . $err->diagset . " " . $err->errcode() . ") " . $err->addinfo();
} elsif (ref($err) eq 'ZOOM::Exception') {
$message = $err->message() . " (" . $err->diagset . " " . $err->code() . ") " . $err->addinfo();
}
return $message;
}
POE::Session->create(
inline_states => {
_start => \&handler_start,
sleep => \&handler_sleep,
status_check => \&handler_check,
do_ops => \&zebraop,
_stop => \&handler_stop,
},
);
# start the kernel
$poe_kernel->run();
Unix::Syslog::closelog;
exit;

176
misc/cronjobs/zebraqueue_start.pl

@ -1,176 +0,0 @@
#!/usr/bin/perl
# script that starts the zebraquee
# Written by TG on 01/08/2006
use strict;
#use warnings; FIXME - Bug 2505
BEGIN {
# find Koha's Perl modules
# test carefully before changing this
use FindBin;
eval { require "$FindBin::Bin/../kohalib.pl" };
}
use C4::Context;
use C4::Biblio;
use C4::Search;
use C4::AuthoritiesMarc;
use XML::Simple;
use utf8;
### ZEBRA SERVER UPDATER
##Uses its own database handle
my $dbh=C4::Context->dbh;
my $readsth=$dbh->prepare("SELECT id,biblio_auth_number,operation,server FROM zebraqueue WHERE done=0
ORDER BY id DESC"); # NOTE - going in reverse order to catch deletes that
# occur after a string of updates (e.g., user deletes
# the items attached to a bib, then the items.
# Having a specialUpdate occur after a recordDelete
# should not occur.
#my $delsth=$dbh->prepare("delete from zebraqueue where id =?");
#AGAIN:
#my $wait=C4::Context->preference('zebrawait') || 120;
my $verbose = 0;
print "starting with verbose=$verbose\n" if $verbose;
my ($id,$biblionumber,$operation,$server,$marcxml);
$readsth->execute;
while (($id,$biblionumber,$operation,$server)=$readsth->fetchrow){
print "read in queue : $id : biblio $biblionumber for $operation on $server\n" if $verbose;
my $ok;
eval{
# if the operation is a deletion, zebra requires that we give it the xml.
# as it is no more in the SQL db, retrieve it from zebra itself.
# may sound silly, but that's the way zebra works ;-)
if ($operation =~ /delete/i) { # NOTE depending on version, delete operation
# was coded 'delete_record' or 'recordDelete'.
# 'recordDelete' is the preferred one, as that's
# what the ZOOM API wants.
# 1st read the record in zebra
my $Zconn=C4::Context->Zconn($server, 0, 1,'','xml');
my $query = $Zconn->search_pqf( '@attr 1=Local-Number '.$biblionumber);
# then, delete the record
$ok=zebrado($query->record(0)->render(),$operation,$server,$biblionumber);
# if it's an add or a modif
} else {
# get the XML
if ($server eq "biblioserver") {
my $marc = GetMarcBiblio($biblionumber);
$marcxml = $marc->as_xml_record() if $marc;
} elsif ($server eq "authorityserver") {
$marcxml =C4::AuthoritiesMarc::GetAuthorityXML($biblionumber);
}
if ($verbose) {
if ($marcxml) {
print "XML read : $marcxml\n" if $verbose >1;
} else {
# workaround for zebra bug needing a XML even for deletion
$marcxml= "<dummy/>";
print "unable to read MARCxml\n" if $verbose;
}
}
# check it's XML, just in case
eval {
my $hashed=XMLin($marcxml);
}; ### is it a proper xml? broken xml may crash ZEBRA- slow but safe
## it's Broken XML-- Should not reach here-- but if it does -lets protect ZEBRA
if ($@){
warn $@;
my $delsth=$dbh->prepare("UPDATE zebraqueue SET done=1 WHERE id =?");
$delsth->execute($id);
next;
}
# ok, we have everything, do the operation in zebra !
$ok=zebrado($marcxml,$operation,$server);
}
};
print "ZEBRAopserver returned : $ok \n" if $verbose;
if ($ok ==1) {
$dbh=C4::Context->dbh;
my $delsth;
# if it's a deletion, we can delete every request on this biblio : in case the user
# did a modif (or item deletion) just before biblio deletion, there are some specialUpdage
# that are pending and can't succeed, as we don't have the XML anymore
# so, delete everything for this biblionumber
my $reset_readsth = 0;
if ($operation eq 'recordDelete') {
print "deleting biblio deletion $biblionumber\n" if $verbose;
$delsth =$dbh->prepare("UPDATE zebraqueue SET done=1 WHERE biblio_auth_number =?");
$delsth->execute($biblionumber);
$reset_readsth = 1 if $delsth->rows() > 0;
# if it's not a deletion, delete every pending specialUpdate for this biblionumber
# in case the user add biblio, then X items, before this script runs
# this avoid indexing X+1 times where just 1 is enough.
} else {
print "deleting special date for $biblionumber\n" if $verbose;
$delsth =$dbh->prepare("UPDATE zebraqueue SET done=1 WHERE biblio_auth_number =? and operation='specialUpdate'");
$delsth->execute($biblionumber);
$reset_readsth = 1 if $delsth->rows() > 0;
}
if ($reset_readsth) {
# if we can ignore rows in zebraqueue because we've already
# touched a record, reset the query.
$readsth->finish();
$readsth->execute();
}
}
}
sub zebrado {
###Accepts a $server variable thus we can use it to update biblios, authorities or other zebra dbs
my ($record,$op,$server,$biblionumber)=@_;
my @port;
my $tried=0;
my $recon=0;
my $reconnect=0;
# $record=Encode::encode("UTF-8",$record);
my $shadow=$server."shadow";
$op = 'recordDelete' if $op eq 'delete_record';
reconnect:
my $Zconn=C4::Context->Zconn($server, 0, 1);
if ($record){
print "updating $op on $biblionumber for server $server\n $record\n" if $verbose;
my $Zpackage = $Zconn->package();
$Zpackage->option(action => $op);
$Zpackage->option(record => $record);
# $Zpackage->option(recordIdOpaque => $biblionumber) if $biblionumber;
retry:
$Zpackage->send("update");
my($error, $errmsg, $addinfo, $diagset) = $Zconn->error_x();
if ($error==10007 && $tried<3) {## timeout --another 30 looonng seconds for this update
print "error 10007\n" if $verbose;
sleep 1; ## wait a sec!
$tried=$tried+1;
goto "retry";
}elsif ($error==2 && $tried<2) {## timeout --temporary zebra error !whatever that means
print "error 2\n" if $verbose;
sleep 2; ## wait two seconds!
$tried=$tried+1;
goto "retry";
}elsif($error==10004 && $recon==0){##Lost connection -reconnect
print "error 10004\n" if $verbose;
sleep 1; ## wait a sec!
$recon=1;
$Zpackage->destroy();
$Zconn->destroy();
goto "reconnect";
}elsif ($error){
# warn "Error-$server $op /errcode:, $error, /MSG:,$errmsg,$addinfo \n";
print "error $error\n" if $verbose;
$Zpackage->destroy();
$Zconn->destroy();
return 0;
}
$Zpackage->send('commit');
# $Zpackage->destroy();
# $Zconn->destroy();
return 1;
}
return 0;
}

2
t/Makefile

@ -29,7 +29,7 @@ REAL_REWRITE_SCRIPT = ../rewrite-config.PL
ZEBRA_CONF_DIR = run/etc/zebradb
ZEBRA_CONF_FILES = $(ZEBRA_CONF_DIR)/etc/passwd $(ZEBRA_CONF_DIR)/zebra-biblios.cfg $(ZEBRA_CONF_DIR)/zebra-authorities.cfg $(ZEBRA_CONF_DIR)/zebra-authorities-dom.cfg $(ZEBRA_CONF_DIR)/explain-authorities.xml $(ZEBRA_CONF_DIR)/explain-biblios.xml $(ZEBRA_CONF_DIR)/retrieval-info-auth-grs1.xml $(ZEBRA_CONF_DIR)/retrieval-info-auth-dom.xml $(ZEBRA_CONF_DIR)/ccl.properties $(ZEBRA_CONF_DIR)/cql.properties $(ZEBRA_CONF_DIR)/pqf.properties
SCRIPTS = koha-zebra-ctl.sh koha-pazpar2-ctl.sh koha-zebraqueue-ctl.sh zebraqueue_daemon.pl
SCRIPTS = koha-zebra-ctl.sh koha-pazpar2-ctl.sh
SRC_SCRIPT_DIR = ../misc/bin
TEST_SCRIPT_DIR = run/bin

4
t/db_dependent/lib/KohaTest.pm

@ -818,7 +818,7 @@ sub stop_zebrasrv {
sub start_zebraqueue_daemon {
my $command = q(run/bin/koha-zebraqueue-ctl.sh start);
my $command = q(echo "zebraqueue_daemon is deprecated");
diag $command;
my $started = system( $command );
diag "started: $started";
@ -832,7 +832,7 @@ sub start_zebraqueue_daemon {
sub stop_zebraqueue_daemon {
my $command = q(run/bin/koha-zebraqueue-ctl.sh stop);
my $command = q(echo "zebraqueue_daemon is deprecated");
diag $command;
my $started = system( $command );
diag "started: $started";

Loading…
Cancel
Save