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 は、アプリケーションを再起動するか、リソースグループをフェイルオーバーするか、あるいは何もしないかを決定します。