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 de tipos de recursos que utilizan DSDL disponen generalmente de un daemon del supervisor de fallos que lleva a cabo las siguientes acciones:

Las utilidades de DSDL están diseñadas para que el seudocódigo incluido al final de esta sección pueda representar al bucle principal del daemon del supervisor de fallos.

Tenga en cuenta los siguientes factores al implementar un supervisor de fallos con DSDL:

En la mayoría de los casos, se puede implementar una comprobación de estado de la aplicación en una utilidad independiente (por ejemplo, svc_probe()). Puede integrarla en el siguiente bucle principal genérico.

for (;;) {
   /* sleep for a duration of thorough_probe_interval between
   *  successive probes.
   */
   (void) scds_fm_sleep(scds_handle,
   scds_get_rs_thorough_probe_interval(scds_handle));
   /* Now probe all ipaddress we use. Loop over
   * 1. All net resources we use.
   * 2. All ipaddresses in a given resource.
   * For each of the ipaddress that is probed,
   * compute the failure history. 
   */
   probe_result = 0;
   /* Iterate through the all resources to get each
   * IP address to use for calling svc_probe()
   */
   for (ip = 0; ip < netaddr->num_netaddrs; ip++) {
   /* Grab the hostname and port on which the
   * health has to be monitored.
   */
   hostname = netaddr->netaddrs[ip].hostname;
   port = netaddr->netaddrs[ip].port_proto.port;
   /*
   * HA-XFS supports only one port and
   * hence obtaint the port value from the
   * first entry in the array of ports.
   */
   ht1 = gethrtime();
   /* Latch probe start time */
   probe_result = svc_probe(scds_handle, hostname, port, timeout);
   /*
   * Update service probe history,
   * take action if necessary.
   * Latch probe end time.
   */
   ht2 = gethrtime();
   /* Convert to milliseconds */
   dt = (ulong_t)((ht2 - ht1) / 1e6);
   /*
   * Compute failure history and take
   * action if needed
   */
   (void) scds_fm_action(scds_handle,
   probe_result, (long)dt);
   }       /* Each net resource */
   }       /* Keep probing forever */