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

Conception du démon du détecteur de pannes

Les mises en œuvre du type de ressource utilisant la BDSD possèdent généralement un démon du détecteur de pannes assumant les responsabilités suivantes :

Les utilitaires BDSD sont conçus de manière à ce que la boucle principale du démon du détecteur de pannes soit représentée par le pseudo-code suivant :

Pour les détecteurs de pannes mis en œuvre par le biais de BDSD :

Dans la plupart des cas, le contrôle de santé spécifique à l'application peut être mis en œuvre dans un utilitaire autonome distinct (svc_probe(), par exemple) et intégré à cette boucle principale générique :


for (;;) { 

   / * Sommeil pendant la durée de l'intervalle Intervalle_sonde_complet 
   *  entre des sondages successifs. */
   (void) scds_fm_sleep(scds_handle,
   scds_get_rs_thorough_probe_interval(scds_handle));

   /* Sonde de toutes les adresses IP utilisées. Passage en boucle sur
   * 1. Toutes les ressources net utilisées.
   * 2. Toutes les adresses IP d'une ressource donnée.
   * Pour chacune des adresses sondées,
   * calcul de l'historique des pannes. */
   probe_result = 0;
   /* Itération dans toutes les ressources pour obtenir toutes
    * les adresses IP à utiliser pour l'appel de svc_probe() */
   for (ip = 0; ip < netaddr->num_netaddrs; ip++) {
   /* Obtention du nom de l'hôte et du port dont
   * la santé doit être surveillée.
   */
   hostname = netaddr->netaddrs[ip].hostname;
   port = netaddr->netaddrs[ip].port_proto.port;
   /*
   * HA-XFS ne prend en charge qu'un seul port et
   * obtient donc la valeur du port à partir de la
   * première entrée du tableau des ports.
   */
   ht1 = gethrtime(); /* Blocage de l'heure de démarrage de sondage */
   probe_result = svc_probe(scds_handle, 

   hostname, port, timeout);
   /*
   * Mise à jour de l'historique des sondages du service,
   * action si nécessaire.
   * Blocage de l'heure de fin de sondage.
   */
   ht2 = gethrtime();
   /* Conversion en millisecondes */
   dt = (ulong_t)((ht2 - ht1) / 1e6);

   /*
   * Calcul de l'historique des pannes et
   * action si nécessaire
   */
   (void) scds_fm_action(scds_handle,
   probe_result, (long)dt);
   }       /* Chaque ressource net */
   }       /* Toujours continuer le sondage */