|
Lines 44-49
my $where;
Link Here
|
| 44 |
my $offset; |
44 |
my $offset; |
| 45 |
my $run_as_root; |
45 |
my $run_as_root; |
| 46 |
my $run_user = (getpwuid($<))[0]; |
46 |
my $run_user = (getpwuid($<))[0]; |
|
|
47 |
my $wait_for_lock = 0; |
| 48 |
my $use_flock; |
| 47 |
|
49 |
|
| 48 |
my $verbose_logging = 0; |
50 |
my $verbose_logging = 0; |
| 49 |
my $zebraidx_log_opt = " -v none,fatal,warn "; |
51 |
my $zebraidx_log_opt = " -v none,fatal,warn "; |
|
Lines 65-75
my $result = GetOptions(
Link Here
|
| 65 |
'x' => \$as_xml, |
67 |
'x' => \$as_xml, |
| 66 |
'y' => \$do_not_clear_zebraqueue, |
68 |
'y' => \$do_not_clear_zebraqueue, |
| 67 |
'z' => \$process_zebraqueue, |
69 |
'z' => \$process_zebraqueue, |
| 68 |
'where:s' => \$where, |
70 |
'where:s' => \$where, |
| 69 |
'length:i' => \$length, |
71 |
'length:i' => \$length, |
| 70 |
'offset:i' => \$offset, |
72 |
'offset:i' => \$offset, |
| 71 |
'v+' => \$verbose_logging, |
73 |
'v+' => \$verbose_logging, |
| 72 |
'run-as-root' => \$run_as_root, |
74 |
'run-as-root' => \$run_as_root, |
|
|
75 |
'wait-for-lock' => \$wait_for_lock, |
| 73 |
); |
76 |
); |
| 74 |
|
77 |
|
| 75 |
if (not $result or $want_help) { |
78 |
if (not $result or $want_help) { |
|
Lines 156-166
my ($biblioitemnumbertagfield,$biblioitemnumbertagsubfield) = &GetMarcFromKohaFi
Link Here
|
| 156 |
|
159 |
|
| 157 |
# Protect again simultaneous update of the zebra index by using a lock file. |
160 |
# Protect again simultaneous update of the zebra index by using a lock file. |
| 158 |
# Create our own lock directory if its missing. This shouild be created |
161 |
# Create our own lock directory if its missing. This shouild be created |
| 159 |
# by koha-zebra-ctl.sh. |
162 |
# by koha-zebra-ctl.sh or at system installation. If the desired directory |
|
|
163 |
# does not exist and cannot be created, we fall back on /tmp - which will |
| 164 |
# always work. |
| 160 |
|
165 |
|
| 161 |
my $lockdir = C4::Context->config("zebra_lockdir") // "/var/lock"; |
166 |
my $lockdir = C4::Context->config("zebra_lockdir") // "/var/lock"; |
| 162 |
$lockdir .= "/rebuild"; |
167 |
$lockdir .= "/rebuild"; |
| 163 |
mkpath($lockdir, 0, oct(755)) unless (-d $lockdir); |
168 |
unless (-d $lockdir) { |
|
|
169 |
eval { mkpath($lockdir, 0, oct(755)) }; |
| 170 |
$lockdir = "/tmp" if ($@); |
| 171 |
} |
| 164 |
my $lockfile = $lockdir . "/rebuild..LCK"; |
172 |
my $lockfile = $lockdir . "/rebuild..LCK"; |
| 165 |
|
173 |
|
| 166 |
if ( $verbose_logging ) { |
174 |
if ( $verbose_logging ) { |
|
Lines 187-207
my $tester = XML::LibXML->new();
Link Here
|
| 187 |
# record being overwritten by a rebuild if the update is applied after the export |
195 |
# record being overwritten by a rebuild if the update is applied after the export |
| 188 |
# by the rebuild and before the rebuild finishes (more likely to effect large |
196 |
# by the rebuild and before the rebuild finishes (more likely to effect large |
| 189 |
# catalogs). |
197 |
# catalogs). |
|
|
198 |
# |
| 199 |
# We have chosen to exit immediately by default if we cannot obtain the lock |
| 200 |
# to prevent the potential for a infinite backlog from cron invocations, but an |
| 201 |
# option (wait-for-lock) is provided to let the program wait for the lock. |
| 202 |
# See http://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=11078 for details. |
| 190 |
open my $LockFH, q{>}, $lockfile or die "$lockfile: $!"; |
203 |
open my $LockFH, q{>}, $lockfile or die "$lockfile: $!"; |
| 191 |
if ($daemon_mode) { |
204 |
if ($daemon_mode) { |
| 192 |
while (1) { |
205 |
while (1) { |
| 193 |
# For incremental updates, skip the update if the updates are locked |
206 |
# For incremental updates, skip the update if the updates are locked |
| 194 |
if (flock($LockFH, LOCK_EX|LOCK_NB)) { |
207 |
if (_flock($LockFH, LOCK_EX|LOCK_NB)) { |
| 195 |
do_one_pass() if ( zebraqueue_not_empty() ); |
208 |
do_one_pass() if ( zebraqueue_not_empty() ); |
| 196 |
flock($LockFH, LOCK_UN); |
209 |
_flock($LockFH, LOCK_UN); |
| 197 |
} |
210 |
} |
| 198 |
sleep $daemon_sleep; |
211 |
sleep $daemon_sleep; |
| 199 |
} |
212 |
} |
| 200 |
} else { |
213 |
} else { |
| 201 |
# all one-off invocations, wait for the lock to free |
214 |
# all one-off invocations |
| 202 |
flock($LockFH, LOCK_EX); |
215 |
my $lock_mode = ($wait_for_lock) ? LOCK_EX : LOCK_EX|LOCK_NB; |
| 203 |
do_one_pass(); |
216 |
if (_flock($LockFH, $lock_mode)) { |
| 204 |
flock($LockFH, LOCK_UN); |
217 |
do_one_pass(); |
|
|
218 |
_flock($LockFH, LOCK_UN); |
| 219 |
} else { |
| 220 |
# Can't die() here because we have files to dlean up. |
| 221 |
print "Aborting rebuild. Unable to flock $lockfile: $!\n"; |
| 222 |
} |
| 205 |
} |
223 |
} |
| 206 |
|
224 |
|
| 207 |
|
225 |
|
|
Lines 755-760
sub do_indexing {
Link Here
|
| 755 |
|
773 |
|
| 756 |
} |
774 |
} |
| 757 |
|
775 |
|
|
|
776 |
sub _flock { |
| 777 |
# test if flock is present; if so, use it; if not, return true |
| 778 |
# op refers to the official flock operations incl LOCK_EX, LOCK_UN, etc. |
| 779 |
# combining LOCK_EX with LOCK_NB returns immediately |
| 780 |
my ($fh, $op)= @_; |
| 781 |
if( !defined($use_flock) ) { |
| 782 |
#check if flock is present; if not, you will have a fatal error |
| 783 |
my $i=eval { flock($fh, $op) }; |
| 784 |
#assuming that $fh and $op are fine(..), an undef i means no flock |
| 785 |
$use_flock= defined($i)? 1: 0; |
| 786 |
print "Warning: flock could not be used!\n" if $verbose_logging && !$use_flock; |
| 787 |
return 1 if !$use_flock; |
| 788 |
return $i; |
| 789 |
} |
| 790 |
else { |
| 791 |
return 1 if !$use_flock; |
| 792 |
return flock($fh, $op); |
| 793 |
} |
| 794 |
} |
| 795 |
|
| 758 |
sub print_usage { |
796 |
sub print_usage { |
| 759 |
print <<_USAGE_; |
797 |
print <<_USAGE_; |
| 760 |
$0: reindex MARC bibs and/or authorities in Zebra. |
798 |
$0: reindex MARC bibs and/or authorities in Zebra. |
|
Lines 843-848
Parameters:
Link Here
|
| 843 |
|
881 |
|
| 844 |
--run-as-root explicitily allow script to run as 'root' user |
882 |
--run-as-root explicitily allow script to run as 'root' user |
| 845 |
|
883 |
|
|
|
884 |
--wait-for-lock when not running in daemon mode, the default |
| 885 |
behavior is to abort a rebuild if the rebuild |
| 886 |
lock is busy. This option will cause the program |
| 887 |
to wait for the lock to free and then continue |
| 888 |
processing the rebuild request, |
| 889 |
|
| 846 |
--help or -h show this message. |
890 |
--help or -h show this message. |
| 847 |
_USAGE_ |
891 |
_USAGE_ |
| 848 |
} |
892 |
} |