[pgcluster: 154] ユーザ関数のレプリケート

Masanari Ishida ishida @ credist.co.jp
2004年 2月 24日 (火) 16:45:57 JST


お世話になります。石田と申します。

PL/pgSQLで更新系の処理が入っている関数を2箇所から実行すると
フリーズ(?デッドロック(?))したような状態になります。
PGClusterではまだ考慮されていないのでしょうか?

構成とテストした内容は以下のとおりです。

PGCluster1.0.6bを使用し、以下のように構築しました。
RP1−−−レプリケーションサーバ/デバッグモードで起動
CL1-5432−−−クラスタサーバ1/port5432で起動
CL1-5434−−−クラスタサーバ1/port5434で起動
CL1-5436−−−クラスタサーバ1/port5436で起動


この構成で以下のようなSELECTとINSERTのあるテスト用のPL/pgSQL
の関数を作成しました。

create function test_func(integer,integer) returns boolean as '
 DECLARE
  i_fld1 integer;
 BEGIN
  select fld1 into i_fld1 from tbl1 where fld1=$1;
  IF i_fld1 is not null THEN
        RETURN false;
  END IF;
  insert into tbl1 (fld1) values ($2);
  RETURN true;
 END;
' language 'plpgsql';

2箇所から
select test_func(<適当な数値>,<適当な数値>)
を1000回繰り返すように実行しました。
(2箇所といってもマシンがないので2つターミナルを開いて
 クラスタサーバ1から実行しましたが・・・)
例:
  test_funcを1000回繰り返す--test_1000_5432.sql/test_100_5434.sql

  $ psql -p 5432 -h CL1-5432 -c ./test_1000_5432.sql test_db

  $ psql -p 5434 -h CL1-5434 -c ./test_1000_5434.sql test_db

そうするとフリーズ(?デッドロック(?))したような状態になりました。

また、INSERTのみの関数の場合も同様です。SELECTのみの場合は問題
ありませんでした。

ちなみにPGClusterを使用しないpostgreSQL7.3.4では上記のように2箇所
から実行しても問題なく処理できました。

回避できない場合は、PL/pgSQLでの関数の作成をやめることを検討しなけ
ればいけないので宜しくお願いします。

----------------------------------------
Masanari Ishida < ishida @ credist.co.jp >
----------------------------------------




pgcluster メーリングリストの案内