新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

2010-04-16

[Perl]Data::ModelをインターフェースとしてTokyoTyrantへデータの出し入れをする際にハマった

YappoLogs: KVSでORマッパーを使うという事を参考に、スキーマクラスを構築して、データの出し入れをしました…が、

Can't use string ("k… ÎKÇ
» Ú") as a HASH ref while "strict refs" in use at /usr/lib/perl5/site_perl/5.8.8/Data/Model/Driver/Memcached.pm line 188.

というエラーを吐いてしまい、データの出し入れどころじゃない状態になってしまいました。どうやらデータのシリアライズ処理に問題が発生しているようです…
で、念のためData::Modelのテストコード[t/060_driver/memcached/serializer.t]を読んでみたわけですが、シリアライズ処理のテストの冒頭で、テスト数が分岐していました。条件は、$Data::MessagePack::VERSIONが0.05以上か否か。0.05未満ならテスト数は20…。 ええ?Data::MessagePackってrequiredじゃないん?
もしや…早速このテストコードを実行。

# perl t/060_driver/memcached/serializer.t
1..20
ok 1
ok 2
ok 3
:
(中略)
:
ok 18
ok 19
ok 20

はわわわ…やはりData::MessagePackが(0.05未満|入っていない)って事ですねorz
んじゃ、とっとと入れましょうかということで

# cpanm Data::MessagePack
Fetching http://search.cpan.org/CPAN/authors/id/T/TO/TOKUHIROM/Data-MessagePack-0.10.tar.gz ... OK
Configuring Data-MessagePack-0.10 ... OK
Building and testing Data-MessagePack-0.10 for Data::MessagePack ... OK
Successfully installed Data-MessagePack-0.10

はい、Data::MessagePack 0.10が入りました!

では気を取り直して、再度テストコードを実行します。

# perl t/060_driver/memcached/serializer.t
1..100
ok 1
ok 2 - pack
ok 3 - unpack
ok 4
ok 5 - NOT INT: pack with Data::MessagePack
:
(中略)
:
ok 99
ok 100 - INT: pack with Data::MessagePack

おほー!来たよ来たわよ来ましたよ!!
この後、TokyoTyrantのデータをvanishしてから、データの出し入れが可能になりました!

2010-06-01 追記
当たり前といえばそれまでですが、TokyoTyrantをデータストアとして扱う場合、Data::Model::Driver::Memcachedのインスタンス生成時には、以下のように必ずSerializerを"Default"に設定する必要があります。

my $tokyo_tyrant = Data::Model::Driver::Memcached->new(
memcached => Cache::Memcached::Fast->new( {
servers => [qw/ 127.0.0.1:1978 /],
} ),
serializer => 'Default',
);

0 件のコメント: