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 など