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

障害モニターデーモンの設計

DSDL を使用したリソースタイプ実装の障害モニターデーモンには、通常、次の役割があります。

DSDL ユーティリティーの設計では、障害モニターデーモンの主要ループは次のようになっています。

DSDL を使って実装された障害モニターでは、

ほとんどの場合、アプリケーション固有の状態検査アクションは、スタンドアロンの別個のユーティリティー (たとえば、svc_probe()) として実装してから、この汎用的なメインループに統合できます。


for (;;) { 

   / * 正常な検証と検証の間の thorough_probe_interval
   *  だけスリープする。 */
   (void) scds_fm_sleep(scds_handle,
   scds_get_rs_thorough_probe_interval(scds_handle));

   /* 使用するすべての ipaddress を検証する。
  * 次の各要素を繰り返し検証する。
  * 1. 使用するすべてのネットリソース
  * 2. 特定のリソースのすべての ipaddresses
  * 検証する ipaddress ごとに
  * 障害履歴を計算する。*/
   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 */
   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);
   }       /* 各ネットワークリソース */
   }       /* 検証を続ける */