リソースが作成されたとき、および、リソースまたは (リソースを含む) リソースグループのプロパティが管理アクションによって更新されるとき、RGM は Validate メソッドを呼び出します。RGM は、作成または更新が行われる前に、Validate メソッドを呼び出します。任意のノード上でメソッドから失敗の終了コードが戻ると、作成または更新は取り消されます。
RGM が Validate メソッドを呼び出すのは、管理アクションがリソースまたはグループのプロパティを変更したときだけです。RGM がプロパティを設定したときや、モニターがリソースプロパティ Status と Status_msg を設定したときではありません。
PROBE メソッドがデータサービスを新しいノードにフェイルオーバーする場合、Monitor_check メソッドも明示的に Validate メソッドを呼び出します。
RGM は、他のメソッドに渡す追加の引数 (更新されるプロパティと値を含む) を指定して、Validate メソッドを呼び出します。xfnts_validate の開始時に実行される scds_initialize の呼び出しにより、RGM が xfnts_validate に渡したすべての引数が解析され、その情報が scds_handle パラメータに格納されます。この情報は、xfnts_validate が呼び出すサブルーチンによって使用されます。
xfnts_validate メソッドは svc_validate を呼び出して、次のことを検証します。
Confdir_list プロパティがリソース用に設定されており、単一のディレクトリが定義されているかどうか。
scha_str_array_t *confdirs; confdirs = scds_get_ext_confdir_list(scds_handle); /* Confdir_list 拡張プロパティが存在しない場合、エラーを戻す。*/ if (confdirs == NULL || confdirs->array_cnt != 1) { scds_syslog(LOG_ERR, "Property Confdir_list is not set properly."); return (1); /* 検証に失敗 */ }
Confdir_list で指定されたディレクトリに fontserver.cfg ファイルが存在しているかどうか。
(void) sprintf(xfnts_conf, "%s/fontserver.cfg", confdirs->str_array[0]); if (stat(xfnts_conf, &statbuf) != 0) { /* * errno.h プロトタイプには void 引数がないので、 * lint エラーが抑制される。 */ scds_syslog(LOG_ERR, "Failed to access file <%s> : <%s>", xfnts_conf, strerror(errno)); /*lint !e746 */ return (1); }
サーバーデーモンバイナリがクラスタノード上でアクセスできるかどうか。
if (stat("/usr/openwin/bin/xfs", &statbuf) != 0) { scds_syslog(LOG_ERR, "Cannot access XFS binary : <%s> ", strerror(errno)); return (1); }
Port_list プロパティが単一のポートを指定しているかどうか。
scds_port_list_t *portlist; err = scds_get_port_list(scds_handle, &portlist); if (err != SCHA_ERR_NOERR) { scds_syslog(LOG_ERR, "Could not access property Port_list: %s.", scds_error_string(err)); return (1); /* 検証に失敗 */ } #ifdef TEST if (portlist->num_ports != 1) { scds_syslog(LOG_ERR, "Property Port_list must have only one value."); scds_free_port_list(portlist); return (1); /* 検証に失敗 */ } #endif
データサービスが属するリソースグループに、少なくとも 1 つのネットワークアドレスリソースが属しているかどうか。
scds_net_resource_list_t *snrlp; if ((err = scds_get_rs_hostnames(scds_handle, &snrlp)) != SCHA_ERR_NOERR) { scds_syslog(LOG_ERR, "No network address resource in resource group: %s.", scds_error_string(err)); return (1); /* 検証に失敗 */ } /* ネットワークアドレスリソースが存在しない場合エラーを戻す。*/ if (snrlp == NULL || snrlp->num_netresources == 0) { scds_syslog(LOG_ERR, "No network address resource in resource group."); rc = 1; goto finished; }
次に示すように、svc_validate は戻る前に、割り当てられているすべてのリソースを解放します。
finished: scds_free_net_list(snrlp); scds_free_port_list(portlist); return (rc); /* 検証結果を戻す。*/
xfnts_validate メソッドは終了する前に scds_close を呼び出して、scds_initialize が割り当てたリソースを再利用します。詳細については、scds_initialize の呼び出しと scds_close(3HA) のマニュアルページを参照してください。