<div dir="ltr"><div>村上です。</div><div><br></div><div>こちらに関して、先日1件、マージに失敗するのが再発生したのですが、</div><div>こちらについてはマージに失敗する前、思ったよりメモリを使いすぎていて</div><div>mmapに失敗してました。</div><div><br></div><div><div>このタイミングでmmapに失敗すると100%チャンクかバッファーが壊れるのかまでは</div><div>特定できていませんが、とりあえず、vm.max_map_countをさらに上げることと、</div><div>更新時に同時に使うメモリが大きくなりすぎないようにして再発が抑えられないか様子</div><div>を見てみます。</div></div><div><br></div><div>なお、この壊れたDBは再作成して手元には残っていません。<br></div><div><br></div><div>2020-06-25 12:17:50.987229|A|20927|c4108700: mmap(4194304,1835,897585152)=Cannot allocate memory <463439425536><br>2020-06-25 12:17:50.990443|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_ctx_log_back_trace+0x3a) [0x7f55c5c5a3fa]<br>2020-06-25 12:17:50.990450|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_io_seg_map_+0x6d2) [0x7f55c5da2cc2]<br>2020-06-25 12:17:50.990455|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_io_win_map+0xd32) [0x7f55c5da50a2]<br>2020-06-25 12:17:50.990459|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(+0x2fee0b) [0x7f55c5d6ee0b]<br>2020-06-25 12:17:50.990463|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(+0x301d38) [0x7f55c5d71d38]<br>2020-06-25 12:17:50.990467|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_ii_update_one+0x67e) [0x7f55c5d7cace]<br>2020-06-25 12:17:50.990472|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_ii_column_update+0xc60) [0x7f55c5d86a90]<br>2020-06-25 12:17:50.990476|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_obj_default_set_value_hook+0x98) [0x7f55c5c6ae68]<br>2020-06-25 12:17:50.990480|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_obj_set_value+0x177b) [0x7f55c5c7abdb]<br>2020-06-25 12:17:50.990484|A|20927|c4108700: /usr/local/mysql/lib/plugin/ha_mroonga.so(_ZN10ha_mroonga17storage_write_rowEPh+0x934) [0x7f55f4089e04]<br>2020-06-25 12:17:50.990489|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_ZN7handler12ha_write_rowEPh+0x198) [0x5584008c9758]<br>2020-06-25 12:17:50.990493|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_Z12write_recordP3THDP5TABLEP9COPY_INFOS4_+0x638) [0x558400edb4a8]<br>2020-06-25 12:17:50.990497|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_ZN14Sql_cmd_insert12mysql_insertEP3THDP10TABLE_LIST+0x931) [0x558400edcd51]<br>2020-06-25 12:17:50.990501|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_ZN14Sql_cmd_insert7executeEP3THD+0xf2) [0x558400eddac2]<br>2020-06-25 12:17:50.990505|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_Z21mysql_execute_commandP3THDb+0x3570) [0x558400d59c10]<br>2020-06-25 12:17:50.990510|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_Z11mysql_parseP3THDP12Parser_state+0x38d) [0x558400d5d41d]<br>2020-06-25 12:17:50.990515|C|20927|c4108700: mmap failed!!! in GRN_IO_SEG_REF(0x7f552f532520, 214, 1): Cannot allocate memory<br>2020-06-25 12:17:50.990527|A|20927|c4108700: [ii][chunk][merge] failed to allocate a source chunk: <vgram_terms.ftext4>: <"段">(2148099822): record:<58490799>, segment:<3507664>, size:<2533></div><div><br></div><div>2020-06-25 12:17:50.994603|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_ctx_log_back_trace+0x3a) [0x7f55c5c5a3fa]<br>2020-06-25 12:17:50.994610|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(+0x2ff76a) [0x7f55c5d6f76a]<br>2020-06-25 12:17:50.994614|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(+0x301d38) [0x7f55c5d71d38]<br>2020-06-25 12:17:50.994618|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_ii_update_one+0x67e) [0x7f55c5d7cace]<br>2020-06-25 12:17:50.994623|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_ii_column_update+0xc60) [0x7f55c5d86a90]<br>2020-06-25 12:17:50.994631|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_obj_default_set_value_hook+0x98) [0x7f55c5c6ae68]<br>2020-06-25 12:17:50.994635|A|20927|c4108700: /usr/lib/x86_64-linux-gnu/libgroonga.so.0(grn_obj_set_value+0x177b) [0x7f55c5c7abdb]<br>2020-06-25 12:17:50.994639|A|20927|c4108700: /usr/local/mysql/lib/plugin/ha_mroonga.so(_ZN10ha_mroonga17storage_write_rowEPh+0x934) [0x7f55f4089e04]<br>2020-06-25 12:17:50.994644|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_ZN7handler12ha_write_rowEPh+0x198) [0x5584008c9758]<br>2020-06-25 12:17:50.994648|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_Z12write_recordP3THDP5TABLEP9COPY_INFOS4_+0x638) [0x558400edb4a8]<br>2020-06-25 12:17:50.994652|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_ZN14Sql_cmd_insert12mysql_insertEP3THDP10TABLE_LIST+0x931) [0x558400edcd51]<br>2020-06-25 12:17:50.994656|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_ZN14Sql_cmd_insert7executeEP3THD+0xf2) [0x558400eddac2]<br>2020-06-25 12:17:50.994661|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_Z21mysql_execute_commandP3THDb+0x3570) [0x558400d59c10]<br>2020-06-25 12:17:50.994665|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_Z11mysql_parseP3THDP12Parser_state+0x38d) [0x558400d5d41d]<br>2020-06-25 12:17:50.994669|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_Z16dispatch_commandP3THDPK8COM_DATA19enum_server_command+0xdd2) [0x558400d5e322]<br>2020-06-25 12:17:50.994673|A|20927|c4108700: /usr/local/mysql/bin/mysqld(_Z10do_commandP3THD+0x220) [0x558400d5fa50]<br>2020-06-25 12:17:50.994680|e|20927|c4108700: [ii][buffer][merge] failed to merge chunk: <vgram_terms.ftext4>: <"段">(2148099822): chunk:<379>, n-chunks:<702></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">2020年5月19日(火) 9:33 Sutou Kouhei <<a href="mailto:kou****@clear*****">kou****@clear*****</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">須藤です。<br>
<br>
> 後者のデータを可能な限り、DBと更新クエリをコンパクト化し、<br>
> 別途手段にて共有させていただきます。<br>
> 少々時間がかかるかもしれません。<br>
<br>
この問題の再現作成用にちょっとしたスクリプトがあるのでそれを<br>
使えるかもしれません。<br>
<br>
<a href="https://github.com/groonga/groonga/blob/master/tools/copy-related-files.rb" rel="noreferrer" target="_blank">https://github.com/groonga/groonga/blob/master/tools/copy-related-files.rb</a><br>
を使うとDBの中の必要な部分だけコピーできます。これを使って更<br>
新処理を次のようにします。<br>
<br>
1. 元のDBから必要な部分だけをコピーする<br>
2. 更新データを保存する<br>
3. 通常の更新処理をする<br>
4. 問題が発生したら1.と2.が欲しかった情報<br>
<br>
あと、もしかしたら、問題発生のチェックにindex_column_diffを<br>
使えるかもしれません。<br>
<br>
ということでこんなスクリプトになります。<br>
<br>
reproduced=no<br>
if [ -d db.reproduced ]; then<br>
reproduced=yes<br>
fi<br>
if [ "${reproduced}" = "no" ]; then<br>
rm -rf db.copy<br>
ruby copy-related-files.rb \<br>
--destination=db.copy \<br>
--target=vgram_terms.description7<br>
db<br>
fi<br>
# 通常の更新用データ生成<br>
generate-load-data.sh > load.grn<br>
# 問題が発生したらここでブロックしてしまうかも<br>
groonga --log-file db/log --file load.grn db/db<br>
if [ "${reproduced}" = "no" ]; then<br>
n_broken_tokens=$(groonga db/db index_column_diff vgram_terms.description7 | jq '.[1][].token.value' | wc -l)<br>
if [ ${n_broken_tokens} -ne 0 -o grep -q "failed to decode" db/log ]; then<br>
echo "reproduced!"<br>
mv db.copy db.reproduced<br>
mv load.grn load.reproduced.grn<br>
fi<br>
fi<br>
<br>
<br>
In <<a href="mailto:CANM%2BHhdEFvSQUcbY7Bdi3wMQeSefPkB_Qez6k****@mail*****" target="_blank">CANM+HhdEFvSQUcbY7Bdi3wMQeSefPkB_Qez6k****@mail*****</a>><br>
"[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,<br>
Naoya Murakami <<a href="mailto:visio****@gmail*****" target="_blank">visio****@gmail*****</a>> wrote:<br>
<br>
> 村上です。<br>
> <br>
> 残念ながら後者ですね。<br>
> <br>
> 後者のデータを可能な限り、DBと更新クエリをコンパクト化し、<br>
> 別途手段にて共有させていただきます。<br>
> 少々時間がかかるかもしれません。<br>
> <br>
> 前者は複数のDBで同じ更新をずっと流してもあるDBでは起きて、<br>
> 他のDBでは起きないということが結構あるので、再現がなかなか<br>
> 難しそうなんですよね。<br>
> <br>
> 時間できたら検証環境作って、更新データをまとめて動的更新し<br>
> 続けて再現できないか試してみます。<br>
> <br>
> <br>
> 2020年5月19日(火) 6:49 Sutou Kouhei <<a href="mailto:kou****@clear*****" target="_blank">kou****@clear*****</a>>:<br>
> <br>
>> 須藤です。<br>
>><br>
>> これ、最近原因を調べている(けどまだわかっていない)問題な気<br>
>> がします。<br>
>><br>
>> >>> 現状、同じ更新をすれば、必ずfailed to decodeになるデータベースは用意できますが、<br>
>> >>> 参考になりますかね。<br>
>><br>
>> これは、次の2つのデータがあるということですか?<br>
>><br>
>> * 問題のない(エラーになる前の)DB<br>
>> * ↑に入れるとこのエラーが出る更新データ<br>
>><br>
>> であれば提供してもらえると助かります。<br>
>><br>
>> それとも次のデータですか?<br>
>><br>
>> * エラーになった後のDB<br>
>> * ↑に再度入れるとこのエラーが再発する更新データ<br>
>><br>
>> こちらでも提供してもらえると少し助かります。<br>
>><br>
>> エラーになった後のDBは入手できそうなのですが、再発用の更新デー<br>
>> タは入手できそうなので、1つデータが増えて助かります。<br>
>><br>
>><br>
>> In <<a href="mailto:CANM%2BHhcYaOJ7j-QyH%2B3oT****@mail*****" target="_blank">CANM+****@mail*****</a>><br>
>> "[groonga-dev,04804] Re: [ii][update][one] failed to decode / failed to<br>
>> merge chunk / failed to flush a bufferが出たときについて" on Mon, 18 May 2020<br>
>> 19:55:58 +0900,<br>
>> Naoya Murakami <<a href="mailto:visio****@gmail*****" target="_blank">visio****@gmail*****</a>> wrote:<br>
>><br>
>> > 村上です。<br>
>> ><br>
>> > 自己レスばかりですいません。。<br>
>> ><br>
>> > term_idはmax_idで&を取る仕様みたいで実際は171ですのでbufferは問題なさそうでした。<br>
>> > 以下のgrn_p_dec()内のunpackで失敗しているみたいなのでやはりチャンクがおかしそうですね。<br>
>> ><br>
>> <a href="https://github.com/groonga/groonga/blob/6866ef08d386e63a7a26bae8fdaeb8f15a840ed9/lib/ii.c#L2237" rel="noreferrer" target="_blank">https://github.com/groonga/groonga/blob/6866ef08d386e63a7a26bae8fdaeb8f15a840ed9/lib/ii.c#L2237</a><br>
>> ><br>
>> > 壊し方を再現できたらまたご連絡いたします。<br>
>> ><br>
>> > 2020年5月18日(月) 19:13 Naoya Murakami <<a href="mailto:visio****@gmail*****" target="_blank">visio****@gmail*****</a>>:<br>
>> ><br>
>> >> 村上です。<br>
>> >><br>
>> >> buffer_data->term->tidが2147483819でなぜか2GiBちょいですね。<br>
>> >> 実際のこれのlexiconのkey数は126447481で"9"というキーのlexicon上の_idは<br>
>> >> 171になりますが、bufferが壊れているのですかね。<br>
>> >><br>
>> >> > select vgram_terms --filter '_key == "9"' --output_columns _id,_key<br>
>> >><br>
>> >><br>
>> [[0,1589796398.446896,0.01889300346374512],[[[1],[["_id","UInt32"],["_key","ShortText"]],[171,"9"]]]]<br>
>> >><br>
>> >> やはりbufferが壊れるまでを再現できないと難しそうですかね。<br>
>> >><br>
>> >> 2020年5月18日(月) 18:12 Naoya Murakami <<a href="mailto:visio****@gmail*****" target="_blank">visio****@gmail*****</a>>:<br>
>> >><br>
>> >>> 村上です。<br>
>> >>><br>
>> >>> failed to decode / failed to merge chunk / failed to flush a<br>
>> bufferが出た場合、<br>
>> >>> 静的索引構築でチャンクを作り直すとエラーがでないようになるのですが、<br>
>> >>> このエラーはチャンクが壊れていることによるものでしょうか。<br>
>> >>><br>
>> >>> たまにマージができなくなってしまうときがあるのでチャンクの再作成を<br>
>> >>> しています。<br>
>> >>><br>
>> >>> 現状、同じ更新をすれば、必ずfailed to decodeになるデータベースは用意できますが、<br>
>> >>> 参考になりますかね。<br>
>> >>><br>
>> >>> 最近ようやくバージョンを上げたところで2年前ぐらいのGroongaのコードベースで<br>
>> >>> updateしたものも含まれると思います。<br>
>> >>><br>
>> >>> [ii][chunk][merge] failed to decode: <vgram_terms.description7>:<br>
>> >>> <"9">(2147483819)<br>
>> >>> [ii][buffer][merge] failed to merge chunk: <vgram_terms.description7>:<br>
>> >>> <"9">(2147483819): chunk:<987>, n-chunks:<9886><br>
>> >>> [ii][update][one] failed to flush a buffer: <vgram_terms.description7>:<br>
>> >>> <62108274>:<1>:<178>: term:<"96">, segment:<4917148>, free:<4>,<br>
>> >>> required:<16>: [ii][buffer][merge] failed to merge chunk:<br>
>> >>> <vgram_terms.description7>: <"9">(2147483819): chunk:<987>,<br>
>> n-chunks:<9886><br>
>> >>><br>
>> >>> こうなるまでを再現できなければ、難しいようであれば再作成してしまいます。<br>
>> >>><br>
>> >>> 以上、よろしくお願いします。<br>
>> >>><br>
>> >>><br>
>><br>
>> _______________________________________________<br>
>> groonga-dev mailing list<br>
>> <a href="mailto:groon****@lists*****" target="_blank">groon****@lists*****</a><br>
>> <a href="https://lists.osdn.me/mailman/listinfo/groonga-dev" rel="noreferrer" target="_blank">https://lists.osdn.me/mailman/listinfo/groonga-dev</a><br>
>><br>
<br>
_______________________________________________<br>
groonga-dev mailing list<br>
<a href="mailto:groon****@lists*****" target="_blank">groon****@lists*****</a><br>
<a href="https://lists.osdn.me/mailman/listinfo/groonga-dev" rel="noreferrer" target="_blank">https://lists.osdn.me/mailman/listinfo/groonga-dev</a><br>
</blockquote></div>