[pgsql-jp: 28033] Re: DB FILE (Re: )

Atsuki Ito atsuki @ pst.fujitsu.com
2002年 11月 19日 (火) 19:34:05 JST


富士通プライムソフトテクノロジの伊藤です。

 たまたまソースを読んでいたので。

On Tue, 19 Nov 2002 16:53:15 +0900
Naofumi Kondoh <nkon @ shonan.ne.jp> wrote:

> postgres のソースを読んでないので心配なのは、Work File など
> 一時的に生成されるファイル類と、TOAST 関係です。
> 
> TOAST は、pg_class の reltoastrelid で、それは必ず
> pg_toast_* という relname で、reltoastrelid = relfilenode
> になるものと考えていて大丈夫でしょうか?。

TOASTのrelnameは『pg_toast_*』と考えて良いと思います。
src/backend/catalog/catalog.c:99
にあるIsToastRelationName()で杉田さんの考えている判断をしてますので大丈
夫だと思います。
(実際に名前を作成しているのは、src/backend/commands/command.c:1766)

あと、pg_classのreltoastrelidですが以下で設定しています。
src/backend/commands/command.c:1843
ここでtoast_relidなるものを設定していますが、これは同ソースの:1799で作成
したTOASTのOidですのでrelNodeと考えても特に差し支えは無いと思います。


> Work File も base/DB名のOID/  の下にできますね。
> これの命名規則がわからなかったので、ディレクトリ一覧と
> pg_class で取得した  relfilenode の両方を付き合わせて
> 表示しています。Work File で、sub directory は作らないものと
> 勝手に想定してしまったけど、まずかったでしょうか?。

私も細かいところまで把握してませんがRelationファイルのパス名作成等は
src/backend/catalog/catalog.c が一手に引き受けているようです。

/*
 * relpath          - construct path to a relation's file
 *
 * Result is a palloc'd string.
 */

char *
relpath(RelFileNode rnode)
{
    char       *path;

    if (rnode.tblNode == (Oid) 0)       /* "global tablespace" */
    {
        /* Shared system relations live in {datadir}/global */
        path = (char *) palloc(strlen(DataDir) + 8 + sizeof(NameData) + 1);
        sprintf(path, "%s/global/%u", DataDir, rnode.relNode);
    }
    else
    {
        path = (char *) palloc(strlen(DataDir) + 6 + 2 * sizeof(NameData) + 3);
        sprintf(path, "%s/base/%u/%u", DataDir, rnode.tblNode, rnode.relNode);
    }
    return path;
}


> ソースコードきちんと読まないで質問ばかりで申し訳ない。

いえいえ、たまたま読んでましたので。
私が詰まった時はフォローお願いします。

------------------------------------------------------------
伊藤 淳樹(あつき)  atsuki @ pst.fujitsu.com
(株)富士通プライムソフトテクノロジ http://www.pst.fujitsu.com/




pgsql-jp メーリングリストの案内