9. clustered のコードを読む - PostgreSQL のソースコードを読む
4.ソース読みに慣れよう を参考に CLUSTER コマンドの行く末を見ていく。
おそらく goal は commands/cluster.c だと思うが、そこにいたるまで何か特別な事が起きていないかをチェックしよう。
DML 以外の SQL は ProcessUtility で処理されて、switch/case で
case T_ClusterStmt: cluster((ClusterStmt *) parsetree, isTopLevel); break;
と cluster.c の cluster() へ。
cluster
CLUSTER コマンドの入力は table名、index 名。
ざっくりコメントから読んでいこう。
- cluster コマンドは複数のテーブルを一度に扱う事もあるよ。そのため1つのトランザクションで作業を完結する事は難しい。対象となる全テーブルに排他ロックをかけるよ。
- 上の問題を解消するために各 relation の clustering はそれぞれ独立した transaction で実行するようにするよ
- それぞれに separate memory context を用意する(理解していない)
- 同時に誰かがデータを消したり、別の cluster コマンドを発行していないかチェックするよ
- 1つのテーブルを clustering するだけならそんなオーバーヘッドはないよ
1つのテーブルだけなら排他ロックをかけないとも読めるけど、マニュアルには「ACCESS EXCLUSIVE Lock」と書いてあるから違うのかな。コード読んだらロックしてた。
- table を AccessExclusiveLock
- table の OID 取得
- owner check
- index の OID 取得
- cluster_rel に突入
続きは明日。
所感
- なぜ排他ロックが必要かは明日くらいに判明しそうだ。