Kouhei Sutou
kou****@clear*****
2015年 7月 15日 (水) 22:23:56 JST
須藤です。 In <20150****@orega*****> "[groonga-dev,03363] Re: PGROONGAで障害発生" on Wed, 15 Jul 2015 15:33:38 +0900, 高見 直輝 <takam****@orega*****> wrote: > 今回、再現したときのログをpgroonga.logから取得しましたので以下に記します。 ありがとうございます。 前後のログも含めてすべて提供してもらったので原因がわかりまし た。複数のプロセスで開いているファイルを削除しようとしている からです。(Windowsでは他のプロセスが開いているファイルを削 除しようとすると「Permission denied」というかアクセスエラー になります。) ログから > 2015-07-14 18:03:00.976000|n| grn_fin (5) > 2015-07-14 18:03:00.976000|n| grn_fin (0) というように複数の接続が張られていることがわかったのがヒント になりました。 PostgreSQLは接続毎にプロセスを起動するので 1. 接続Aでテーブル作成 * 接続Aはこのテーブルのファイルを開く 2. 接続Bで↑が作成したテーブルを削除 * 接続Aが開いたままのファイルを削除しようとしてエラー という状態になりえます。 で、テーブルを削除する機会はVACUUMされたタイミングになります。 VACUUMは手動で実行することもできますが、自動でも動きます。 https://www.postgresql.jp/document/9.4/html/routine-vacuuming.html#AUTOVACUUM おそらく、高見さんの環境で発生しているのはちょうど自動で実行 されているからでしょう。レコードを追加すると発生しなくなる、 というのもその影響で自動でVACUUMが実行されなくなるからです。 どうやって直すとよいのかしら。。。 どのプロセスもファイルを開いていないことを保証した状態で削除 しないといけないんだけど。。。バックグラウンドワーカープロセ スを作ってそっちで削除するようにすればいいのかしら。 大げさだなぁ。