11. clustered のコードを読む3 - PostgreSQL のソースコードを読む

heap とは?

結局 heap とはテーブルのデータがおかれる場所である以上の情報は見つけられなかった。heap ページと書かれているものもあるのでDatabase Management Systemsにあった通り「ファイル上の page に格納された unordered な tuple を保持するデータ構造」と理解し先に進もう。

temp heap の割当て

理解が正しければ、temp heap は実際にファイル上に結びつくデータのはず。処理を追ってみる。

  1. make_new_heap(tableOid, NewHeapName, tableSpace);
  2. tableOid(古いテーブル)の heap_open を実行
  3. heap descriptor を取得
  4. tuple descriptor をコピー
  5. oldHeap の option を newHeap でも使うので取得
  6. heap_create_with_catalog で heap を作成

heap_create_with_catalog

まずは大物から、heap_create_with_catalog を見ていく。heap.c に本体がある。

  1. いくつか sanity check や通常の check
  2. heap_create で relation と物理ファイルを作成する
  3. 必要なら type の作成
  4. テーブルスペースが消えるときにこのテーブルが消えるように目印
  5. done

heap_create

uncataloged な heap を作る。つまりいろいろな登録作業などは、外でやってねと。

  1. relation の種類で実際に storage が必要かどうか分岐
    1. view, composite_type は storage 不要
  2. RelationBuildLocalRelation で relcache entry を作る。(これ何?)
  3. storage と結びつける必要があれば smgrcreate(rel->rd_smgr, rel->rd_istemp, false); で作成
    1. smgr とは storage manager の略

smgrcreate

SMgrRelation を入力に storage に file を作る。

  1. そのテーブルスペースを初めて使うなら必要な directory を作る
  2. (*(smgrsw[reln->smgr_which].smgr_create)) (reln, isRedo); のように対応する storage manager の smgr_create が呼ばれる。
  3. abort の際にこのファイルが消えるように登録。

sgmr_create で何が起こるか

storage manager の README に

  • 昔は storage manager はたくさんあった
  • 今は magnetic disc しか残っていない
  • md.c がその実体。

md.c を読み進める。

md.c

何を仕事としているか?

  • fd を自身の pool で管理
  • OS がサポートするサイズ以上のファイルを分割管理

SMgrRelation に fd が store されるみたい。
mdcreate(SMgrRelation reln, bool isRedo) が読むべきもの。

  1. fd = PathNameOpenFile(path, O_RDWR | O_CREAT | O_EXCL | PG_BINARY, 0600);
  2. reln->md_fd->mdfd_vfd = fd; で格納。

というわけで物理ファイル作成にたどりついた。

おまけ

PostgreSQL は各デバイス毎に storage manager を柔軟に変更できるように仕組みが作られている。
しかし現時点では Magnetic disk の storage manager である md.c しかない。(つまり1種類のみ)
md.c をまだ読み進めていないので何とも言えないが SSD 用の storage manager とかはありかもしれないと思った。

ずっと昔には別の manager も存在していた。

At Berkeley there were also managers for the Sony WORM optical disk jukebox and persistent main memory,
but these were never supported in any externally released Postgres,nor in any version of PostgreSQL.

todo

  • cluster にもどり heap の copy など
  • SMgrRelation を見る
  • heap descriptor
  • tuple descriptor
  • relcache
  • filenode って何?