12. clustered のコードを読む4 - PostgreSQL のソースコードを読む
RelFileNode を見る
RelFileNode は Relation に物理的にアクセスするために必要な情報を提供する。
RelFileNode は 3 つの Oid を保持
- spcNode :テーブルスペース
- dbNode : データベース
- relNode : リレーション
- pg_class.relfilenode に相当
SMgrRelation を見る
実体は SMgrRelationData 構造体。
保持しているのは
- RelFileNode smgr_rnode; : 上記の RelFileNode
- struct SMgrRelationData **smgr_owner; :オーナー
- int smgr_which
- どの storage を使うか。smgrsw 配列の index 。
- md.c しかないので 0 しかない。
- struct _MdfdVec *md_fd;
- md 依存のデータがここにあるのはどうよ。せめて void* とかに。
heap desc
heap desc というのは TupleDesc のことだった。TupleDesc とはテーブルのカラムの定義のかたまり。
予想通りの構造。
typedef struct tupleDesc { int natts; /* number of attributes in the tuple */ Form_pg_attribute *attrs; /* attrs[N] is a pointer to the description of Attribute Number N+1 */ TupleConstr *constr; /* constraints, or NULL if none */ Oid tdtypeid; /* composite type ID for tuple type */ int32 tdtypmod; /* typmod for tuple type */ bool tdhasoid; /* tuple has oid attribute in its header */ int tdrefcount; /* reference count, or -1 if not counting */ } *TupleDesc;
rel cache
heap 作成時に、RelationBuildLocalRelation の戻り値として返ってくる rel cache とは何か?
型は Relation 。なぜ cache と呼ばれているかはおいておいて、Relation の構造を見ていく。
Relation はテーブルのメタデータ。構造体メンバが多すぎるので目につくものをピックアップ。
- current insertion block
- リファレンスカウント
- 各種フラグ
- class
- tuple descriptior
- oid
- index の oid list
- lock のための構造
- MemoryContext (これ何?)
- Trigger Desc
などなど。
cluster 作成時の filenode の交換とは?
swap_relation_files で何が起こるか。
- 2つの Relation の Oid から、それぞれの Form_pg_class を取り出す
- Form_pg_class にある以下のメンバを swap する
- relfilenode
- reltablespace
- reltoastrelid
なぜこれらを swap するとテーブルが入れ替わった事になるのか分からないのでそれぞれ見ていく。
relfilenode
Form_pg_class.relfilenode をみると
Oid relfilenode; /* identifier of physical storage file */
今日は時間切れ。続きは明日以降。
todo
- MemoryContext
- cluster にもどり heap の copy など