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

Diseño de un daemon del supervisor de fallos

Las implementaciones del tipo de recurso con DSDL suelen tener un daemon del supervisor de fallos con las responsabilidades siguientes.

Las utilidades de DSDL están diseñadas de modo que el bucle principal del daemon del supervisor de fallos se pueda representar con el siguiente pseudocódigo.

Para los supervisores de fallos implementados con DSDL:

En la mayoría de los casos, la acción de comprobación del estado específico de la aplicación se puede implementar en una utilidad autónoma separada (por ejemplo, svc_probe()) y se puede integrar con este bucle principal genérico.


for (;;) {

   / * reposo durante un intervalo thorough_probe_interval entre
   * análisis sucesivos. */
   (void) scds_fm_sleep(scds_handle,
   scds_get_rs_thorough_probe_interval(scds_handle));

   /* Analizar ahora todas las direcciones ip que se usan.
   * Recorrer:
   * 1. Todos los recursos de red que usamos.
   * 2. Todas las direcciones ip de un recurso determinado.
   * Para cada una de las direcciones ip analizadas,
   * calcular el historial de fallos. */
   probe_result = 0;
   /* Iterar todos los recursos para obtener todas las
    * direcciones IP para invocar svc_probe() */
   for (ip = 0; ip < netaddr->num_netaddrs; ip++) {
   /* Anotar el nombre del sistema y puerto en los que
   * se debe supervisar el estado.
   */
   hostname = netaddr->netaddrs[ip].hostname;
   port = netaddr->netaddrs[ip].port_proto.port;
   /*
   * HA-XFS sólo admite un puerto; por tanto,
   * obtener el valor de puerto de la primera
   * entrada de la matriz de puertos.
   */
   ht1 = gethrtime(); /* Bloquear tiempo de inicio de análisis */
   probe_result = svc_probe(scds_handle,

   hostname, port, timeout);
   /*
   * Actualizar historial de análisis,
   * tomar medidas si fuera necesario.
   * Bloquear tiempo de finalización de análisis.
   */
   ht2 = gethrtime();
   /* Convertir a milisegundos */
   dt = (ulong_t)((ht2 - ht1) / 1e6);

   /*
   * Calcular historial de fallos y tomar
   * medidas si fuera necesario
   */
   (void) scds_fm_action(scds_handle,
   probe_result, (long)dt);
   }       /* Cada recurso de red */
   }       /* Seguir analizando para siempre */