Guide du développeur de services de données Sun Cluster pour SE Solaris

Fonctionnement de la méthode Stop

Le gestionnaire RGM exécute la méthode d'Arrêt sur un nœud du cluster lorsque le groupe de ressources contenant la ressource HA-DNS passe hors ligne sur ce nœud ou si le groupe de ressources est en ligne et la ressource désactivée. Cette méthode arrête le démon in.named (DNS) sur ce nœud.

Cette rubrique décrit les principaux éléments de la méthode d'Arrêt pour l'application modèle. Cette rubrique ne décrit pas les fonctionnalités communes à toutes les méthodes de rappel, comme par exemple la fonction parse_args(). Par ailleurs, elle ne décrit pas l'utilisation de la fonction syslog(). Les fonctionnalités communes sont décrites à la rubrique Fonctionnalité commune à toutes les méthodes.

Pour la liste complète du code de la méthode Stop, reportez-vous à la rubrique Listing de code de la méthode Stop.

Fonction de la méthode Stop

Il existe deux points principaux à prendre en compte lors d'une tentative d'arrêt du service de données. D'une part, il convient de le fermer correctement. La meilleure façon d'effectuer un arrêt correct est d'envoyer un signal SIGTERM par l'intermédiaire de pmfadm.

D'autre part, il faut veiller à ce que le service de données soit effectivement arrêté afin d'éviter de le faire passer à l'état Échec_arrêt. La meilleure solution pour placer le service de données dans cet état est d'envoyer un signal SIGKILL par l'intermédiaire de pmfadm.

La méthode Stop du service de données modèle tient compte de ces deux considérations. Elle envoie d'abord un signal SIGTERM. Si ce signal ne parvient pas à arrêter le service de données, elle envoie un signal SIGKILL .

Avant de tenter d'arrêter le DNS, cette méthode d'Arrêt vérifie si le processus tourne effectivement. Si le processus est en cours d'exécution, Stop utilise la fonction PMF (pmfadm) pour l'arrêter.

L'idempotence de cette méthode Stop est garantie. Bien que le gestionnaire RGM ne doive pas appeler deux fois une méthode Stop sans démarrer au préalable le service de données par un appel à sa méthode Start, le RGM pourrait appeler une méthode Stop sur une ressource alors que celle-ci n'a jamais été démarrée ou s'est déjà arrêtée d'elle-même. C'est pourquoi cette méthode Arrêt se ferme correctement même si le DNS ne tourne pas.

Arrêt de l'application

La méthode Stop fournit une approche à deux niveaux d'arrêt du service de données : une approche ordonnée ou en douceur utilisant un signal SIGTERM par l'intermédiaire de pmfadm et une approche brutale utilisant un signal SIGKILL. La méthode Stop obtient la valeur Stop_timeout (le délai avant lequel la méthode Stop doit se terminer). Arrêt alloue alors 80 % de ce temps à un arrêt en douceur et 15 % à un arrêt abrupt (5 % sont réservés), de la manière indiquée dans l'exemple de code suivant.

STOP_TIMEOUT='scha_resource_get -O STOP_TIMEOUT -R $RESOURCE_NAME \
-G $RESOURCEGROUP_NAME'
((SMOOTH_TIMEOUT=$STOP_TIMEOUT * 80/100))
((HARD_TIMEOUT=$STOP_TIMEOUT * 15/100))

La méthode d'Arrêt utilise pmfadm -q pour vérifier si le démon DNS fonctionne. Si le démon DNS est en cours d'exécution, Stop utilise d'abord pmfadm -s pour envoyer un signal TERM afin de terminer le processus DNS. Si ce signal ne parvient pas à terminer le processus après 80 % de la valeur de délai d'attente, Stop envoie un signal SIGKILL. Si ce signal ne parvient pas non plus à terminer le processus après 15 % de la valeur de délai d'attente, la méthode consigne un message d'erreur et se termine avec un état d'erreur.

Si la commande pmfadm met un terme au processus, la méthode consigne un message indiquant l'arrêt du processus et se ferme correctement.

Si le processus DNS ne tourne pas, la méthode consigne un message l'indiquant et se ferme correctement. L'exemple de code suivant montre comment Stop utilise pmfadm pour arrêter le processus DNS.

# Voir si in.named est en cours d'exécution, et si oui, le tuer. 
if pmfadm -q $PMF_TAG; then
   # Envoyer un signal SIGTERM au service de données et attendre 80% 
   # de la valeur de délai d'attente totale.
   pmfadm -s $RESOURCE_NAME.named -w $SMOOTH_TIMEOUT TERM
   if [ $? -ne 0 ]; then
      logger -p ${SYSLOG_FACILITY}.err \
          -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
          “${ARGV0} Failed to stop HA-DNS with SIGTERM; Retry with \
           SIGKILL”
      
      # Comme le service de données ne s'est pas arrêté avec un signal SIGTERM, utiliser 
      # maintenant SIGKILL et attendre encore 15% de la valeur de délai d'attente totale.
      pmfadm -s $PMF_TAG -w $HARD_TIMEOUT KILL
      if [ $? -ne 0 ]; then
          logger -p ${SYSLOG_FACILITY}.err \
          -t [$SYSLOG_TAG] \
          “${ARGV0} Failed to stop HA-DNS; Exiting UNSUCCESSFUL”
         exit 1
      fi
fi
else 
   # Le service de données ne fonctionne pas pour l'instant. Consigner un message et 
   # quitter avec un code de succès.
   logger -p ${SYSLOG_FACILITY}.err \
           -t [$SYSLOG_TAG] \
           “HA-DNS is not started”

   # Même si HA-DNS ne fonctionne pas, quitter avec un code de succès afin d'éviter
  # de placer la ressource du service de données à l'état STOP_FAILED.
   exit 0
fi

# L'arrêt du DNS a réussi. Consigner un message et quitter avec un code de succès.
logger -p ${SYSLOG_FACILITY}.err \
    -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
    “HA-DNS successfully stopped”
exit 0

État d'Arrêt à la fermeture

Une méthode Stop ne doit pas se terminer avec un code de succès tant que l'application correspondante n'est pas effectivement arrêtée, particulièrement si d'autres services de données en dépendent. Dans le cas contraire, vous pourriez rencontrer une corruption de données.

Pour une application complexe telle qu'une base de données, dans le fichier RTR, veillez à définir pour la propriété Délai_arrêt une valeur suffisamment élevée pour que l'application se nettoie à l'arrêt.

Si cette méthode n'arrive pas à arrêter le DNS et se ferme en affichant un état d'échec, le RGM contrôle la propriété Mode_basculement, qui détermine la réaction à adopter. Le service de données modèle ne définit pas explicitement la propriété Failover_mode qui a donc la valeur par défaut NONE (sauf si l'administrateur du cluster remplace la valeur par défaut par une autre valeur). Dans ce cas, le gestionnaire RGM se contente de définir l'état du service de données sur Stop_failed. L'administrateur du cluster doit forcer l'arrêt de l'application et effacer l'état Stop_failed.