kiyokaのブログアーカイブ

Archive of old blog posts

バグ原因調査: sekka-serverの起動時に辞書の読み込みに失敗する問題

@mori_devさんから[Sekka]のバグ報告があったので調査。 sekka の不具合(?)報告 — Gist => sekka-serverの起動時に辞書の読み込みに失敗する。

たぶんこれだろうと当たりがついているので、再現させてみる。 現象から、Tokyo Cabinetのバージョン不整合の問題だと考えられる。 新しいバージョンのTokyo Cabinetで作ったデータベースを古いTokyo Cabinetで開けようとしている可能性がある。

環境

この記事で使った環境は次の通り。 Rubyはrvmは使わず、ソースからインストールしている。(厳密にはstowというパッケージマネージャを使っている)

$ cat /etc/debian_version 
6.0.2
$ uname -a
Linux genkan.sumibi.org 2.6.34.1 #2 PREEMPT Thu Jul 22 16:04:48 JST 2010 i686 GNU/Linux
$ ruby --version
ruby 1.9.2p290 (2011-07-09 revision 32553) *i686-linux*
$ which ruby
/usr/local/bin/ruby
$ gem --version
1.8.8

Sekka 0.8.8 / 0.9.0の辞書データ

辞書データはTokyo CabinetのHashDBのデータベースファイルそのもので提供している。 作成に使ったTokyo Cabinetのバージョンは 1.4.47 だ。 Tokyo Cabinetはソースコードからインストールした最新版だ。

バージョン表示

$ tchmgr version
Tokyo Cabinet version 1.4.47 (910:1.0) for Linux
Copyright (C) 2006-2011 FAL Labs

辞書の内容を表示する。

$ tchmgr inform ~/.sekka-server/SEKKA-JISYO.SMALL.tch
path: SEKKA-JISYO.SMALL.tch
database type: hash
additional flags:
bucket number: 131071
alignment: 16
free block pool: 1024
inode number: 6554277
modified time: 2011-08-25T06:30:09+09:00
options:
record number: 3686019
file size: 296903328

古いTokyo Cabinetでオープンしてみる

これをDebian squeezeに入っているバージョンでオープンしてみる。

$ dpkg --list | grep -i tokyo
rc  libtokyocabinet 1.2.1-1         Tokyo Cabinet Database Libraries *runtime*
rc  libtokyocabinet 1.4.37-6        Tokyo Cabinet Database Libraries *runtime*
$

aptitudeでインストールする

$ su -
# aptitude install tokyocabinet-bin libtokyocabinet8 libtokyocabinet-dev 
# exit
$ dpkg --list | grep -i tokyo
ii  libtokyocabinet-dev                    1.4.37-6                               Tokyo Cabinet Database Libraries *development*
rc  libtokyocabinet3                       1.2.1-1                                Tokyo Cabinet Database Libraries *runtime*
ii  libtokyocabinet8                       1.4.37-6                               Tokyo Cabinet Database Libraries *runtime*
ii  tokyocabinet-bin                       1.4.37-6                               Tokyo Cabinet Database Utilities
$
$ tchmgr version
Tokyo Cabinet version 1.4.37 (827:1.0) for Linux
Copyright (C) 2006-2009 Mikio Hirabayashi
$ tchmgr inform ~/.sekka-server/SEKKA-JISYO.SMALL.tch
/usr/bin/tchmgr: -: 5: invalid meta data

やはりSekkaの辞書は読みこめない。エラーが出る。

* sekka-serverではどのようなエラーになるか。

tokyocabinetのGemを再度ビルドしなおす。 そのためには、再インストールすればよい。

$ gem uninstall tokyocabinet
$ gem install tokyocabinet
Fetching: tokyocabinet-1.29.gem (100%)
Building native extensions.  This could take a while...
Successfully installed tokyocabinet-1.29
1 gem installed
Installing ri documentation for tokyocabinet-1.29...
Installing RDoc documentation for tokyocabinet-1.29...

結果、@mori_devさんの環境と同じエラーが出た。

$ sekka-server

/usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/sekka-0.8.8/lib/sekka/jisyo-db.nnd:176: TokyoCabinet::HDB.open error: file=/home/kiyoka/.sekka-server/SEKKA-JISYO.SMALL.tch (RuntimeError)
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/sekka-0.8.8/lib/sekka/kvs.rb:56:in `open'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/sekka-0.8.8/lib/sekka/jisyo-db.nnd:216:in `block (2 levels) in initialize'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/sekka-0.8.8/lib/sekka/jisyo-db.nnd:461:in `call'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/sekka-0.8.8/lib/sekka/jisyo-db.nnd:461:in `block in initialize'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/nendo-0.5.2/lib/nendo.rb:1598:in `call'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/nendo-0.5.2/lib/nendo.rb:1598:in `callProcedure'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/nendo-0.5.2/lib/nendo.rb:1336:in `openSekkaJisyo'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/nendo-0.5.2/lib/nendo.rb:1336:in `openSekkaJisyo'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/sekka-0.8.8/lib/sekkaserver.rb:57:in `initialize'
	from ./lib/sekka.ru:37:in `new'
	from ./lib/sekka.ru:37:in `block in <main>'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/rack-1.3.2/lib/rack/builder.rb:51:in `instance_eval'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/rack-1.3.2/lib/rack/builder.rb:51:in `initialize'
	from ./lib/sekka.ru:1:in `new'
	from ./lib/sekka.ru:1:in `<main>'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/rack-1.3.2/lib/rack/builder.rb:40:in `eval'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/rack-1.3.2/lib/rack/builder.rb:40:in `parse_file'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/rack-1.3.2/lib/rack/server.rb:200:in `app'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/rack-1.3.2/lib/rack/server.rb:301:in `wrapped_app'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/rack-1.3.2/lib/rack/server.rb:252:in `start'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/rack-1.3.2/lib/rack/server.rb:137:in `start'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/sekka-0.8.8/bin/sekka-server:90:in `main'
	from /usr/local/stow/ruby-1.9.2-p290/lib/ruby/gems/1.9.1/gems/sekka-0.8.8/bin/sekka-server:100:in `<top (required)>'
	from /usr/local/bin/sekka-server:19:in `load'
	from /usr/local/bin/sekka-server:19:in `<main>'

原因

古いlibtokyocabinetでは、新しいlibtokyocabinetで作ったデータベースフェアを読み込めない。 => @mori_devさんところでは発生しないので、@mori_devさんの環境はどうも別の原因っぽいが… img

対策

配布する辞書は Debian と Ubuntuに入っているバージョンのTokyo Cabinetで作る。 それによって、[Sekka]をより広い環境で使える様にする。

Debian squeeze … tokyo cabinet 1.4.37 http://packages.debian.org/squeeze/tokyocabinet-bin Ubuntu 10.10 … tokyo cabinet 1.4.37 http://packages.ubuntu.com/maverick/tokyocabinet-bin このあたりで作ればいいかな。

Debian lennyはtokyo cabinet 1.2.1と古すぎるので対応しない。

[Sekka] 0.9.1の辞書からtokyo cabinet 1.4.37で作って提供するようにしよう。 @mori_devさんところの原因は個別に追っていく。こちらで議論して解決できればいいなぁ。 sekka-serverの起動時に辞書の読み込みに失敗する問題 - sekka_users | Google グループ