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