Sun Cluster 3.0 12/01 データサービス開発ガイド

xfnts_probe メソッドのコードリスト

xfnts_probe メソッドは、アプリケーションの可用性を検査して、データサービスをフェイルオーバーするか、再起動するかを決定します。xfnts_probe メソッドは、xfnts_monitor_start コールバックメソッドによって起動され、xfnts_monitor_stop コールバックメソッドによって停止されます。


例 C-5 xfnts_probe.c+

/*
 * 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);
		}	/* ネットワークリソースごと */
	} 	/* 検証を永続的に繰り返す。 */
}