Sun Microsystems, Inc.
spacerspacer
spacer www.sun.com docs.sun.com |
spacer
black dot
 
 
8.  Sample DSDL Resource Type Implementation xfnts_monitor_stop Method  Previous   Contents   Next 
   
 

xfnts_monitor_check Method

The RGM calls the Monitor_check method whenever the fault monitor attempts to fail the resource group containing the resource over to another node. The xfnts_monitor_check method calls the svc_validate() method to verify that a proper configuration is in place to support the xfs daemon (see xfnts_validate Method for details). The code for xfnts_monitor_check is as follows.

   /* Process the arguments passed by RGM and initialize syslog */
   if (scds_initialize(&scds_handle, argc, argv) != SCHA_ERR_NOERR)
{
      scds_syslog(LOG_ERR, "Failed to initialize the handle.");
      return (1);
   }

   rc =  svc_validate(scds_handle);
   scds_syslog_debug(DBG_LEVEL_HIGH,
       "monitor_check method "
       "was called and returned <%d>.", rc);

   /* Free up all the memory allocated by scds_initialize */
   scds_close(&scds_handle);

   /* Return the result of validate method run as part of monitor check */
   return (rc);
}

SUNW.xfnts Fault Monitor

The RGM does not directly call the PROBE method but rather calls the Monitor_start method to start the monitor after a resource is started on a node. The xfnts_monitor_start method starts the fault monitor under the control of PMF. The xfnts_monitor_stop method stops the fault monitor.

The SUNW.xfnts fault monitor performs the following operations:

  • Periodically monitors the health of the xfs server daemon using utilities specifically designed to check simple TCP-based services, such as xfs.

  • Tracks problems the application encounters within a time window (using the Retry_count and Retry_interval properties) and decides whether to restart or failover the data service in case of complete application failure. The scds_fm_action() and scds_fm_sleep() functions provide built-in support for this tracking and decision mechanism.

  • Implements the failover or restart decision using scds_fm_action().

  • Updates the resource state and makes it available to administrative tools and graphics user interfaces.

xfonts_probe Main Loop

The xfonts_probe method implements a loop. Before implementing the loop, xfonts_probe

  • Retrieves the network-address resources for the xfnts resource, as follows.

    /* Get the ip addresses available for this resource */
       if (scds_get_netaddr_list(scds_handle, &netaddr)) {
          scds_syslog(LOG_ERR,
              "No network address resource in resource group.");
          scds_close(&scds_handle);
          return (1);
       }
    
       /* Return an error if there are no network resources */
       if (netaddr == NULL || netaddr->num_netaddrs == 0) {
          scds_syslog(LOG_ERR,
              "No network address resource in resource group.");
          return (1);
       }
  • Calls scds_fm_sleep() and passes the value of Thorough_probe_interval as the timeout value. The probe sleeps for the value of Thorough_probe_interval between probes.

    timeout = scds_get_ext_probe_timeout(scds_handle);
    
       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));

The xfnts_probe method implements the loop as follows.

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 obtain the port value from the
          * first entry in the array of ports.
          */
         ht1 = gethrtime(); /* Latch probe start time */
         scds_syslog(LOG_INFO, "Probing the service on port: %d.", port);

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

The svc_probe() function implements the probe logic. The return value from svc_probe() is passed to scds_fm_action(), which determines whether to restart the application, failover the resource group, or do nothing.

 
 
 
  Previous   Contents   Next