Guide des développeurs pour les services de données Sun Cluster 3.1 10/03

Gestion des mises à jour des propriétés

Le service de données modèle met en oeuvre les méthodes de Validation et de Mise_à_jour afin de gérer la mise à jour des propriétés par l'administrateur du cluster.

Méthode de Validation

Le RGM appelle la méthode de Validation lorsqu'un groupe est créé et lorsqu'une opération de l'administrateur met à jour les propriétés de la ressource ou du groupe qui la contient. Le RGM appelle Validation avant la création ou la mise à jour, et un code de sortie avec échec issu de la méthode sur un noeud entraîne l'annulation de la création ou de la mise à jour.

Il n'appelle Validation que lorsque les propriétés de la ressource ou du groupe sont modifiées par une opération de l'administrateur, et non lorsque le RGM définit des propriétés, ou lorsqu'un détecteur définit les propriétés de ressource Statut et msg_statut.


Remarque :

la méthode de Contrôle_détecteur appelle aussi explicitement la méthode de Validation lorsque la méthode de SONDE tente de basculer le service de données sur un autre noeud.


Présentation de Validation

Le RGM appelle Validation avec des arguments différents de ceux transmis aux autres méthodes, y compris les propriétés et valeurs mises à jour. C'est la raison pour laquelle cette méthode du service de données modèle doit mettre en oeuvre une fonction parse_args() pour gérer les autres arguments.

La méthode de Validation vérifie une seule propriété, la propriété d'extension Rép_conf. Cette propriété pointe vers le répertoire de configuration DNS, essentiel pour un bon fonctionnement du DNS.


Remarque :

le répertoire de configuration ne pouvant pas être modifié lorsque le DNS tourne, la propriété Rép_conf est déclarée RÉGLABLE = À_LA_CRÉATION dans le fichier RTR. C'est pourquoi la méthode de Validation n'est jamais appelée pour vérifier la propriété Rép_conf à la suite d'une mise à jour, mais uniquement à la création de la ressource du service de données.


Si Rép_conf est l'une des propriétés transmises par le RGM à Validation, la fonction parse_args() récupère et enregistre sa valeur. Validation vérifie alors si le répertoire vers lequel pointe la nouvelle valeur de Confdir est accessible et si le fichier named.conf existe dans ce répertoire et contient certaines données.

Si la fonction parse_args() ne peut pas récupérer la valeur de Rép_conf à partir des arguments de ligne de commande transmis par le RGM, Validation tente néanmoins de valider la propriété Rép_conf. Validation utilise scha_resource_get() pour obtenir la valeur de Confdir à partir de la configuration statique. Ensuite, elle effectue les mêmes contrôles afin de s'assurer que le répertoire de configuration est accessible et contient un fichier named.conf qui ne soit pas vierge.

Si Validation se ferme en affichant un état d'échec, la mise à jour ou la création de toutes les propriétés, et pas seulement de Rép_conf, échoue.

Fonction d'analyse de la méthode de Validation

Le RGM transmet à la méthode de Validation un ensemble de paramètres différent de celui des autres méthodes de rappel, de telle manière que Validation a besoin d'une autre fonction d'analyse des arguments que les autres méthodes. Reportez-vous à la page de manuel rt_callbacks(1HA) pour de plus amples informations sur les paramètres transmis à Validation et aux autres méthodes de rappel. L'exemple suivant montre la fonction Validation parse_args().


#########################################################################
# Analyser les arguments Validation
#
function parse_args # [args...]
{

   typeset opt
   while getopts 'cur:x:g:R:T:G:' opt
   do
         case "$opt" in
         R)
                  # Nom de la ressource DNS
                  NOM_RESSOURCE=$OPTARG
                  ;;
         G)
                  # Nom du groupe dans lequel est configurée
                  # la ressource.
                  NOM_GROUPE_RESSOURCE=$OPTARG
                  ;;
         T)
                  # Nom du type de ressource.
                  NOM_TYPE_RESSOURCE=$OPTARG
                  ;;
         r)
                  # La méthode n'accède pas à des propriétés définies
                  # par le système. Aucune action.
                  ;;
         g)
                  # La méthode n'accède pas à des propriétés du groupe de
                  # ressources. Aucune action.
                  ;;
         c)
                  # Indique que la méthode de Validation est appelée lors
                  # de la création de la ressource. Indicateur sans action.
                  ;;
         u)
                  # Indique la mise à jour d'une propriété quand la
                  # ressource existe déjà. Si la mise à jour est adressée
                  # à la propriété Rép_conf, alors Rép_conf doit apparaître dans
                  # les arguments de ligne de commande. Dans le cas contraire,
                  # la méthode doit le rechercher à l'aide de scha_resource_get.
                  UPDATE_PROPERTY=1
                  ;;
         x)
                  # Liste des propriétés d'extension. Séparer les couples propriété et
                  # valeur en utilisant "=" comme séparateur.
                  PROPRIÉTÉ=`echo $OPTARG | awk -F= '{print $1}'`
                  VAL=`echo $OPTARG | awk -F= '{print $2}'`
                  # Si la propriété d'extension se trouve sur la ligne de
                  # commande, noter sa valeur.
                  if [ $PROPERTY == "Confdir" ]; then
                           RÉP_CONF=$VAL
                           CONFDIR_FOUND=1
                  fi
                  ;;
         *)
                  logger -p ${SYSLOG_FACILITY}.err \
                  -t [$SYSLOG_TAG] \
                  "ERROR: Option $OPTARG unknown"
                  exit 1
                  ;;
         esac
   done
}

Comme la fonction parse_args() des autres méthodes, cette fonction propose un indicateur (R) pour capturer le nom de la ressource, (G) pour capturer le nom du groupe de ressources et ( T) pour capturer le type de ressource transmis par le RGM.

Les indicateurs r (propriété définie par le système), g (propriété du groupe de ressources) et c (validation à la création de la ressource) sont ignorés parce que cette méthode est appelée pour valider une propriété d'extension lors de la mise à jour de la ressource.

L'indicateur u définit la variable de shell UPDATE_PROPERTY à 1 (TRUE). Le témoin x capture les noms et les valeurs des propriétés mises à jour. Si Rép_conf est l'une des propriétés mises à jour, sa valeur est placée dans la variable de shell CONFDIR et la variable CONFDIR_FOUND est réglée sur 1 (TRUE).

Validation de Rép_conf

Dans sa fonction MAIN, Validate attribue d'abord une chaîne vide à la variable CONFDIR et une valeur 0 à UPDATE_PROPERTY et à CONFDIR_FOUND.


CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

Validation appelle ensuite parse_args() pour analyser les arguments transmis par le RGM.


parse_args “$@”

Validation vérifie alors si Validation est appelée à la suite d'une mise à jour des propriétés et si la propriété d'extension Rép_conf se trouvait sur la ligne de commande. Validation vérifie alors si la propriété Rép_conf a une valeur et, si ce n'est pas le cas, elle se ferme en affichant un état d'échec et émet un message d'erreur.


if ( (( $UPDATE_PROPERTY == 1 )) &&  (( CONFDIR_FOUND == 0 )) ); then
         info_config=`scha_resource_get -O Extension -R $RESOURCE_NAME \
            -G $RESOURCEGROUP_NAME Confdir`
         CONFDIR=`echo $config_info | awk '{print $2}'`
fi

# Vérifier que la propriété Rép_conf possède une valeur. Dans le cas contraire, il y a échec
# et sortie avec l'état 1
if [[ -z $CONFDIR ]]; then
         logger -p ${SYSLOG_FACILITY}.err \
            "${ARGV0} Validate method for resource "$RESOURCE_NAME " failed"
         exit 1
fi


Remarque :

le code précédent vérifie tout spécialement si Validation est appelée à la suite d'une mise à jour ($UPDATE_PROPERTY == 1 ) et si la propriété n'a pas été trouvée dans la ligne de commande (CONFDIR_FOUND == 0), auquel cas il récupère la valeur existante de Rép_conf à l'aide de scha_resource_get (). Si Rép_conf a été trouvé dans la ligne de commande ( CONFDIR_FOUND == 1), la valeur de RÉP_CONF provient de la fonction parse_args(), et non de scha_resource_get().


La méthode de Validation utilise alors la valeur de RÉP_CONF pour vérifier si le répertoire est accessible. Si ce n'est pas le cas, Validation consigne un message d'erreur et se ferme en affichant un état d'échec.


# Vérifier si $CONFDIR est accessible.
if [ ! -d $CONFDIR ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} Directory $CONFDIR missing or not mounted"
   exit 1
fi

Avant de valider la mise à jour de la propriété Rép_conf, Validation effectue un contrôle final pour vérifier si le fichier named.conf est présent. Si ce n'est pas le cas, la méthode enregistre un message d'erreur et se ferme en affichant un état d'échec.


# Vérifier si le fichier named.conf est présent dans le répertoire Rép_conf
if [ ! -s $CONFDIR/named.conf ]; then
         logger -p ${SYSLOG_FACILITY}.err \
            -t [$SYSLOG_TAG] \
            "${ARGV0} File $CONFDIR/named.conf is missing or empty"
         exit 1
fi

Si le dernier contrôle réussit, Validation consigne un message indiquant une réussite et se ferme avec un état de réussite.


# Consigner un message indiquant que la méthode de Validation a réussi.
logger -p ${SYSLOG_FACILITY}.err \
   -t [$SYSLOG_TAG] \
   "${ARGV0} Validate method for resource "$RESOURCE_NAME \
   " completed successfully"

exit 0

État de Validation à la fermeture

Si Validation se ferme avec succès (0) Rép_conf est créé avec la nouvelle valeur. Si Validation se ferme avec un échec (1), Rép_conf et les autres propriétés ne sont pas créées et un message indiquant la raison de cet échec est envoyé à l'administrateur du cluster.

Méthode de Mise_à_jour

Le RGM appelle la méthode de Mise_à_jour pour notifier à une ressource en cours d'exécution que ses propriétés ont changé. Le RGM appelle Mise_à_jour après la réussite d'une action de l'administrateur visant à définir les propriétés d'une ressource ou de son groupe. Cette méthode est appelée sur les noeuds lorsque la ressource est en ligne.

Présentation de Mise_à_jour

La méthode de Mise_à_jour ne met pas les propriétés à jour, cette opération est effectuée par le RGM. Par contre, elle notifie la mise à jour aux processus. Le seul processus du service de données modèle affecté par une mise à jour des propriétés est le détecteur de pannes. C'est donc ce processus qu'arrête et que démarre la méthode de Mise_à_jour.

La méthode de Mise_à_jour doit vérifier que le détecteur de pannes tourne, puis le tuer à l'aide de la commande pmfadm. La méthode obtient l'emplacement du programme de sonde mettant en oeuvre le détecteur de pannes, puis le redémarre à l'aide de pmfadm.

Arrêt du détecteur à l'aide de Mise_à_jour

La méthode de Mise_à_jour utilise pmfadm -q pour vérifier que le détecteur tourne et, si c'est le cas, le tue à l'aide de la commande pmfadm -s TERM. Si le détecteur se ferme correctement, un message le signalant est envoyé à l'administrateur. Dans le cas contraire, Mise_à_jour se ferme en affichant un état d'échec et envoie un message d'erreur à l'administrateur.


if pmfadm -q $RESOURCE_NAME.monitor; then

# Tuer le détecteur en cours d'exécution
pmfadm -s $PMF_TAG TERM
    if [ $? -ne 0 ]; then
       logger -p ${SYSLOG_FACILITY}.err \
              -t [$SYSLOG_TAG] \
                 "${ARGV0} Could not stop the monitor"
       exit 1
    else
    # Arrêt du DNS fructueux. Consigner un message.
       logger -p ${SYSLOG_FACILITY}.err \
              -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                 "Monitor for HA-DNS successfully stopped"
    fi

Redémarrage du détecteur

Pour redémarrer le détecteur, la méthode de Mise_à_jour doit localiser le script mettant en oeuvre le programme de sonde. Le programme de sonde réside dans le répertoire de base du service de données, vers lequel pointe la propriété Rép_base_TR. Mise_à_jour récupère la valeur de Rép_base_TR et l'enregistre dans la variable RÉP_BASE_TR , de la manière suivante :


RÉP_BASE_TR=`scha_resource_get -O RÉP_BASE_TR -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAMÈ

Mise_à_jour utilise alors la valeur de RÉP_BASE_TR avec la commande pmfadm pour redémarrer le programme de sonde_dns. S'il y réussit, Mise_à_jour se ferme avec succès et envoie un message le signalant à l'administrateur. Si pmfadm ne peut pas lancer le programme de sonde, Mise_à_jour se ferme en affichant un état d'échec et consigne un message d'erreur.

État de Mise_à_jour à la fermeture

L'échec de la méthode de Mise_à_jour entraîne le passage de son état à “update failed” ("échec de la mise à jour"). Cet état n'affecte en rien la gestion RGM de la ressource, mais indique l'échec de l'opération de mise à jour aux outils d'administration par le biais de la fonction syslog.