summaryrefslogtreecommitdiffstats
path: root/Bugzilla/Memcached.pm
diff options
context:
space:
mode:
authorByron Jones <bjones@mozilla.com>2014-03-04 08:50:54 +0100
committerByron Jones <bjones@mozilla.com>2014-03-04 08:50:54 +0100
commit9193214274889f2b7636146e72d8200e9bfaeb7b (patch)
treee570cc86aa8df53dd0e7e9d902d88450c5dc25c7 /Bugzilla/Memcached.pm
parent75eaf0d6c8ecf764d73cb870e504e84826d44751 (diff)
downloadbugzilla-9193214274889f2b7636146e72d8200e9bfaeb7b.tar.gz
bugzilla-9193214274889f2b7636146e72d8200e9bfaeb7b.tar.xz
Bug 966180: backport bug 956233 to bmo (enable USE_MEMCACHE on most objects)
Diffstat (limited to 'Bugzilla/Memcached.pm')
-rw-r--r--Bugzilla/Memcached.pm34
1 files changed, 30 insertions, 4 deletions
diff --git a/Bugzilla/Memcached.pm b/Bugzilla/Memcached.pm
index b1b10311b..4bfca2b65 100644
--- a/Bugzilla/Memcached.pm
+++ b/Bugzilla/Memcached.pm
@@ -14,6 +14,12 @@ use warnings;
use Bugzilla::Error;
use Bugzilla::Util qw(trick_taint);
use Scalar::Util qw(blessed);
+use URI::Escape;
+use Encode;
+use Sys::Syslog qw(:DEFAULT);
+
+# memcached keys have a maximum length of 250 bytes
+use constant MAX_KEY_LENGTH => 250;
sub _new {
my $invocant = shift;
@@ -26,10 +32,11 @@ sub _new {
&& Bugzilla->params->{memcached_servers})
{
require Cache::Memcached;
+ $self->{namespace} = Bugzilla->params->{memcached_namespace} || '';
$self->{memcached} =
Cache::Memcached->new({
servers => [ split(/[, ]+/, Bugzilla->params->{memcached_servers}) ],
- namespace => Bugzilla->params->{memcached_namespace} || '',
+ namespace => $self->{namespace},
});
}
return bless($self, $class);
@@ -129,6 +136,11 @@ sub clear_all {
if (!$memcached->incr("prefix", 1)) {
$memcached->add("prefix", time());
}
+
+ # BMO - log that we've wiped the cache
+ openlog('apache', 'cons,pid', 'local4');
+ syslog('notice', encode_utf8('[memcached] cache cleared'));
+ closelog();
}
# in order to clear all our keys, we add a prefix to all our keys. when we
@@ -155,6 +167,14 @@ sub _prefix {
return $request_cache->{memcached_prefix};
}
+sub _encode_key {
+ my ($self, $key) = @_;
+ $key = $self->_prefix . ':' . uri_escape_utf8($key);
+ return length($self->{namespace} . $key) > MAX_KEY_LENGTH
+ ? undef
+ : $key;
+}
+
sub _set {
my ($self, $key, $value) = @_;
if (blessed($value)) {
@@ -162,13 +182,17 @@ sub _set {
ThrowCodeError('param_invalid', { function => "Bugzilla::Memcached::set",
param => "value" });
}
- return $self->{memcached}->set($self->_prefix . ':' . $key, $value);
+ $key = $self->_encode_key($key)
+ or return;
+ return $self->{memcached}->set($key, $value);
}
sub _get {
my ($self, $key) = @_;
- my $value = $self->{memcached}->get($self->_prefix . ':' . $key);
+ $key = $self->_encode_key($key)
+ or return;
+ my $value = $self->{memcached}->get($key);
return unless defined $value;
# detaint returned values
@@ -187,7 +211,9 @@ sub _get {
sub _delete {
my ($self, $key) = @_;
- return $self->{memcached}->delete($self->_prefix . ':' . $key);
+ $key = $self->_encode_key($key)
+ or return;
+ return $self->{memcached}->delete($key);
}
1;