Kouhei Sutou
kou****@clear*****
2009年 7月 3日 (金) 21:32:56 JST
須藤です。 In <20090****@epepe*****> "[groonga-dev,00106] Re: Ruby/groongaにてDatabaseをopenするとSegmentation faultする" on Thu, 2 Jul 2009 14:15:41 +0900, morit****@razil***** wrote: > 手元で試してみたところ、SIGABRTやSIGSEGVは再現しませんが、 > Groonga::Databaseオブジェクトが二重に解放されていることを確認しました。 > > ruby -rgroonga -e "Groonga::Database.open('testdb')"を実行すると、 手元ではこれで再現できました。 % ruby -rgroonga -e "Groonga::Database.open('testdb'); GC.disable" そして、<ranguba:objects>の作成に失敗していることに気付きま した。こんなパッチを当てるとわかると思います。 Index: ext/rb-grn-context.c =================================================================== --- ext/rb-grn-context.c (revision 413) +++ ext/rb-grn-context.c (working copy) @@ -83,6 +83,7 @@ GRN_OBJ_TABLE_HASH_KEY, key_type, 0); + rb_grn_context_check(context, Qnil); } grn_table_add(context, objects, こんなエラーメッセージが出ます。 -e:1:in `open': invalid argument: already used name was assigend (Groonga::InvalidArgument) でも、そこの少し上のgrn_ctx_get()ではオブジェクトを取得でき ていません。これは。。。どこが悪いんだろう。。。 > これを回避するためのruby-groongaに当てるpatchを作りました。 > > 手元の環境ではこれで二重に解放されなくなりました。 これだと、groongaのDBをラップしているRuby側の構造体 (RbGrnObject)が解放されなくなってしまうんです。 DBがちゃんと<ranguba:objects>に登録されているとcontextがfin したときにちゃんとDBも解放されて、二重に解放されなくなるはず なんですが。。。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード (http://www.clear-code.com/)