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

アーカイブの一覧に戻る

sino****@valle***** sino****@valle*****
2006年 10月 24日 (火) 22:54:53 JST


こんにちは、篠原です。
# しょぼい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





Senna-dev メーリングリストの案内
アーカイブの一覧に戻る