以前、ここに書いていた、memcachedのincrがスレッドセーフではなく、番号がズレることがある件が 1.4.6 で修正されたようなので検証してみた。
memcached-1.4.6のダウンロードは、memcached.org
から
リリースノート http://code.google.com/p/memcached/wiki/ReleaseNotes146
検証に使うscriptは以下。
use Cache::Memcached::Fast;
use Parallel::ForkManager;
my $i=0;
while(1) {
$i++;
my $memcached = Cache::Memcached::Fast->new({
servers => [ { address => "localhost:11211", noreply => 0 } ] ,
compress_threshold => 4_000,
ketama_points => 250,
max_failures => 3,
failure_timeout => 2,
});
$memcached->set("hoge",1);
print $i;
my $pm =Parallel::ForkManager->new(30);
foreach my $id ( 1..1000 ) {
$pm->start and next;
my $childmemcached = Cache::Memcached::Fast->new({
servers => [ { address => "localhost:11211", noreply => 0 } ] ,
compress_threshold => 4_000,
ketama_points => 250,
max_failures => 3,
failure_timeout => 2,
});
for my $loop ( 1..100 ) {
my $ret = $childmemcached->incr("hoge");
warn "[$id] failed?" unless $ret;
}
$pm->finish;
}
$pm->wait_all_children;
sleep 1;
my $ret = $memcached->get("hoge");
print $ret;
die if $ret != 100001;
sleep 30;
}
まず、memcached-1.4.5に対して実行してみると
$ perl -l mem.pl
1
100001
2
100001
3
100001
4
100001
5
100001
6
99995
Died at mem.pl line 37.
意外と簡単に、6ループ目で発症。
次に、memcached-1.4.6で検証
$ perl -l mem.pl
1
100001
2
100001
3
...
100
100001
101
100001
...
angry birdsをやりながらしばらく動かしっぱなしにしてたけど、途中で止まったりはしない模様。
ということで、memcached-1.4.6でincr/decrがスレッドセーフではないバグは修正されたと言っても問題ないでしょう
ちなみに、1.4.6では、mixiの障害の原因にもなった接続時の競合も解決されているようなので、要チェックです