|
Lines 5-10
use strict;
Link Here
|
| 5 |
|
5 |
|
| 6 |
use C4::Context; |
6 |
use C4::Context; |
| 7 |
use Getopt::Long; |
7 |
use Getopt::Long; |
|
|
8 |
use Fcntl qw(:flock); |
| 8 |
use File::Temp qw/ tempdir /; |
9 |
use File::Temp qw/ tempdir /; |
| 9 |
use File::Path; |
10 |
use File::Path; |
| 10 |
use C4::Biblio; |
11 |
use C4::Biblio; |
|
Lines 139-150
my $dbh = C4::Context->dbh;
Link Here
|
| 139 |
my ($biblionumbertagfield,$biblionumbertagsubfield) = &GetMarcFromKohaField("biblio.biblionumber",""); |
140 |
my ($biblionumbertagfield,$biblionumbertagsubfield) = &GetMarcFromKohaField("biblio.biblionumber",""); |
| 140 |
my ($biblioitemnumbertagfield,$biblioitemnumbertagsubfield) = &GetMarcFromKohaField("biblioitems.biblioitemnumber",""); |
141 |
my ($biblioitemnumbertagfield,$biblioitemnumbertagsubfield) = &GetMarcFromKohaField("biblioitems.biblioitemnumber",""); |
| 141 |
|
142 |
|
|
|
143 |
# We need to create our own lock directory which incorporates the database instance |
| 144 |
# we are indexing to facilitate multiple instances on the same machine. |
| 145 |
my $lockdir = "/var/lock/koha_rebuild_zebra_" . C4::Context->config("database"); |
| 146 |
mkpath($lockdir, 0, 0755) unless (-d $lockdir); |
| 147 |
my $lockfile = $lockdir . "/lock"; |
| 148 |
|
| 142 |
if ( $verbose_logging ) { |
149 |
if ( $verbose_logging ) { |
| 143 |
print "Zebra configuration information\n"; |
150 |
print "Zebra configuration information\n"; |
| 144 |
print "================================\n"; |
151 |
print "================================\n"; |
| 145 |
print "Zebra biblio directory = $biblioserverdir\n"; |
152 |
print "Zebra biblio directory = $biblioserverdir\n"; |
| 146 |
print "Zebra authorities directory = $authorityserverdir\n"; |
153 |
print "Zebra authorities directory = $authorityserverdir\n"; |
| 147 |
print "Koha directory = $kohadir\n"; |
154 |
print "Koha directory = $kohadir\n"; |
|
|
155 |
print "Lockfile = $lockfile\n"; |
| 148 |
print "BIBLIONUMBER in : $biblionumbertagfield\$$biblionumbertagsubfield\n"; |
156 |
print "BIBLIONUMBER in : $biblionumbertagfield\$$biblionumbertagsubfield\n"; |
| 149 |
print "BIBLIOITEMNUMBER in : $biblioitemnumbertagfield\$$biblioitemnumbertagsubfield\n"; |
157 |
print "BIBLIOITEMNUMBER in : $biblioitemnumbertagfield\$$biblioitemnumbertagsubfield\n"; |
| 150 |
print "================================\n"; |
158 |
print "================================\n"; |
|
Lines 156-168
if ($do_munge) {
Link Here
|
| 156 |
|
164 |
|
| 157 |
my $tester = XML::LibXML->new(); |
165 |
my $tester = XML::LibXML->new(); |
| 158 |
|
166 |
|
|
|
167 |
# The main work is done here by calling do_one_pass(). We have added locking |
| 168 |
# avoid race conditions between Full rebuilds and incremental updates either from |
| 169 |
# daemon mode or periodic invocation from cron. The race can lead to an updated |
| 170 |
# record being overwritten by a rebuild if the update is applied after the export |
| 171 |
# by the rebuild and before the rebuild finishes (more likely to effect large |
| 172 |
# catalogs). |
| 173 |
open(LockFH, ">$lockfile") or die "$lockfile: $!"; |
| 159 |
if ($daemon_mode) { |
174 |
if ($daemon_mode) { |
| 160 |
while (1) { |
175 |
while (1) { |
| 161 |
do_one_pass() if ( zebraqueue_not_empty() ); |
176 |
# For incremental updates, skip the update if the updates are locked |
|
|
177 |
if (flock(LockFH, LOCK_EX|LOCK_NB)) { |
| 178 |
do_one_pass() if ( zebraqueue_not_empty() ); |
| 179 |
flock(LockFH, LOCK_UN); |
| 180 |
} |
| 162 |
sleep $daemon_sleep; |
181 |
sleep $daemon_sleep; |
| 163 |
} |
182 |
} |
| 164 |
} else { |
183 |
} else { |
|
|
184 |
# all one-off invocations, wait for the lock to free |
| 185 |
flock(LockFH, LOCK_EX); |
| 165 |
do_one_pass(); |
186 |
do_one_pass(); |
|
|
187 |
flock(LockFH, LOCK_UN); |
| 166 |
} |
188 |
} |
| 167 |
|
189 |
|
| 168 |
|
190 |
|
| 169 |
- |
|
|