xfnts_probe メソッドは、アプリケーションの可用性を検査して、データサービスをフェイルオーバーするか、再起動するかを決定します。xfnts_probe メソッドは、xfnts_monitor_start コールバックメソッドによって起動され、xfnts_monitor_stop コールバックメソッドによって停止されます。
/*
* Copyright (c) 1998-2001 by Sun Microsystems, Inc.
* All rights reserved.
*
* xfnts_probe.c - Probe for 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 (;;) {
/*
* 連続する検証の間、Throrough_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(); /* 検証開始時間を取得する。*/
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);
} /* ネットワークリソースごと */
} /* 検証を永続的に繰り返す。 */
}
|