Strange perl Cached::Memcached behavior
Andrew Bryan
abryan at pangeamedia.com
Mon Apr 14 18:37:34 UTC 2008
Hi all,
While debugging a memcached issue we are having, I came across some
strange behavior of the perl Cached::Memcached module. These are the
versions I was using:
Memcached 1.2.5
Cached::Memcached 1.24
My test involved a simple script that just increments a key in a loop:
thrash_memd.pl:
---
use strict;
use Cache::Memcached;
my $memd = new Cache::Memcached { servers => [ '127.0.0.1:11211' ] };
my $key = 'test';
$memd->add($key => 1, 3600) or warn 'Already added';
while (1) {
print $memd->get($key)."\n";
$memd->incr($key) or warn 'FAIL!';
}
---
The idea was that I would run this script simultaneously from two
separate consoles with the aim of replicating an incr failure we are having.
In the first console I restart memcached immediately before executing
the script:
# sudo /etc/init.d/memcached restart; perl thrash_memd.pl
Shortly after that script starts printing out the incrementing value I
start the script in the second console:
# perl thrash_memd.pl
This is the output I get from the second script:
---
Use of uninitialized value in string eq at
/usr/local/share/perl/5.8.8/Cache/Memcached.pm line 494.
Already added at thrash_memd.pl line 8.
Use of uninitialized value in pattern match (m//) at
/usr/local/share/perl/5.8.8/Cache/Memcached.pm line 525.
FAIL! at thrash_memd.pl line 12.
Use of uninitialized value in pattern match (m//) at
/usr/local/share/perl/5.8.8/Cache/Memcached.pm line 525.
FAIL! at thrash_memd.pl line 12.
Use of uninitialized value in pattern match (m//) at
/usr/local/share/perl/5.8.8/Cache/Memcached.pm line 525.
FAIL! at thrash_memd.pl line 12.
---
Every increment fails in the second script for a period of time, and
then when it does start incrementing the first script will start
throwing warnings.
But this only happens when I restart memcached *immediately* before
executing the first script; if I wait a second or two between the
restart and the first script then both scripts will happily increment.
I tried this exact same test with Cache::Memcached::libmemcached, and
did not get this behavior (maybe just because it is slower?).
As I said, the reason for this test was to try and debug a problem in
one of our applications, and I don't think this strange behavior is
necessarily related, but it does make me wonder if Cache::Memcached can
be trusted.
We are trying to solve a problem where incrs randomly fail (ostensibly)
in our application. We use the following cliche to increment a counter:
---
unless ($cache->incr($memd_key)) {
unless ($cache->add($memd_key, 1, 86400) {
unless ($cache->incr($memd_key)) {
$log->info("Unable to increment $memd_key");
}
}
}
---
and we see a large number of failures (usually consecutively) in our
logs when we are almost certain that memcached is running perfectly
fine. This application receives a fairly large number of page impressions.
Does anyone have any thoughts on the strange test script behavior, or
why our application might be failing? Is Cache::Memcached reliable
enough for heavy use? Are we using it incorrectly?
Kind regards
Andrew Bryan
abryan at pangeamedia.com
More information about the memcached
mailing list