[Senna-dev 376] Re: UPDATEでデッドロック?発生について

Back to archive index

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*****>



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