Bugzilla – Attachment 32872 Details for
Bug 11998
Syspref caching issues
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 11998 - sysprefs in memcached
Bug-11998---sysprefs-in-memcached.patch (text/plain), 4.75 KB, created by
Brendan Gallagher
on 2014-10-28 21:45:36 UTC
(
hide
)
Description:
Bug 11998 - sysprefs in memcached
Filename:
MIME Type:
Creator:
Brendan Gallagher
Created:
2014-10-28 21:45:36 UTC
Size:
4.75 KB
patch
obsolete
>From 559ee2105ed3490b7fd0af59c974f8fff6c5d3db Mon Sep 17 00:00:00 2001 >From: Robin Sheat <robin@catalyst.net.nz> >Date: Tue, 1 Apr 2014 16:16:29 +1300 >Subject: [PATCH] Bug 11998 - sysprefs in memcached > >The caching mechanism has been abstracted a little bit, and now supports >memcached for storing sysprefs. These should be correctly stored and >cleared so caching will work between processes. > >Signed-off-by: Brendan Gallagher <brendan@bywatersolutions.com> >--- > C4/Context.pm | 82 ++++++++++++++++++++++++++++++++++++++++++++++----------- > 1 file changed, 66 insertions(+), 16 deletions(-) > >diff --git a/C4/Context.pm b/C4/Context.pm >index c5e61d6..301e22a 100644 >--- a/C4/Context.pm >+++ b/C4/Context.pm >@@ -518,6 +518,63 @@ sub ModZebrations { > return _common_config($_[1],'serverinfo'); > } > >+=head2 _cache_preference($variable, [$value]) >+ >+ _cache_preferences('opacusercss', $css); >+ my $val = _cach_preferences('opacusercss'); >+ >+An interface into the syspref caching. One argument to get a value, two to set >+it. The single argument version will return C<undef> if the cache doesn't >+contain the value. If the second argument is C<undef>, then the cache will be >+cleared of that value. >+ >+The cache timeout length is 30 seconds when memcache is not in use. When >+memcache is in use, it uses the default cache time for that. >+ >+=cut >+ >+my %syspref_cache; >+my $use_syspref_cache = 1; >+ >+sub _cache_preference { >+ return undef unless $use_syspref_cache; >+ my $memcached = memcached(); >+ my $memcached_prefix = "_syspref_"; >+ if ( scalar(@_) == 1 ) { >+ my ($var) = @_; >+ if ($memcached) { >+ my $val = $memcached->get( $memcached_prefix . lc($var) ); >+ return $val; >+ } >+ else { >+ my $now = time; >+ my $cache_oldest = $now - 30; >+ return undef unless exists $syspref_cache{ lc $var }; >+ my $val = $syspref_cache{ lc $var }; >+ return undef unless $val->[0] > $cache_oldest; >+ return $val->[1]; >+ } >+ } >+ elsif ( scalar(@_) == 2 ) { >+ my ( $var, $val ) = @_; >+ if ($memcached) { >+ if ( !defined($val) ) { >+ $memcached->delete( $memcached_prefix . lc($var) ); >+ } >+ else { >+ $memcached->set( $memcached_prefix . lc($var), $val ); >+ } >+ } >+ else { >+ if ( !defined($val) ) { >+ delete $syspref_cache{ lc $var }; >+ return; >+ } >+ $syspref_cache{ lc $var } = [ time, $val ]; >+ } >+ } >+} >+ > =head2 preference > > $sys_preference = C4::Context->preference('some_variable'); >@@ -534,23 +591,12 @@ with this method. > > =cut > >-my %syspref_cache; >-my $use_syspref_cache = 1; >- > sub preference { > my $self = shift; > my $var = shift; # The system preference to return > >- # We cache for 30 seconds, after that sysprefs are expired from the cache. >- # This is for persistent environments like Plack. >- my $now = time; >- my $cache_oldest = $now - 30; >- if ($use_syspref_cache && exists $syspref_cache{lc $var}) { >- # The cache contains an arrayref, first entry is the time it was >- # stored, the second is the value. >- my $cached_value = $syspref_cache{lc $var}; >- return $cached_value->[1] if ($cached_value->[0] > $cache_oldest); >- } >+ my $cached_var = _cache_preference($var); >+ return $cached_var if defined $cached_var; > > my $dbh = C4::Context->dbh or return 0; > >@@ -568,7 +614,7 @@ sub preference { > $value = $dbh->selectrow_array( $sql, {}, lc $var ); > } > >- $syspref_cache{lc $var} = [$now, $value]; >+ _cache_preference($var, $value); > return $value; > } > >@@ -620,6 +666,10 @@ will not be seen by this process. > > sub clear_syspref_cache { > %syspref_cache= (); >+ # It doesn't seem to be possible to list all the keys via Cache::Memcached >+ # so we'll clear the whole cache. >+ my $memcached = memcached(); >+ $memcached->flush_all if $memcached; > } > > =head2 set_preference >@@ -665,7 +715,7 @@ ON DUPLICATE KEY UPDATE value = VALUES(value)'; > } > my $sth = $dbh->prepare($query); > if ( $sth->execute(@params) ) { >- $syspref_cache{$var} = [ time, $value ]; >+ _cache_preference($var, $value); > logaction( 'SYSTEMPREFERENCE', $logtype, undef, $var . " | " . $value ); > } > $sth->finish; >@@ -690,7 +740,7 @@ sub delete_preference { > my $sth = $dbh->prepare("DELETE FROM systempreferences WHERE variable=?"); > my $res = $sth->execute($var); > if ($res) { >- delete $syspref_cache{$var}; >+ C4::Context->set_preference($var, undef); > logaction( 'SYSTEMPREFERENCE', 'DELETE', undef, > $var . " | " . ( $var // 'undefined' ) ); > return 1; >-- >1.7.10.4
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 11998
:
26575
|
26621
|
26714
|
26716
|
26717
|
27382
|
31801
|
31802
|
32870
|
32871
|
32872
|
32873
|
32874
|
33183
|
33447
|
33670
|
33671
|
33685
|
33724
|
33725
|
33746
|
33829
|
33940
|
36523
|
36524
|
36525
|
36526
|
36527
|
36528
|
36529
|
36530
|
36531
|
36532
|
36533
|
36534
|
36571
|
36583
|
36584
|
36585
|
36586
|
36587
|
36588
|
36589
|
36590
|
36591
|
36592
|
36593
|
36594
|
36595
|
48640
|
48652
|
48655
|
48687
|
48688
|
48727
|
48758
|
48928
|
48929
|
48930
|
48931
|
48932
|
48933
|
48934
|
48935
|
48936
|
48961
|
49022
|
49023
|
49024
|
49025
|
49026
|
49027
|
49028
|
49029
|
49030
|
49100
|
49101
|
49102
|
49103
|
49104
|
49105
|
49106
|
49107
|
49108