Sun Cluster Entwicklerhandbuch Datendienste für Solaris OS

Entwerfen des Fehler-Monitor-Dämons

Ressourcentypimplementierungen, welche die DSDL verwenden, verfügen in der Regel über einen Fehler-Monitor-Dämon mit folgenden Aufgaben:

Die DSDL-Dienstprogramme sind so ausgelegt, dass die Hauptschleife des Fehler-Monitor-Dämons durch den folgenden Pseudocode dargestellt werden kann.

Für Fehler-Monitore, die unter Verwendung der DSDL implementiert wurden, gilt:

In den meisten Fällen kann die anwendungsspezifische Gesundheits-Checkaktion in einem eigenständigen Dienstprogramm (zum Beispiel svc_probe()) implementiert und in diese generische Hauptschleife integriert werden.


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 in einer bestimmten Ressource.
   * Für jede getestete IP-Adresse
   * Fehlschlaghistorie berechnen. */
   probe_result = 0;
   /* Für alle Ressourcen wiederholen, um jede IP-Adresse
    * für den Aufruf von svc_probe() abzurufen */
   for (ip = 0; ip < netaddr->num_netaddrs; ip++) {
   /* Hostname und Port für Überwachung der
   * Fehlerfreiheit erfassen.
   */
   hostname = netaddr->netaddrs[ip].hostname;
   port = netaddr->netaddrs[ip].port_proto.port;
   /*
   * HA-XFS unterstützt nur einen Port. Daher den
   * Port-Wert aus dem ersten Eintrag im
   * Port-Array abrufen.
   */
   ht1 = gethrtime(); /* Testsignal-Startzeit festhalten */
   probe_result = svc_probe(scds_handle, 

   hostname, port, timeout);
   /*
   * Testsignalhistorie des Dienstes aktualisieren,
   * bei Bedarf Aktionen ausführen.
   * Testsignal-Endzeit festhalten.
   */
   ht2 = gethrtime();
   /* In Millisekunden konvertieren */
   dt = (ulong_t)((ht2 - ht1) / 1e6);

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