Sun Cluster: Guía del desarrollador de los servicios de datos del sistema operativo Solaris

Método xfnts_probe

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.


Ejemplo C–5 xfnts_probe.c+

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