Sun Cluster Entwicklerhandbuch Datendienste für Solaris OS

Entwerfen des Fehler-Monitor-Dämons

Die Ressourcentypimplementierungen, die die DSDL verwenden, weisen in der Regel einen Fehler-Monitor-Dämon auf, der folgende Aufgaben übernimmt:

Die DSDL-Dienstprogramme sind so entworfen, dass die Hauptschleife des Fehler-Monitor-Dämons am Ende dieses Abschnitts als Pseudo-Code dargestellt werden kann.

Berücksichtigen Sie die folgenden Faktoren bei der Implementierung eines Fehler-Monitors mit der DSDL:

In den meisten Fällen können Sie die anwendungsspezifische Zustandsprüfung in einem separaten eigenständigen Dienstprogramm (z.B. svc_probe()) implementieren. Sie können sie mit der folgenden generischen Hauptschleife integrieren.

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