Sun Cluster Entwicklerhandbuch Datendienste für Solaris OS

xfnts_probe-Methode

Die xfnts_probe-Methode prüft die Verfügbarkeit der Anwendung und entscheidet, ob ein Failover ausgeführt oder der Datendienst neu gestartet wird. Die Rückmeldemethode xfnts_monitor_start startet dieses Programm, und die Rückmeldemethode xfnts_monitor_stop stoppt es.


Beispiel C–5 xfnts_probe.c+

/*
 * Copyright (c) 1998-2004 Sun Microsystems, Inc.
 * Alle Rechte vorbehalten.
 *
 * xfnts_probe.c - Testsignal für 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():
 * Einfach eine Endlosschleife, die manchmal ruht (sleep()) und
 * auf das PMF-Aktionsskript wartet, das sleep() unterbricht. Bei
 * Unterbrechung wird die Start-Methode für HA-XFS aufgerufen, um
 * sie neu zu starten.
 */

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, “Initialisierung des Handles fehlgeschlagen.”);
      return (1);
   }


   /* Für diese Ressource verfügbare IP-Adressen abrufen */
   if (scds_get_netaddr_list(scds_handle, &netaddr)) {
      scds_syslog(LOG_ERR,
          “Keine Netzwerkadressressource in Ressourcengruppe.”);
      scds_close(&scds_handle);
      return (1);
   }

   /* Fehler zurückgeben, wenn keine Netzwerkressourcen vorhanden sind */
   if (netaddr == NULL || netaddr->num_netaddrs == 0) {
      scds_syslog(LOG_ERR,
          “Keine Netzwerkadressressource in Ressourcengruppe.”);
      return (1);
   }


   /*
    * Zeitüberschreitung aus den X-Eigenschaften einstellen.
    * Das bedeutet, dass jede Testsignalwiederholung eine volle Zeitüberschreitung
    * für jede Netzwerkressource erhält, ohne die Zeitüberschreitung unter allen für
    * diese Ressource konfigurierten Netzwerkressourcen aufzuteilen.
    */
   timeout = scds_get_ext_probe_timeout(scds_handle);

   for (;;) {

      /*
       * Für die Dauer von thorough_probe_interval zwischen den
       *  einzelnen Testsignalen ruhen.
       */
      (void) scds_fm_sleep(scds_handle,
          scds_get_rs_thorough_probe_interval(scds_handle));

      /*
       * Jetzt alle verwendeten IP-Adressen testen. Schleife über:
       * 1. Allen verwendeten Netzwerkressourcen.
       * 2. Allen IP-Adressen einer bestimmten Ressource.
       * Für jede geprüfte IP-Adresse die Fehlschlaghistorie berechnen.
       */
      probe_result = 0;
      /*
       * Für alle Ressourcen wiederholen, um alle IP-Adressen
       * abzurufen, die für das Aufrufen von svc_probe() verwendet werden sollen.
       */
      for (ip = 0; ip < netaddr->num_netaddrs; ip++) {
         /*
          * Hostnamen und Port erfassen, deren
          * Fehlerfreiheit überwacht werden soll.
          */
         hostname = netaddr->netaddrs[ip].hostname;
         port = netaddr->netaddrs[ip].port_proto.port;
         /*
          * HA-XFS unterstützt nur einen Port. Daher muss
          * der Port-Wert aus dem ersten Eintrag im
          * Port-Array abgerufen werden.
          */
         ht1 = gethrtime(); /* Testsignal-Startzeit festhalten*/
         scds_syslog(LOG_INFO, “Dienst wird auf “
             “Port: %d getestet.”, port);

         probe_result =
         svc_probe(scds_handle, hostname, port, timeout);

         /*
          * Diensttestsignalhistorie aktualisieren, und
          * bei Bedarf Aktionen einleiten.
          * Testsignal-Endzeit festhalten.
          */
         ht2 = gethrtime();

         /* In Millisekunden umrechnen */
         dt = (ulong_t)((ht2 - ht1) / 1e6);

         /*
          * Fehlschlaghistorie berechnen und
          * bei Bedarf Aktionen einleiten.
          */
         (void) scds_fm_action(scds_handle,
             probe_result, (long)dt);
      }   /* Jede Netzwerkressource */
   }    /* Endlos weitertesten */
}