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-2004 by Sun Microsystems, Inc. * All rights reserved. * * 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 en “ “puerto: %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 */ } /* Continuar analizando indefinidamente */ } |