リソースタイプ実装の Validate コールバックメソッドの目的は、リソースに対する新しいプロパティー設定により指定されるリソースの新しい設定値が、そのリソースタイプにとって有効であるかどうかを検査することにあります。
リソースタイプ実装の Validate メソッドは、次のどちらかの条件のときにリソースグループマネージャー (Resource Group Manager、RGM) によって呼び出されます。
このリソースタイプの新規リソースが作成されつつある。
このリソースまたはリソースグループのプロパティーが更新されつつある。
この 2 つの操作は、リソースの Validate メソッドに渡されるコマンド行オプション -c (作成) と -u (更新) の存在によって区別されます。
Validate メソッドはノード群の各ノードに対して呼び出されます。ノード群は、リソースタイププロパティー Init_nodes の値で定義されます。Init_nodes が RG_PRIMARIES に設定されている場合、Validate は、そのリソースを含むリソースグループを収容できる (その主ノードになりうる) 各ノードに対して呼び出されます。Init_nodes が RT_INSTALLED_NODES に設定されている場合、Validate は、リソースタイプソフトウェアがインストールされている各ノード (通常は、クラスタのすべてのノード) に対して呼び出されます。
Init_nodes のデフォルト値は RG_PRIMARIES です (rt_reg(4)のマニュアルページを参照)。Validate メソッドが呼び出される時点では、RGM はまだリソースを作成していません (作成コールバックの場合)。あるいは、更新するプロパティーの更新値をまだ適用していません (更新コールバックの場合)。
HAStoragePlus リソースタイプによって管理されるローカルファイルシステムを使用している場合は、scds_hasp_check() 関数を使ってそのリソースタイプの状態を検査します。当該リソース用に定義されている Resource_dependencies または Resource_dependencies_weak のシステム属性を使用することによって、当該リソースが依存しているすべての SUNW.HAStoragePlus リソース状態 (オンラインであるか、オンラインでないか) についての情報が得られます。scds_hasp_check() 関数から返される状態コードの完全なリストについては、scds_hasp_check(3HA)のマニュアルページを参照してください。
DSDL 関数 scds_initialize() は、リソースの作成や更新を次のように処理します。
リソースの作成では、scds_initialize() はコマンド行で渡された新しいリソースプロパティーを解析します。これによって、リソースプロパティーの新しい値を、そのリソースががすでにシステムで作成されているかのように使用できます。
リソースやリソースグループの更新では、クラスタ管理者によって更新されているプロパティーの新しい値は、コマンド行から読み込まれます。残りのプロパティー (値が更新されないもの) は、RMAPI を使って Sun Cluster から読み込みます。DSDL を使用する場合は、このような作業を考慮する必要はありません。開発者は、リソースのすべてのプロパティーが使用可能であるものとして、リソースの検証を行うことができます。
リソースのプロパティーの検証を実装する関数は svc_validate() と呼ばれます。この関数は、scds_get_name() 関数群を使って、検証しようとするプロパティーを検査します。リソースの設定が有効ならこの関数から戻りコード 0 が返されるとすると、リソースタイプの Validate メソッドは、次のコード部分のようになります。
int main(int argc, char *argv[]) { scds_handle_t handle; int rc; if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR) { return (1); /* Initialization Error */ } rc = svc_validate(handle); scds_close(&handle); return (rc); }
さらに検証関数は、リソースの検証が失敗した理由を記録する必要もあります。ただし、詳細は省略することによって、次に示すように、より単純な例である svc_validate() 関数を実装できます (第 8 章サンプル DSDL リソースタイプの実装には検証関数の実際的な取り扱いが記載されています)。
int svc_validate(scds_handle_t handle) { scha_str_array_t *confdirs; struct stat statbuf; confdirs = scds_get_confdir_list(handle); if (stat(confdirs->str_array[0], &statbuf) == -1) { return (1); /* Invalid resource property setting */ } return (0); /* Acceptable setting */ }
このように、リソースタイプの開発者は、svc_validate() 関数を実装することだけに集中できます。