La méthode de sonde_xfnts 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 de démarrage_détecteur_xfnts lance ce programme tandis que la méthode de rappel d'arrêt_détecteur_xfnts l'arrête.
/* * 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é. */ nom_hôte = 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(); /* Latch probe start time */ scds_syslog(LOG_INFO, “Probing the service on “ “port: %d.”, port); résultat_sonde = 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 */ } |