Kouhei Sutou
kou****@clear*****
2015年 8月 24日 (月) 22:47:02 JST
須藤です。 In <20150****@orega*****> "[groonga-dev,03419] Re: PGROO****@0*****で障害(?)発生" on Mon, 24 Aug 2015 11:06:59 +0900, 高見 直輝 <takam****@orega*****> wrote: >> INSERT文ではデータを書き込むためにロックを獲得する必要があり >> ます。ロックを獲得できない場合はロックを獲得できるまで(デフォ >> ルトでは結構長い時間)がんばります。その間は処理が止まるので >> いつまでも終了しません。 > > “デフォルトでは”ということは、設定の変更が可能なのでしょうか? Groongaレベルでは変更が可能ですが、PGroongaレベルでは変更で きません。 でしたが、さっきpgroonga.lock_timeout変数で変更できるように しておきました。 タイムアウトするまでの時間の数え方が少し面倒なので説明します。 多くの場合、タイムアウトというとタイムアウトするまでの時間を 指定しますが、Groongaは何回チャレンジして獲得できなかったら タイムアウトとするかという回数を指定します。 1回のチャレンジ毎に1ミリ秒sleepするので、1秒でロックを獲得で きなかったら諦めるようにするなら次のように1000を指定します。 SET pgroonga.lock_timeout = 1000; 少し頑張れば1回のチャレンジ毎にどのくらいsleepするかをカスタ マイズすることもできるのですが、これまで需要がなかったのでカ スタマイズできるようにはなっていません。おそらく、これからも 需要はない気はしています。 > 当方としては、ある程度待って駄目ならPostgresのエラーとして検知できるのが望ましいのですが、 > このような設定は可能でしょうか? 前述の説明の通りなので、適切な値をpgroonga.lock_timeoutに設 定すると実現できます。 ロックを獲得できないエラーになったからといって書き込みできる ようになるわけではないという点に注意してください。根本的な問 題はそこなので、そちらの解決をしないと一時しのぎになってしま います。 もちろん、被害を抑えるという意味では効果はあるので、その観点 での使用は効果的だと思います。 > 検索処理ではロックを取得しない(エラーの発生原因にはならない)という認識で良いですか? はい。 > 現在、対象のテーブルに対して実行している操作は、検索・追加以外では以下の3つのみです。 > ・テーブルダンプ > ・VACUUM(AUTOVACUUM) > ・ANALYZE > この中にロックを取得する処理は有りますでしょうか? たぶん、VACUUMだけです。 テーブルダンプはpg_dumpのことですよね?ダンプの中には元デー タとインデックス定義しか含まれないので、PGroongaに書き込み要 求はいかないはずです。 ANALYZEも読み込みだけで書き込みはないはずなのでロックも必要 ないはずです。 -- 須藤 功平 <kou****@clear*****> 株式会社クリアコード <http://www.clear-code.com/> Groongaベースの全文検索システムを総合サポート: http://groonga.org/ja/support/ パッチ採用 - プログラミングが楽しい人向けの採用プロセス: http://www.clear-code.com/recruitment/ コードリーダー育成支援 - 自然とリーダブルコードを書くチームへ: http://www.clear-code.com/services/code-reader/