Tasuku SUENAGA
a****@razil*****
2006年 10月 25日 (水) 12:29:28 JST
末永です。 gdbのログ提供ありがとうございます。 大変参考になりました!!! > sen_index_lock (i=0x0, timeout=-1) at index.c:895 内部でインデックスファイルを開くのに失敗し、 その結果、存在しないインデックスに対してロック処理を行おうとして 失敗してロックしているようです。 エラーハンドリングを改善して、 そもそも更新不可能な状態にならないようにしたいと考えております。 さらには、インデックス登録時に 落ちる現象そのものも修正したいと思っていますが、 どの関数で落ちているかなどの情報があれば 修正しやすくなります。 sino****@valle***** wrote: > こんにちは、篠原です。 > # しょぼいWebメーラを使っているので、Message-IDは、切れてしまいます。 > # すいません。 > > 昨日から、senna-0.8.2を試していますが、 > 登録中に、MySQLが落ちて、更新中のSennaのインデックスは、 > 100% 更新不可能になる現象にみまわれました。 > > その度ににインデックスをDROP & CREATE で作成しなおしていますが > けっこう大きいテーブルなので時間がかかってしまい大変です。 > > この更新不可能な状態はどのような状況なのかgdbで調べてみました。 > (注意 gdbはど素人です。) > > sen_index_lock内で、ループを繰り返しているようです。 > 恐らく異常終了した時にロックしたままの状態で終わっている > 為だと思いますが、このロック状態を解除する方法はないでしょうか? > > そもそも、MySQLごと異常終了するのが問題とは思いますが、 > それは、ゼロには、ならないと思いますのでリカバリ対策を > 考慮頂けないでしょうか? > > > ----(gdb ここから)---- > Breakpoint 1, 0x083a4ab6 in ft_sen_index_add () > (gdb) s > Single stepping until exit from function ft_sen_index_add, > which has no line number information. > sen_index_upd (i=0x8a723a0, key=0xa14a5d68, oldvalue=0x24 <Address 0x24 out of bounds>, > newvalue=0x8ab3ed8 "...(ここは少し切り取りました。) > : > at index.c:1032 > 1032 if ((rc = sen_index_lock(i, -1))) { > (gdb) > 1029 { > (gdb) > 1032 if ((rc = sen_index_lock(i, -1))) { > (gdb) > sen_index_lock (i=0x0, timeout=-1) at index.c:895 > 895 for (count = 0;; count++) { > (gdb) > 893 { > (gdb) > 897 SEN_ATOMIC_ADD_EX(&i->keys->header->lock, 1, lock); > (gdb) > 904 return sen_success; > (gdb) > 899 SEN_ATOMIC_ADD_EX(&i->keys->header->lock, -1, lock); > (gdb) > 900 if (!timeout || (timeout > 0 && timeout == count)) { break; } > (gdb) > 901 usleep(1); > (gdb) > 902 continue; > (gdb) > 901 usleep(1); > (gdb) > 902 continue; > (gdb) > 897 SEN_ATOMIC_ADD_EX(&i->keys->header->lock, 1, lock); > (gdb) > 904 return sen_success; > (gdb) > 899 SEN_ATOMIC_ADD_EX(&i->keys->header->lock, -1, lock); > (gdb) > 900 if (!timeout || (timeout > 0 && timeout == count)) { break; } > (gdb) > 901 usleep(1); > (gdb) > 902 continue; > (gdb) > 901 usleep(1); > (gdb) > 902 continue; > (gdb) > 897 SEN_ATOMIC_ADD_EX(&i->keys->header->lock, 1, lock); > (gdb) > 904 return sen_success; > (gdb) > 899 SEN_ATOMIC_ADD_EX(&i->keys->header->lock, -1, lock); > (gdb) > 900 if (!timeout || (timeout > 0 && timeout == count)) { break; } > (gdb) > 901 usleep(1); > : > -----(gdb ここまで)---- > > ---- > sino --- Tasuku SUENAGA <a****@razil*****>