[pgpool-general-jp: 206] Re: 大量のINSERTを行うとデッドロックする

Yoshiyuki Asaba y-asaba @ sraoss.co.jp
2007年 7月 14日 (土) 00:35:40 JST


浅羽です。

From: maeda @ motion.ne.jp
Subject: [pgpool-general-jp: 205] Re: 大量のINSERTを行うとデッドロックする
Date: Fri, 13 Jul 2007 11:24:57 +0900

> 修正頂いたpgpoolで再度insertを実行いたしましたが、
> 残念ながら縮退が発生してしまいました。
> また、前回までは縮退の場合、セカンダリがdownしていたのですが、
> 今回はマスターがdownしております。

ログを拝見しましたが、もしかしたら修正前のバージョンをお使いの可能性が
ありますので、ソースコードのあるディレクトリで以下のコマンドを実行して
いただけないでしょうか?

  % grep Header pool_process_query.c

> <SecondaryDB postgres.log>
省略
> postgres[29191]: [46963-1] LOG:  statement: LOCK TABLE lock_test IN SHARE ROW EXCLUSIVE MODE
> postgres[29191]: [46964-1] ERROR:  deadlock detected
> postgres[29191]: [46964-2] DETAIL:  Process 29191 waits for ShareRowExclusiveLock on relation 170406893 of database 170405435; blocked by process 29343.
> postgres[29191]: [46964-3]     Process 29343 waits for
> ShareRowExclusiveLock on relation 170406893 of database 170405435;
> blocked by process 29191.

セカンダリでもデッドロックを検出しています。修正後の pgpool ではセカン
ダリではデッドロックが発生せず、代わりに以下の構文エラーが記録されます。

  ERROR:  syntax error at or near "send" at character 1
  STATEMENT:  send invalid query from pgpool to abort transaction

マスタからデッドロックが返ってきたトランザクションはセカンダリに LOCK
TABLE 文をそのまま投げるのではなく、

  "send invalid query from pgpool to abort transaction"

という文字列を投げてトランザクションをエラーにするようにしました。
psql を 2 つ立ちあげて

  A: BEGIN:
  B: BEGIN;
  A: LOCK TABLE t1 IN SHARE ROW EXCLUSIVE MODE;
  B: LOCK TABLE t2 IN SHARE ROW EXCLUSIVE MODE;
  A: LOCK TABLE t2 IN SHARE ROW EXCLUSIVE MODE;
  B: LOCK TABLE t1 IN SHARE ROW EXCLUSIVE MODE;

を実行すると、上記の syntax error がセカンダリに記録されるでしょうか?
--
Yoshiyuki Asaba
y-asaba @ sraoss.co.jp


pgpool-general-jp メーリングリストの案内