summaryrefslogtreecommitdiffstats
path: root/Bugzilla/Memcached.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Bugzilla/Memcached.pm')
-rw-r--r--Bugzilla/Memcached.pm39
1 files changed, 31 insertions, 8 deletions
diff --git a/Bugzilla/Memcached.pm b/Bugzilla/Memcached.pm
index 0ceed97c0..d34aaa595 100644
--- a/Bugzilla/Memcached.pm
+++ b/Bugzilla/Memcached.pm
@@ -16,7 +16,7 @@ use Log::Log4perl qw(:easy);
use Bugzilla::Error;
use Scalar::Util qw(blessed);
use List::Util qw(sum);
-use Bugzilla::Util qw(trick_taint);
+use Bugzilla::Util qw(trick_taint trim);
use URI::Escape;
use Encode;
use Sys::Syslog qw(:DEFAULT);
@@ -36,11 +36,25 @@ sub _new {
if (Bugzilla->feature('memcached') && $servers) {
$self->{namespace} = Bugzilla->localconfig->{memcached_namespace};
TRACE("connecting servers: $servers, namespace: $self->{namespace}");
- $self->{memcached} = Cache::Memcached::Fast->new({
- servers => [ split(/[, ]+/, $servers) ],
- namespace => $self->{namespace},
- max_size => 1024 * 1024 * 4,
- });
+ $self->{memcached} = Cache::Memcached::Fast->new(
+ {
+ servers => [ _parse_memcached_server_list($servers) ],
+ namespace => $self->{namespace},
+ max_size => 1024 * 1024 * 4,
+ max_failures => 1,
+ failure_timeout => 60,
+ io_timeout => 0.2,
+ connect_timeout => 0.2,
+ }
+ );
+ my $versions = $self->{memcached}->server_versions;
+ if (keys %$versions) {
+ # this is needed to ensure forked processes don't start out with a connected memcached socket.
+ $self->{memcached}->disconnect_all;
+ }
+ else {
+ WARN("No memcached servers");
+ }
}
else {
TRACE("memcached feature is not enabled");
@@ -48,6 +62,13 @@ sub _new {
return bless($self, $class);
}
+sub _parse_memcached_server_list {
+ my ($server_list) = @_;
+ my @servers = split(/[, ]+/, trim($server_list));
+
+ return map { /:[0-9]+$/s ? $_ : "$_:11211" } @servers;
+}
+
sub enabled {
return $_[0]->{memcached} ? 1 : 0;
}
@@ -206,6 +227,8 @@ sub should_rate_limit {
my $prefix = RATE_LIMIT_PREFIX . $name . ':';
my $memcached = $self->{memcached};
+ return 0 unless $memcached;
+
$tries //= 3;
for (0 .. $tries) {
@@ -272,7 +295,7 @@ sub _inc_prefix {
delete Bugzilla->request_cache->{"memcached_prefix_$name"};
# BMO - log that we've wiped the cache
- INFO("$name cache cleared");
+ TRACE("$name cache cleared");
}
sub _global_prefix {
@@ -315,7 +338,7 @@ sub _get {
my $enc_key = $self->_encode_key($key)
or return;
- my $val = $self->{memcached}->get($key);
+ my $val = $self->{memcached}->get($enc_key);
TRACE("get $enc_key: " . (defined $val ? "HIT" : "MISS"));
return $val;
}