[pgcluster: 791] 同時に2つのセッションからアクセスすると無応答になる

ASP森山 和宏 moriyama @ allforsp.co.jp
2005年 6月 24日 (金) 12:11:21 JST


はじめまして、森山と申します。

現在PGCluster 1.3.0c と 1.1.1a のフルパッケージ版を
試させていただいています。

OS:Red Hat Linux release 9 (Shrike)
    Kernel 2.4.20-8 on an i686

構成
    LBサーバ 1
    クラスタDB 3
    RPサーバ 1
テストのため1台のサーバで全部を起動しています。
1.3.0c と 1.1.1a は交互に起動しテストしました。

構成後レプリケーション確認のため
マスタDBだけに1レコードを発生させ、残り2つのクラスタDBを-Rをつけて起動し
正常にマスタDBよりレプリケーションされることは確認しました。
LBサーバからも1レコードを発生させ、すべてのクラスタサーバにデータが登録
されるのを確認しました。


ロックを含むDB更新を1実行で1000回繰り返す処理をPHPより実行したところ
1セッションでは正常に終了するが、2セッション同時に実行すると、必ず無応答に
なってしまいました。
現象は、ロードバランサ経由でも、2つのクラスタサーバに直接つないでも同様に無応答になりました。

処理の内容はこんな感じです

DB接続
 トランザクション開始
 テーブルロック
 テーブル内のカウント番号の最大値を取得するSQLを実行
 カウントに+1
 レコードをインサート
 トランザクション終了
 (トランザクション開始から終了を1000回繰り返し)
DB切断

試しに、TeraTermにてDBを2セッション開き下記の順番でDBにコマンドを
入力したところ必ず無応答になりました。

セッション1:S1
セッション2:S2

S1:BEGIN;
S2:BEGIN;
S1:LOCK TABLE A;
S1:INSERT INTO A(no) VALUES (1);
S2:SELECT * FROM A;←(無応答:これは正しい)
S1:ROLLBACK;←(無応答:ここがおかしい)
S2:CTRL+C でSELECTをキャンセル(キャンセルメッセージは帰ってくるが無応答)

この状態でPSコマンドを実行してみると下記感じで処理が止まっています。
また、この状態をしばらく放置してもロック解除はされないようです。

23511 pts/1    S      0:00 ./bin/psql -p 5432 cl_testdb
23513 pts/4    S      0:00 postgres: postgres cl_testdb [local] idle in 
transaction
23515 pts/3    S      0:00 ./bin/psql -p 5432 cl_testdb
23517 pts/4    S      0:00 postgres: postgres cl_testdb [local] SELECT 
waiting
23521 pts/4    S      0:00 postgres: postgres cl_testdb 192.168.1.103 idle 
in transaction
23524 pts/4    S      0:00 postgres: postgres cl_testdb 192.168.1.103 idle 
in transaction
23535 pts/4    S      0:00 postgres: postgres cl_testdb 192.168.1.103 SELECT 
waiting
23536 pts/4    S      0:00 postgres: postgres cl_testdb 192.168.1.103 SELECT 
waiting

何か回避策は有りますでしょうか。

以上、よろしくお願い致します。






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