リソースが作成されたとき、および、リソースまたは (リソースを含む) グループのプロパティーがクラスタ管理者によって更新されたとき、RGM は Validate メソッドを呼び出します。RGM は、作成または更新が行われる前に、Validate メソッドを呼び出します。任意のノード上でメソッドから失敗の終了コードが戻ると、作成または更新は取り消されます。
RGM が Validate を呼び出すのは、クラスタ管理者がリソースまたはリソースグループのプロパティーを変更したときや、モニターが Status と Status_msg リソースプロパティーを設定したときだけです。RGM がプロパティーを設定する場合、RGM は Validate を呼び出しません。
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) のマニュアルページを参照してください。