xfnts_probe メソッドは、アプリケーションの可用性を検査して、データサービスをフェイルオーバーするか、再起動するかを決定します。 xfnts_probe メソッドは、xfnts_monitor_start コールバックメソッドによって起動され、xfnts_monitor_stop コールバックメソッドによって停止されます。
/* * Copyright (c) 1998-2004 by Sun Microsystems, Inc. * All rights reserved. * * xfnts_probe.c - HA-XFS の検査 */ #pragma ident ”@(#)xfnts_probe.c 1.26 01/01/18 SMI” #include <stdio.h> #include <stdlib.h> #include <strings.h> #include <unistd.h> #include <signal.h> #include <sys/time.h> #include <sys/socket.h> #include <strings.h> #include <rgm/libdsdev.h> #include ”xfnts.h” /* * main(): * sleep() を実行して、PMF アクションスクリプトが sleep() に割り込むのを * 待機する無限ループ。sleep() への割り込みが発生すると、HA-XFS 用の * 起動メソッドを呼び出して、再起動する。 * */ int main(int argc, char *argv[]) { int timeout; int port, ip, probe_result; scds_handle_t scds_handle; hrtime_t ht1, ht2; unsigned long dt; scds_netaddr_list_t *netaddr; char *hostname; if (scds_initialize(&scds_handle, argc, argv) != SCHA_ERR_NOERR) { scds_syslog(LOG_ERR, ”Failed to initialize the handle.”); return (1); } /* 当該リソースに利用できる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); } /* * X プロパティからタイムアウト値を設定する。つまり、 * 当該リソース用に構成されたすべてのネットワークリソース間で * タイムアウト値を分割するのではなく、検証を行うたびに、 * 各ネットワークリソースに設定されているタイムアウト値を * 取得することを意味する。 */ timeout = scds_get_ext_probe_timeout(scds_handle); for (;;) { /* * 連続する検証の間、thorough_probe_interval * の期間、スリープ状態になる。 */ (void) scds_fm_sleep(scds_handle, scds_get_rs_thorough_probe_interval(scds_handle)); /* * 使用するすべてのIP アドレスを検証する。 * 以下をループで検証する。 * 1. 使用するすべてのネットワークリソース * 2. 指定されたリソースのすべてのIP アドレス * 検証するIP アドレスごとに、障害履歴を計算する。 */ probe_result = 0; /* * すべてのリソースを繰り返し検証して、svc_probe() の * 呼び出しに使用する各IP アドレスを取得する。 */ 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); } /* ネットワークリソースごと */ } /* 検証を永続的に繰り返す。 */ } |