Sun Cluster データサービス開発ガイド (Solaris OS 版)

xfnts_probe メソッド

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


例 C–5 xfnts_probe.c+

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