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

Yoshiyuki Asaba y-asaba @ sraoss.co.jp
2007年 7月 11日 (水) 11:22:43 JST


浅羽です。

From: Yoshiyuki Asaba <y-asaba @ sraoss.co.jp>
Subject: [pgpool-general-jp: 196] Re: 大量のINSERTを行うとデッドロックする
Date: Tue, 10 Jul 2007 14:18:00 +0900 (JST)

> pgpool では今のところデッドロックエラーについて何も考慮していないため、
> 
>   * node-1 ではデッドロックによってトランザクションがアボート
>   * node-2 ではロックが獲得できた
> 
> という不整合が発生しているようです。
> 
> そこで、マスタからデッドロックエラー(エラーコード: 40P01)が返ってきた
> 場合には、他のノードにはトランザクションがエラーになるようなクエリを送
> るように修正しようかと考えています。

すべてのブランチに修正を入れました。手元の環境ではフェイルオーバが発生
しないようになりました。以下のように pgbench を使って確認しました。
もし可能であれば、五十嵐様や他の方の環境でも発生しないかご確認いただけ
ると助かります。

  % cat a.sql
  begin;
  lock table t in row exclusive mode;
  lock table t in share row exclusive mode;
  insert into t values (1);
  end;

  % pgbench -n -C -c 2 -t 10 -f a.sql -p 9999 x
  Client 1 aborted in state 2: ERROR:  deadlock detected
  DETAIL:  Process 23834 waits for ShareRowExclusiveLock on relation 149612 of database 149611; blocked by process 23840.
  Process 23840 waits for ShareRowExclusiveLock on relation 149612 of database 149611; blocked by process 23834.
  transaction type: Custom query
  ...

pgpool をお使いであれば、

 % cvs -d :pserver:anonymous @ cvs.pgfoundry.org:/cvsroot/pgpool login
 % cvs -d :pserver:anonymous @ cvs.pgfoundry.org:/cvsroot/pgpool checkout pgpool

で取得することができます。

なお、[pgpool-general-jp: 187] の 1. を実装したのちに、今月中にでも
pgpool 3.3.1 か 3.4 でリリースを検討しています。
--
Yoshiyuki Asaba
y-asaba @ sraoss.co.jp


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