Bug 16758 - Caching issues in scripts running in daemon mode
authorJacek Ablewicz <abl@biblos.pk.edu.pl>
Wed, 14 Sep 2016 13:33:07 +0000 (15:33 +0200)
committerKyle M Hall <kyle@bywatersolutions.com>
Fri, 12 May 2017 12:49:42 +0000 (08:49 -0400)
As L1 cache does not have expiration mechanism, scripts running
in daemon mode (rebuild_zebra.pl -daemon, sip server ?, ...) would
not be aware of any possible changes in the data being cached
in upstream L2 cache.

This patch adds ->flush_L1_caches() call in rebuild_zebra.pl
inside daemon mode loop.

To test:

1) apply patch
2) ensure that rebuild_zebra.pl -daemon is still working properly,
without any noticeable performance degradation
3) stop memcached daemon and try to run rebuild_zebra.pl -daemon
again: there should be a warning emitted stating that the script
is running in daemon mode but without recommended caching system

Signed-off-by: Josef Moravec <josef.moravec@gmail.com>
Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
misc/migration_tools/rebuild_zebra.pl

index f8750d9..db04b11 100755 (executable)
@@ -26,6 +26,7 @@ use C4::Biblio;
 use C4::AuthoritiesMarc;
 use C4::Items;
 use Koha::RecordProcessor;
+use Koha::Caches;
 use XML::LibXML;
 
 use constant LOCK_FILENAME => 'rebuild..LCK';
@@ -62,6 +63,7 @@ my $run_user = (getpwuid($<))[0];
 my $wait_for_lock = 0;
 my $use_flock;
 my $table = 'biblioitems';
+my $is_memcached = Koha::Caches->get_instance('syspref')->memcached_cache;
 
 my $verbose_logging = 0;
 my $zebraidx_log_opt = " -v none,fatal,warn ";
@@ -128,6 +130,9 @@ if ($daemon_mode) {
         $msg   .= "Please do '$0 --help' to see usage.\n";
         die $msg;
     }
+    unless ($is_memcached) {
+        warn "Warning: script running in daemon mode, without recommended caching system (memcached).\n";
+    }
     $authorities = 1;
     $biblios = 1;
     $process_zebraqueue = 1;
@@ -237,7 +242,10 @@ if ($daemon_mode) {
         if (_flock($LockFH, LOCK_EX|LOCK_NB)) {
             eval {
                 $dbh = C4::Context->dbh;
-                do_one_pass() if ( zebraqueue_not_empty() );
+                if( zebraqueue_not_empty() ) {
+                    Koha::Caches->flush_L1_caches() if $is_memcached;
+                    do_one_pass();
+                }
             };
             if ($@ && $verbose_logging) {
                 warn "Warning : $@\n";