[pgsql-jp: 31784] Re: PGCluster-1.0.6リリースしました

Wataru Oguro oguro @ zenrin-datacom.net
2003年 12月 12日 (金) 22:14:55 JST


oguroです。

三谷様、リリースお疲れ様でした。
早速パッチを当てて実験してみました。

-------
begin;
update test set a = 'test2' where a = 'test2';
commit;
-------
というSQLをPHPに組み込み、アパッチベンチで実行しました。

*今まではクラスタサーバで2台同時にpsql -fで実行していましたが、アプリで
使用することを想定してCGIでの実行を行ないました。

$ab -c 4 -n 1 http://localhost/testcgi/test.cgi

*上記は、4同時セッション、実行回数1という認識で行なっています。
 ここの認識が間違ってたら申し訳ないです。。。。

テーブルには1件しかデータは入っていません。
ですので、4つのセッションが同時に1件のレコードを更新することになるのです
が、あるタイミングで、レプリケーションサーバからのクエリがデッドロックを
おこすようです。。。

通常のデッドロックは、検出された後、ロックの元となるトランザクションのい
ずれかをアボートされますが(ログにもでますよね)、レプリケーションサーバ
からクラスターサーバへ送られたクエリーが元のデッドロックは検出できない&
解除できないようです。(私なりの考察なので、間違ってたら指摘してください
ませ)

なぜそう見えるかというと、レプリケーションサーバが実行中のトランザクショ
ンがidel状態のままで、それ以降のクエリーが待ち状態となっているためです。
この状態は待っていても改善はされません。
レプリケーションサーバの再起動を行うか、クラスタサーバを強制的に停止しな
いとダメなようです。
後者を行なうと次回立ち上げ時はリカバリモードで立ち上げないとならないので
すが。。。

レコードロックがかかっているので対象のレコードには変更を加えられません
が、テーブルへは追加・削除が行なえます。

これが例えば
-------
begin;
lock table
update test set a = 'test2' where a = 'test2';
commit;
-------
というSQLだったとすると、テーブルロックがかかるため(EXCLUSIVEロック)
テーブルへのアクセスができなくなってしまいます。

クラスタサーバが自身に掛けるロックと、レプリケーションサーバが同期のため
に掛けるロックがバッティングしているような気がしてます。。。。

1.0.5からあった現象ですが、この問題を解決するのは難しそうですね。

以上 私なりの検証報告です。




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