[groonga-dev,00108] Re: Ruby/groongaにてDatabaseをopenするとSegmentation faultする

Back to archive index

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/)




groonga-dev メーリングリストの案内
Back to archive index