Cache::Memcached issue
Jason Titus
jtitus@postini.com
Mon, 15 Mar 2004 18:00:26 -0800
This is a multi-part message in MIME format.
--------------070909040101000506050905
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
We found an issue connecting to multiple caches on the same host. The
dead_hosts hash contains both the hostname:port AND just the hostname.
This means that if one process goes down on a machine, all the
connections to the other ports will fail (silently).
Here is a proposed patch that folks may or may not like. I'm not sure
what the logic was of including the hostname as well as the
hostname:port combo. Perhaps there is a benefit that I'm not thinking of.
Let me know what you think. Without this, we have to manually call
'Cache::Memcached::forget_dead_hosts()' between each call.
Also, is there any plan to add in some kind of connection check to
Cache::Memcached? It is kind of a bummer to only find out that a
connection isn't working when you try and 'get' or 'set' something. A
failure on 'new' would make sense if there is no cache at a particular
hostname:port.
Jason
--------------070909040101000506050905
Content-Type: text/plain;
name="dead-host-fix.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="dead-host-fix.patch"
--- Cache-Memcached-1.0.11/Memcached.pm 2003-10-26 01:04:36.000000000 -0800
+++ Cache-Memcached-1.0.11-dead-host-fix/Memcached.pm 2004-03-15 17:51:12.000000000 -0800
@@ -95,7 +95,7 @@
my $now = time();
my ($ip, $port) = ($1, $2);
my $host = "$ip:$port";
- $host_dead{$host} = $host_dead{$ip} = $now + 30 + int(rand(10));
+ $host_dead{$host} = $now + 30 + int(rand(10));
delete $cache_sock{$host};
}
return $ret; # 0 or undef, probably, depending on what caller wants
@@ -144,8 +144,7 @@
my $now = time();
my ($ip, $port) = $host =~ /(.*):(\d+)/;
return undef if
- $host_dead{$host} && $host_dead{$host} > $now ||
- $host_dead{$ip} && $host_dead{$ip} > $now;
+ $host_dead{$host} && $host_dead{$host} > $now;
my $sock = "Sock_$host";
my $proto = $PROTO_TCP ||= getprotobyname('tcp');
--------------070909040101000506050905--