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