[groonga-dev,02983] Re: delete後にselectするとmysqlが再起動する

Back to archive index

saki kashi saki.****@gmail*****
2014年 11月 26日 (水) 18:15:28 JST


ご確認いただきまして、ありがとうございました。
落ちるケース、またREPRACEの件も御対応いただけるとのことで、感謝致します!
REPRACEはmysqlと同一のスキーマでやっていると思っていましたが、少し違ったようですね、失礼致しました。
調査いただいて誠にありがとうございました。

引き続きどうぞよろしくお願いします。

2014年11月26日 11:09 Kouhei Sutou <kou****@clear*****>:

> 須藤です。
>
> In <CAA3x****@mail*****>
>   "[groonga-dev,02971] Re: delete後にselectするとmysqlが再起動する" on Tue, 25 Nov
> 2014 11:58:04 +0900,
>   saki kashi <saki.****@gmail*****> wrote:
>
> > https://github.com/kashihara3/mroonga
> > こちらに配置させていただきました。
>
> 確認しました。どちらも再現しました。
>
> > falldown->当初の落ちる現象のデータです。
>
> これですが、込み入っているので今回のリリースに修正を入れるの
> は難しいです。来月リリースまでに修正します。
>
> 以下、メモです。あまり気にしないでください。
>
> 問題は2つあります。
>
>   1. インデックスからエントリーを削除するところがバグっている
>   2. ↑が失敗したときのエラーを無視しているので、エラーになっ
>      た時点で処理を中止せずに、何度も↑の処理を実行してしまっ
>      ている
>
> 1.は
>
>   grn_ii_delete_one() ->
>   buffer_flush() ->
>   buffer_merge() ->
>   chunk_merge()
>
>>
>   https://github.com/groonga/groonga/blob/master/lib/ii.c#l2567
>
>   ndf = ridp - dv[0].data;
>
> のndfが0になっているのがおかしい(あるいは、ndfが0になっても
> いいけど0になったときを考慮していない)っぽいです。
>
> ndfが0になるとその後でdv[0].data_sizeが0になってしまって、
>
>   https://github.com/groonga/groonga/blob/master/lib/ii.c#l2594
>
>   encsize = grn_p_encv(ctx, dv, ii->n_elements, enc);
>
> のencsizeも0になって、次の行の
>
>   https://github.com/groonga/groonga/blob/master/lib/ii.c#l2595
>
>   if (!(rc = chunk_flush(ctx, ii, cinfo, enc, encsize))) {
>
> がGRN_NO_MEMORY_AVAILABLEを返すので、結局grn_ii_delete_one()
> が失敗しています。
>
> (chunk_flushがGRN_NO_MEMORY_AVAILABLEを返すのはメモリーがな
> いからではなくて、サイズが0のメモリー領域を割り当てられない
> から。)
>
> Groonga単体で再現できる手順を作って、森さんに見てもらったほ
> うがよさそうな気がしています。
>
>
> 2.は
>
>   https://github.com/groonga/groonga/blob/master/lib/ii.c#L4854
>
> とかのgrn_ii_delete_one()の戻り値をチェックして
> grn_ii_update()がエラーを返すようにしないといけないです。
> こうしないと、何度もgrn_ii_delete_one()を呼び出して1.の状態
> になり、grn_ii_bufferがムダに増えていきます。
>
> 今回、mmapできる量を増やしたら問題が発生しにくくなったのは、
> ムダなgrn_ii_bufferが増えても大丈夫なくらいにmmapできるよう
> になったからです。1.を解決すれば必要な分だけgrn_ii_bufferを
> 使うようになるので、根本解決をするには1.の対応が必要です。
>
>
> > REPLACE->リプレイスでエラーになるデータです。
>
> これは、使い方にも問題がありました。
>
> 最小の再現ケースは↓です。
>
> CREATE TABLE test (
>   id varchar(32) NOT NULL PRIMARY KEY,
>   content text,
>   FULLTEXT INDEX (content)
> ) DEFAULT CHARSET=utf8mb4;
>
> REPLACE INTO test(content) VALUES("Hello");
>
> ポイントは次の3点です。
>
>   * PRIMARY KEYがある
>     (AUTO_INCREMENTを指定しなくてデフォルト値はない)
>   * FULLTEXT INDEXがある
>   * REPLACE INTOでPRIMARY KEYを指定していない
>
> 主キーがないので本来はエラーにするべきなんですが、そこのチェッ
> クが抜けていたので、Groongaの名前のエラーがでてしまっていま
> した。
>
> Mroongaレベルでちゃんとチェックをするようにしたので、今回の
> リリースからはMySQLっぽいエラーが返ります。
>
> 対策は、「REPLACE INTOするときに主キーも一緒に指定すること」
> です。
>
>
> 落ちるケースについての対応はもうしばらくお待ちください。
>
> --
> 須藤 功平 <kou****@clear*****>
> 株式会社クリアコード <http://www.clear-code.com/>
>
> Groongaベースの全文検索システムを総合サポート:
>   http://groonga.org/ja/support/
> 11/29 全文検索エンジンGroongaを囲む夕べ5:
>   http://groonga.doorkeeper.jp/events/15816
> 名著『リーダブルコード』を解説者と一緒に読み解こう:
>   http://schoo.jp/class/1502
>
> _______________________________________________
> groonga-dev mailing list
> groon****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/groonga-dev
>



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