[groonga-dev,04808] Re: [ii][update][one] failed to decode / failed to merge chunk / failed to flush a bufferが出たときについて

Back to archive index
Sutou Kouhei kou****@clear*****
2020年 5月 19日 (火) 09:33:28 JST


須藤です。

> 後者のデータを可能な限り、DBと更新クエリをコンパクト化し、
> 別途手段にて共有させていただきます。
> 少々時間がかかるかもしれません。

この問題の再現作成用にちょっとしたスクリプトがあるのでそれを
使えるかもしれません。

https://github.com/groonga/groonga/blob/master/tools/copy-related-files.rb
を使うとDBの中の必要な部分だけコピーできます。これを使って更
新処理を次のようにします。

  1. 元のDBから必要な部分だけをコピーする
  2. 更新データを保存する
  3. 通常の更新処理をする
  4. 問題が発生したら1.と2.が欲しかった情報

あと、もしかしたら、問題発生のチェックにindex_column_diffを
使えるかもしれません。

ということでこんなスクリプトになります。

reproduced=no
if [ -d db.reproduced ]; then
  reproduced=yes
fi
if [ "${reproduced}" = "no" ]; then
  rm -rf db.copy
  ruby copy-related-files.rb \
    --destination=db.copy \
    --target=vgram_terms.description7
    db
fi
# 通常の更新用データ生成
generate-load-data.sh > load.grn
# 問題が発生したらここでブロックしてしまうかも
groonga --log-file db/log --file load.grn db/db
if [ "${reproduced}" = "no" ]; then
  n_broken_tokens=$(groonga db/db index_column_diff vgram_terms.description7 | jq '.[1][].token.value' | wc -l)
  if [ ${n_broken_tokens} -ne 0 -o grep -q "failed to decode" db/log ]; then
    echo "reproduced!"
    mv db.copy db.reproduced
    mv load.grn load.reproduced.grn
  fi
fi


In <CANM+HhdEFvSQUcbY7Bdi3wMQeSefPkB_Qez6k****@mail*****>
  "[groonga-dev,04806] Re: [ii][update][one] failed to decode / failed to merge chunk / failed to flush a bufferが出たときについて" on Tue, 19 May 2020 07:35:29 +0900,
  Naoya Murakami <visio****@gmail*****> wrote:

> 村上です。
> 
> 残念ながら後者ですね。
> 
> 後者のデータを可能な限り、DBと更新クエリをコンパクト化し、
> 別途手段にて共有させていただきます。
> 少々時間がかかるかもしれません。
> 
> 前者は複数のDBで同じ更新をずっと流してもあるDBでは起きて、
> 他のDBでは起きないということが結構あるので、再現がなかなか
> 難しそうなんですよね。
> 
> 時間できたら検証環境作って、更新データをまとめて動的更新し
> 続けて再現できないか試してみます。
> 
> 
> 2020年5月19日(火) 6:49 Sutou Kouhei <kou****@clear*****>:
> 
>> 須藤です。
>>
>> これ、最近原因を調べている(けどまだわかっていない)問題な気
>> がします。
>>
>> >>> 現状、同じ更新をすれば、必ずfailed to decodeになるデータベースは用意できますが、
>> >>> 参考になりますかね。
>>
>> これは、次の2つのデータがあるということですか?
>>
>>   * 問題のない(エラーになる前の)DB
>>   * ↑に入れるとこのエラーが出る更新データ
>>
>> であれば提供してもらえると助かります。
>>
>> それとも次のデータですか?
>>
>>   * エラーになった後のDB
>>   * ↑に再度入れるとこのエラーが再発する更新データ
>>
>> こちらでも提供してもらえると少し助かります。
>>
>> エラーになった後のDBは入手できそうなのですが、再発用の更新デー
>> タは入手できそうなので、1つデータが増えて助かります。
>>
>>
>> In <CANM+****@mail*****>
>>   "[groonga-dev,04804] Re: [ii][update][one] failed to decode / failed to
>> merge chunk / failed to flush a bufferが出たときについて" on Mon, 18 May 2020
>> 19:55:58 +0900,
>>   Naoya Murakami <visio****@gmail*****> wrote:
>>
>> > 村上です。
>> >
>> > 自己レスばかりですいません。。
>> >
>> > term_idはmax_idで&を取る仕様みたいで実際は171ですのでbufferは問題なさそうでした。
>> > 以下のgrn_p_dec()内のunpackで失敗しているみたいなのでやはりチャンクがおかしそうですね。
>> >
>> https://github.com/groonga/groonga/blob/6866ef08d386e63a7a26bae8fdaeb8f15a840ed9/lib/ii.c#L2237
>> >
>> > 壊し方を再現できたらまたご連絡いたします。
>> >
>> > 2020年5月18日(月) 19:13 Naoya Murakami <visio****@gmail*****>:
>> >
>> >> 村上です。
>> >>
>> >> buffer_data->term->tidが2147483819でなぜか2GiBちょいですね。
>> >> 実際のこれのlexiconのkey数は126447481で"9"というキーのlexicon上の_idは
>> >> 171になりますが、bufferが壊れているのですかね。
>> >>
>> >> > select vgram_terms --filter '_key == "9"' --output_columns _id,_key
>> >>
>> >>
>> [[0,1589796398.446896,0.01889300346374512],[[[1],[["_id","UInt32"],["_key","ShortText"]],[171,"9"]]]]
>> >>
>> >> やはりbufferが壊れるまでを再現できないと難しそうですかね。
>> >>
>> >> 2020年5月18日(月) 18:12 Naoya Murakami <visio****@gmail*****>:
>> >>
>> >>> 村上です。
>> >>>
>> >>> failed to decode / failed to merge chunk / failed to flush a
>> bufferが出た場合、
>> >>> 静的索引構築でチャンクを作り直すとエラーがでないようになるのですが、
>> >>> このエラーはチャンクが壊れていることによるものでしょうか。
>> >>>
>> >>> たまにマージができなくなってしまうときがあるのでチャンクの再作成を
>> >>> しています。
>> >>>
>> >>> 現状、同じ更新をすれば、必ずfailed to decodeになるデータベースは用意できますが、
>> >>> 参考になりますかね。
>> >>>
>> >>> 最近ようやくバージョンを上げたところで2年前ぐらいのGroongaのコードベースで
>> >>> updateしたものも含まれると思います。
>> >>>
>> >>> [ii][chunk][merge] failed to decode: <vgram_terms.description7>:
>> >>> <"9">(2147483819)
>> >>> [ii][buffer][merge] failed to merge chunk: <vgram_terms.description7>:
>> >>> <"9">(2147483819): chunk:<987>, n-chunks:<9886>
>> >>> [ii][update][one] failed to flush a buffer: <vgram_terms.description7>:
>> >>> <62108274>:<1>:<178>: term:<"96">, segment:<4917148>, free:<4>,
>> >>> required:<16>: [ii][buffer][merge] failed to merge chunk:
>> >>> <vgram_terms.description7>: <"9">(2147483819): chunk:<987>,
>> n-chunks:<9886>
>> >>>
>> >>> こうなるまでを再現できなければ、難しいようであれば再作成してしまいます。
>> >>>
>> >>> 以上、よろしくお願いします。
>> >>>
>> >>>
>>
>> _______________________________________________
>> groonga-dev mailing list
>> groon****@lists*****
>> https://lists.osdn.me/mailman/listinfo/groonga-dev
>>



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