2008年03月12日
repcached-1.2をリリースしました
repcached-1.2 (memcached-1.2.4ベース) を公開しましたのでお知らせします。
今回のバージョンアップは以下の2件の不具合修正になります。
- flush_allのレプリケーション時にマスタでメモリリークする可能性があったのを修正しました
- flagsパラメータがレプリケーションされていなかったのを修正しました
ダウンロードやインストール方法などの詳しい情報は、プロジェクトページをご覧ください
flagsパラメータがレプリケーションされない不具合の詳細
memcachedプロトコルでは更新系コマンドにflagsというパラメータがあります。
set key 0 0 5
↑これ
本来であれば、このパラメータもレプリケーションすべきですが、以前のバージョンではバックアップで常に0をセットしてしまっていました。
master: set key 1 0 5 ← Masterはflags=1なのに backup: set key 0 0 5 ← backupはflags=0になっちゃってる
flagsパラメータを利用していないアプリケーションには影響ありませんが、PHPのMemcache::set関数などを使ってオブジェクトを格納しているようなアプリケーションでは致命的な問題となります。例えば、以下のようなコードです。
※環境は php-5.2.5 + memcache-2.2.3.tgz です。
#!/usr/bin/php
<?PHP
$memcacheM = new Memcache;
$memcacheB = new Memcache;
$memcacheM->connect('master', 11211) or die ("connect errorM\n");
$memcacheB->connect('backup', 11211) or die ("connect errorB\n");
$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;
$memcacheM->set('key', $tmp_object, false, 10) or die ("set error\n");
$get_resultM = $memcacheM->get('key');
echo "Master\n";
var_dump($get_resultM);
echo "\n";
$get_resultB = $memcacheB->get('key');
echo "Backup\n";
var_dump($get_resultB);
?>
実行結果は以下のようになります。
【実行結果】
Master
object(stdClass)#5 (2) {
["str_attr"]=>
string(4) "test"
["int_attr"]=>
int(123)
}
Backup
string(66) "O:8:"stdClass":2:{s:8:"str_attr";s:4:"test";s:8:"int_attr";i:123;}"
なんと、Masterからgetした場合はオブジェクトとして扱われているのに対し、Backupでgetすると文字列として扱われてしまっています。PHPのMemcache関数は、データをシリアライズして格納しているかどうかを判断するためにflagsを利用しているようです。もしかすると他のライブラリでも同様の問題があるかもしれませんのでご注意下さい。
repcached-2.0の近況
現在、memcached-1.2.5をベースにしたrepcached-2.0を開発中です。実装のほうはほとんど終わっていまして、今はコードを見直しながらストレステストの準備をしています。早ければ今月中、遅くとも来月の頭にはリリースできると思いますのでご期待下さいませ!
(や)
