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.
/* * 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 */ } |