xfonts_probe メソッドは無限ループを実行します。ループを実行する前に、xfonts_probe は次の処理を行います。
次に示すように、xfnts リソース用のネットワークアドレスリソースを取得します。
/* 当該リソース用に利用できる IP アドレスを取得する。*/
if (scds_get_netaddr_list(scds_handle, &netaddr)) {
scds_syslog(LOG_ERR,
"No network address resource in resource group.");
scds_close(&scds_handle);
return (1);
}
/* ネットワークリソースが存在しない場合、エラーを戻す。*/
if (netaddr == NULL || netaddr->num_netaddrs == 0) {
scds_syslog(LOG_ERR,
"No network address resource in resource group.");
return (1);
}
scds_fm_sleep を呼び出し、タイムアウト値として Thorough_probe_interval の値を渡します。検証を実行する間、検証機能は Thorough_probe_interval で指定された期間、休眠状態になります。
timeout = scds_get_ext_probe_timeout(scds_handle);
for (;;) {
/*
* 連続する検証の間、Throrough_probe_interval で指定された期間、
* 休眠状態になる。
*/
(void) scds_fm_sleep(scds_handle,
scds_get_rs_thorough_probe_interval(scds_handle));
xfnts_probe メソッドは次のようなループを実装します。
for (ip = 0; ip < netaddr->num_netaddrs; ip++) {
/*
* 状態を監視するホスト名とポートを取得する。
*/
hostname = netaddr->netaddrs[ip].hostname;
port = netaddr->netaddrs[ip].port_proto.port;
/*
* HA-XFS がサポートするポートは 1 つだけなので、
* ポート値はポートの配列の最初の
* エントリから取得する。
*/
ht1 = gethrtime(); /* Latch probe start time */
scds_syslog(LOG_INFO, "Probing the service on port: %d.", port);
probe_result =
svc_probe(scds_handle, hostname, port, timeout);
/*
* サービス検証履歴を更新し、
* 必要に応じて、アクションを行う。
* 検証終了時間を取得する。
*/
ht2 = gethrtime();
/* ミリ秒に変換する。*/
dt = (ulong_t)((ht2 - ht1) / 1e6);
/*
* 障害の履歴を計算し、必要に応じて
* アクションを実行する。
*/
(void) scds_fm_action(scds_handle,
probe_result, (long)dt);
} /* ネットワークリソースごと */
} /* 検証を永続的に繰り返す。*/
svc_probe 関数は検証ロジックを実装します。svc_probe からの戻り値は scds_fm_action に渡されます。そして scds_fm_action は、アプリケーションを再起動するか、リソースグループをフェイルオーバーするか、あるいは何もしないかを決定します。