14. clustered のコードを読む6 - PostgreSQL のソースコードを読む
swap_relation_files で何が swap されてテーブルの実体が入れ替わるかを見ていく。
Form_pg_class.relfilenode を swap することが何を意味するか。
Form_pg_class
pg_class は system relation の relation 定義らしい。
Oid relfilenode; /* identifier of physical storage file */
relfilenode の実体が分からない。以下のような記述が見られるので RelationGetRelid を見てみる。
relation->rd_rel->relfilenode = RelationGetRelid(relation);
うーん。分からない。色々なドキュメントを読んでいると OS 寄りのデータを持っているらしい。
test=# select relname , relfilenode from pg_class where relname like 'person%' order by 1; relname | relfilenode -------------+------------- person | 16431 person_age | 16438 person_pkey | 16437
ああ。これはもしかして。
% ls -la /var/lib/postgresql/8.3/main/base/16385 -rw------- 1 postgres postgres 682672128 2009-02-23 16:19 16431 -rw------- 1 postgres postgres 0 2009-02-23 16:14 16434 -rw------- 1 postgres postgres 8192 2009-02-23 16:14 16436 -rw------- 1 postgres postgres 224641024 2009-02-23 16:19 16437 -rw------- 1 postgres postgres 224641024 2009-02-23 16:20 16438
うわ。ファイル名そのままか。なるほど。
つまりファイル名を swap していると。ファイル名を Oid (数字)で持っていてそのまま使っているのか。
todo
- MemoryContext
- cluster にもどり heap の copy など