El método xfnts_probe comprueba la disponibilidad de la aplicación y decide si debe realizar una operación de recuperación de fallos o reiniciar el servicio de datos. El método de rellamada xfnts_monitor_start inicia este programa y el método de rellamada xfnts_monitor_stop lo detiene.
/*
* Copyright (c) 1998-2003 de Sun Microsystems, Inc.
* Reservados todos los derechos.
*
* xfnts_probe.c - Análisis de 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():
* Sólo un bucle infinito que permanece en sleep()s durante un tiempo,
* a la espera de que la secuencia de acciones de PMF lo interrumpa.
* Cuando eso ocurre, invoca el método de inicio para que HA-XFS lo reinicie.
*
*/
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, “No se ha podido inicializar el manejo.”);
return (1);
}
/* Obtener la dirección IP disponible para este recurso */
if (scds_get_netaddr_list(scds_handle, &netaddr)) {
scds_syslog(LOG_ERR,
“No hay recurso de dirección de red en el grupo de recursos.”);
scds_close(&scds_handle);
return (1);
}
/* Devolver un error si no hay recursos de red */
if (netaddr == NULL || netaddr->num_netaddrs == 0) {
scds_syslog(LOG_ERR,
“No hay recurso de dirección de red en el grupo de recursos.”);
return (1);
}
/*
* Establecer el tiempo de espera de las propiedades de X. Esto significa
* que cada iteración de análisis recibirá un tiempo de espera completo
* en cada recurso de red, sin necesidad de dividir el tiempo de espera
* entre todos los recursos de red configurados para este recurso.
*/
timeout = scds_get_ext_probe_timeout(scds_handle);
for (;;) {
/*
* Reposar durante un tiempo thorough_probe_interval entre
* análisis sucesivos.
*/
(void) scds_fm_sleep(scds_handle,
scds_get_rs_thorough_probe_interval(scds_handle));
/*
* Ahora, analizar todas las direcciones IP que se usan. Recorrer
* 1. Todos los recursos de red que se emplean.
* 2. Todas las direcciones IP de un recurso determinado.
* Para cada dirección IP analizada, calcular
* el historial de fallos.
*/
probe_result = 0;
/*
* Repetir con todos los recursos para obtener todas
* las direcciones IP que hay que usar para invocar svc_probe()
*/
for (ip = 0; ip < netaddr->num_netaddrs; ip++) {
/*
* Obtener el nombre de sistema y puerto en los que hay que
* supervisar el estado.
*/
hostname = netaddr->netaddrs[ip].hostname;
port = netaddr->netaddrs[ip].port_proto.port;
/*
* HA-XFS sólo admite un puerto, por lo que
* se debe obtener el valor del puerto de la
* primera entrada de la matriz de puertos.
*/
ht1 = gethrtime(); /* Bloquear la hora de inicio del análisis */
scds_syslog(LOG_INFO, “Analizar el servicio de “
“port: %d.”, port);
probe_result =
svc_probe(scds_handle, hostname, port, timeout);
/*
* Actualizar el historial de análisis del servicio,
* y actuar si es necesario.
* Bloquear la hora de finalización del análisis.
*/
ht2 = gethrtime();
/* Convertir a milisegundos */
dt = (ulong_t)((ht2 - ht1) / 1e6);
/*
* Calcular el historial de fallos y
* actuar si es necesario
*/
(void) scds_fm_action(scds_handle,
probe_result, (long)dt);
} /* Todos los recursos de red */
} /* Analizar para siempre */
}
|