[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 メーリングリストの案内