メインルーティンを攻略!
main.cをさらう
最終回の今回はメインルーティンのソースコード(メインとは言っても「こういう条件で仕事をせい!」と言うだけで、一生懸命働くのは通常postgres.cによるプロセスなのですが)を中心に追うことで、PostgreSQLの理解を深めたいと考えます。
では、早速src/main/main.c ソースコード内のコメントを上から順に追っていきましょう。
This does some essential startup tasks for any incarnation of postgres (postmaster, standalone backend, or standalone bootstrap mode) and then dispatches to the proper FooMain() routine for the incarnation.
「これ『main()』はあらゆるpostgresが起動されてから終了するまでの周期(postmaster、スタンドアロンバックエンド、もしくはスタンドアロンブートストラップ状態を問わず)の単位でいくつかの必須な起動処理を行い、周期中に必要な固有のFooMain()ルーティンに渡します」
初めから判りにくい文章にぶつかりました。"incarnation"とは、東洋思想の輪廻における一生のことで、あるとき顕在化し使命を全うして去り、また現れたりするという意味です。ここでは「起動から終了までの周期」としてみました。
postgresプロセスはpostmasterからfork()される場合、スタンドアロンとしてコマンドラインから単独で起動する場合、そしてブートストラップでのスタンドアロン起動のいずれかのモードで起動されます。main()は条件に応じて適切な分岐を行います(図1)。行き先はFooMain()で、具体的には、PostmasterMain()、PostgresMain()、そしてBootstrapMain()です。"Foo"は「なんたらなんたら(不定称)」。先に進みます。プラットホーム特有の起動処理ハックです。
Remember the physical location of the initially given argv[] array for possible use by ps display. On some platforms, the argv[] storage must be overwritten in order to set the process title for ps. In such cases save_ps_display_args makes and returns a new copy of the argv[] array.
「ps表示で実行できる用法に対して初期に与えられたargv[]配列の物理的配置を思い出してください。プラットホームによっては、psのプロセス表題を設定するためargv[]内容は上書きされなければなりません。このような場合、save_ps_display_argsは配列argv[]の新規コピーを作成して返します」
psコマンドでプロセス名が変わってしまうことを防ぐ処理です。
save_ps_display_args may also move the environment strings to make extra room. Therefore this should be done as early as possible during startup, to avoid entanglements with code that might save a getenv() result pointer.
「save_ps_display_argsは同時に追加のスペースを確保するため環境文字列を移動させることがあります。従ってこれは起動時の早ければ早い時点で行われなければなりません。その理由は、getenv()結果ポインタをセーブする可能性のあるコードともつれあうことを防止するためです」
getenv()は環境変数の値へのポインタを返しますので、環境変数文字列を取得できます。ですからgetenv()を使うコードとの混乱を避ける考慮をしています。
Set up locale information from environment. Note that LC_CTYPE and LC_COLLATE will be overridden later from pg_control if we are in an already-initialized database.
「環境変数からロケール情報を設定する。LC_CTYPEとLC_COLLATEはすでに初期化されたデータベースを動かしている場合、後からでもpg_controlから上書きすることができます」
We set them here so that they will be available to fill pg_control during initdb. LC_MESSAGES will get set later during GUC option processing, but we set it here to allow startup error messages to be localized.
「initdb過程でpg_controlが履行されるように、ここでこれらの設定を行います。LC_MESSAGESはGUCオプション処理過程で後で設定されますが、ここで設定する意味は起動エラーメッセージがローカライズされるようにするためです」
LC_CTYPEは文字の分類、LC_COLLATEは文字列の並び替え順、そしてLC_MESSAGESはメッセージの言語を定めるものです。日本語環境でPostgreSQLを運用する場合、ロケール自体に問題があるため、データベースクラスタの初期化ではロケールなし、もしくは特殊なロケールであるCを指定します。
GUCとは、Grand Unified Configurationの略で、PostgreSQLの動的に変更できるパラメータを管理するモジュールのことで、設定ファイルや環境変数からソースコード中のグローバル変数に設定するものです。
Windowsへの考慮
Windows uses codepages rather than the environment, so we work around that by querying the environment explicitly first for LC_COLLATE and LC_CTYPE. We have to do this because initdb passes those values in the environment. If there is nothing there we fall back on the codepage.
「Windowsは環境変数ではなくむしろコードページを使うので、LC_COLLATEとLC_CTYPEに対し、最初に環境変数を明示的に問い合わせることによって対処します。そこに何もなければコードページに頼ります」
"fall back on"は「頼る」「当てにする」の慣用句です。例文を挙げましょう。"It was good to have some money in the bank to fall back on when I lost my job."を訳すと、「失業に備えて、銀行の蓄えに頼れるよう預金をしておくのは良いことです」となります。
We keep these set to "C" always, except transiently in pg_locale.c; see that file for explanations.
「一時的にpg_locale.cとする以外、これらを常に「C」に設定します。説明はpg_locale.cファイルを参照してください」
ちなみにpg_locale.cファイルの場所は、src/backend/utils/adt/pg_locale.cです。
Now that we have absorbed as much as we wish to from the locale environment, remove any LC_ALL setting, so that the environment variables installed by pg_perm_setlocale have force.
「ロケール環境からわれわれが望んでいるできる限りの情報を採り入れたからには、pg_perm_setlocaleでインストールされた環境変数が拘束力を持つように、どんなLC_ALL設定であってもすべて削除します」
"Now that ..."構文は、「...となった以上は」とか「...したからには」を表します。すべての必要な情報が入手できたので、邪魔になるものは取り除きます。