[pgpool-general-jp: 93] VACUUM時のinsert_lockについて

YOSHIDA Kaname kaname @ conga.jp
2007年 2月 21日 (水) 14:22:41 JST


吉田と申します。

普段、postgresqlを冗長化する手段としてpgpoolを使用させて頂いております。
一つ困っていることがありまして、識者の方々の意見を伺いたくメール致しました。

現在pgpool(pgpool-I)でload_balance_mode=true, replication_mode = true
で使用しております。また、replication_strict = true, insert_lock = trueの
設定になっています。

VACUUM時にSHARE UPDATE EXCLUSIVEのロックがかかりますが、
これとinsert_lockのかけるSHARE ROW EXCLUSIVEが衝突して
VACUUM中にINSERTができません。
(VACUUMは、pgpool経由ではなくそれぞれのpostgresqlで実行しています)

insert_lockでテーブルをロックするのは、シーケンスがずれないように一つの
トランザクションのみにINSERTを限定するのが理由だと理解しましたが
合っていますでしょうか?
もしそのような理由だとすれば、対象のテーブル自身にロックをかける必要はなく、
テーブル毎に共通のロック用テーブルを用意してそれを排他制御のフラグとして
利用すればいいのではないかと考えました。

以下のパッチのように、ロックをかけるのはロック用のテーブルにして、
各テーブル(ex: tablename)にロック用のテーブル(ex: lock_tablename)を用意しました。

--- pool_process_query.c~       2007-02-03 13:22:21.000000000 +0900
+++ pool_process_query.c        2007-02-21 14:15:34.000000000 +0900
@@ -3261,7 +3261,7 @@
                return POOL_CONTINUE;
        }

-       snprintf(qbuf, sizeof(qbuf), "LOCK TABLE %s IN SHARE ROW
EXCLUSIVE MODE", table);
+       snprintf(qbuf, sizeof(qbuf), "LOCK TABLE lock_%s IN SHARE ROW
EXCLUSIVE MODE", table);

        /* if we are not in a transaction block,
         * start a new transaction

これでVACUUM時にロックがかかるテーブルとinsert_lockがロックをかける
テーブルが違うので、VACUUM時のINSERTがロックされる問題が解決されると
思いますが、このようなアプローチは間違っていますでしょうか?

何か他に良いアイデアなどがございましたら、ご教授下さいますようお願いいたします。


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