Solaris DHCP サービス開発ガイド

ファイルシステムベースのコンテナへのアクセスの同期化

ローカルのファイルシステムベースのデータサービス (データサービスが DHCP サーバーと同じマシンで動作する場合) 内のコンテナにアクセスするパブリックモジュールを作成する場合には、複数のプロセスやスレッドの間で基盤となるデータサービスへのアクセスを同期化するのは難しいことがあります。

Solaris DHCP 同期サービスでは、同期化をフレームワーク構成層へプッシュアップすることにより、ローカルのファイルシステムベースのデータサービスを使用するパブリックモジュールの設計をシンプルにします。このフレームワークを使用するようにモジュールを設計すれば、コードがシンプルになり、設計がよりクリアになります。

この同期サービスは、パブリックモジュールに、add_d?()delete_d?()modify_d?() サービスプロバイダ層 API 呼び出しのすべての呼び出し元のコンテナ単位の排他的同期を提供します。つまり、あるスレッドが、ある DHCP ネットワークコンテナについて add_dn() 内に存在する場合は、他のスレッドが、その同じコンテナについて add_dn()delete_dn()modify_dn()lookup_dn() 内に存在しません。ただし、close_dn() のように同期が保証されないルーチン内には、他のスレッドが存在することがあります。

lookup_d?() のすべての呼び出し元は、コンテナ単位で共有的に同期化されます。したがって、多数のスレッドが同じコンテナについて検索を行なっていても、追加、削除、変更の操作は、同時に 1 つのスレッドしか実行できません。

同期サービスは、デーモン (/usr/lib/inet/dsvclockd) として実装されます。パブリックモジュールに代わってなされるロックマネージャの要求は、フレームワーク構成層 API 呼び出しを通して行われます。フレームワーク構成層とロックマネージャデーモン間のインタフェースには、Solaris の door プロセス間通信のメカニズムが使用されます。これについては、例として door_create(3DOOR) や door_call(3DOOR) などを参照してください。

パブリックモジュールが同期化を要求すると、フレームワーク構成層は、dsvclockd デーモンがまだ動作していなければ、これを起動します。デーモンがロックを扱わない時間が 15 分を過ぎると、デーモンは自動的に終了します。この時間を変更する場合は、/etc/default/dsvclockd ファイルを作成し、IDLE のデフォルトをデーモンが終了するまでにアイドルである分数に設定します。

同期サービスが必要なことをパブリックモジュールからフレームワーク構成層に知らせるには、モジュールのソースファイルの 1 つに次のグローバル変数を含めます。

dsvc_synchtype_t dsvc_synchtype = DSVC_SYNCH_DSVCD;

同期サービスが「必要ない」ことをパブリックモジュールからフレームワーク構成層に知らせるには、モジュールのソースファイルの 1 つに次のグローバル変数を含めます。

dsvc_synchtype_t dsvc_synchtype = DSVC_SYNCH_NONE;

現在のところ、同期タイプは DSVC_SYNCH_DSVCDDSVC_SYNCH_NONE の 2 つだけです。