Guide des développeurs pour les services de données Sun Cluster pour SE Solaris

Méthode xfnts_probe

La méthode xfnts_probe contrôle la disponibilité de l'application et choisit de basculer ou de redémarrer le service de données. La méthode de rappel xfnts_monitor_start lance ce programme tandis que la méthode de rappel xfnts_monitor_stop l'arrête.


Exemple C–5 xfnts_probe.c+

/*
 * Copyright (c) 1998-2003 par Sun Microsystems, Inc.
* Tous droits réservés.
*
* xfnts_probe.c - Probe for 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():
 * Boucle illimitée qui attend (sleep()s) pendant un laps de temps que le script
* d’action de la fonction PMF interrompe sleep(). Une fois qu’il est interrompu
* elle appelle la méthode de démarrage de HA-XFS pour le redémarrer.
 *
 */

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, “Failed to initialize the handle.”);
      return (1);
   }

   /* Obtenez les adresses IP disponibles pour cette ressource */
   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);
   }

   /* Retournez une erreur en l’absence de ressources réseau */
   if (netaddr == NULL || netaddr->num_netaddrs == 0) {
      scds_syslog(LOG_ERR,
          “No network address resource in resource group.”);
      return (1);
   }

   /*
    * Définissez le délai d’attente des propriétés X. Cela signifie que chaque
* itération de détection obtient un délai d’attente complet sur chaque ressource
* réseau sans supprimer le délai d’attente entre toutes les ressources réseau
* configurées pour cette ressource.
    */
   timeout = scds_get_ext_probe_timeout(scds_handle);

   for (;;) {

      /*
       * Attendez que s’écoule l’intervalle_sonde_complet entre les
* tentatives réussies.
       */
      (void) scds_fm_sleep(scds_handle,
          scds_get_rs_thorough_probe_interval(scds_handle));

      /*
       * À présent, détectez toutes les adresses IP utilisées. Itérez
* 1. Toutes les ressources réseau utilisées.
* 2. Toutes les adresses IP d’une ressource donnée.
* Chaque adresse IP testée,
* Calculez l’historique d’échec.
       */
      probe_result = 0;
      /*
       * Itérez toutes les ressources pour obtenir chaque
* adresse IP à utiliser pour appeler svc_probe()
       */
      for (ip = 0; ip < netaddr->num_netaddrs; ip++) {
         /*
          * * Saisissez le nom d’hôte et le port
* dont l’état doit être contrôlé.
          */
         hostname = netaddr->netaddrs[ip].hostname;
         port = netaddr->netaddrs[ip].port_proto.port;
         /*
          * HA-XFS ne prend en charge qu’un port, par conséquent
* obtenez la valeur du port à partir de la
* première entrée dans l’ensemble des ports.
          */
         ht1 = gethrtime(); /* Verrouillez le délai de démarrage de détection */
         scds_syslog(LOG_INFO, “Probing the service on “
             “port: %d.”, port);

         probe_result =
         svc_probe(scds_handle, hostname, port, timeout);

         /*
          *Mettez à jour l’historique de détection du service,
* effectuez les actions requises si nécessaire.
* Verrouillez le délai de fin de détection.
          */
         ht2 = gethrtime();

         /* Conversion en millisecondes */
         dt = (ulong_t)((ht2 - ht1) / 1e6);

         /*
          * Calculez l’historique d’échec et effectuez les actions
* requises le cas échéant
          */
         (void) scds_fm_action(scds_handle,
             probe_result, (long)dt);
      }   /* Chaque ressource réseau */
   }    /* Conserver la détection */
}