Le RGM appelle la méthode de Validation quand une ressource est créée et quand une opération de l'administrateur met à jour les propriétés de la ressource ou du groupe la contenant. 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 Statut et msg_statut de la ressource.
la méthode 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.
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. L'appel destiné à scds_initialize() au début de validation_xfnts analyse tous les arguments que le RGM transmet à validation_xfnts et enregistre les informations dans le paramètre scds_handle. Les sous-routines appelées par validation_xfnts utilisent ces informations.
La méthode de validation_xfnts appelle validation_svc() qui vérifie les éléments suivants :
La propriété Liste_rép_conf a été paramétrée pour la ressource et définit un répertoire unique.
scha_str_array_t *confdirs; confdirs = scds_get_ext_confdir_list(scds_handle); /* Renvoi d'une erreur en l'absence d'une propriété d'extension liste_rép_conf */ if (confdirs == NULL || confdirs->array_cnt != 1) { scds_syslog(LOG_ERR, "Property Confdir_list is not set properly."); return (1); /* Erreur de validation */ }
Le répertoire spécifié par Liste_rép_conf contient le fichier fontserver.cfg.
(void) sprintf(xfnts_conf, "%s/fontserver.cfg", confdirs->str_array[0]); if (stat(xfnts_conf, &statbuf) != 0) { /* * Suppression de l'erreur parce que le prototype errno.h * ne possède pas d'argument vide */ scds_syslog(LOG_ERR, "Failed to access file <%s> : <%s>", xfnts_conf, strerror(errno)); /*lint !e746 */ return (1); }
Le binaire du démon du serveur est accessible sur le noeud du cluster.
if (stat("/usr/openwin/bin/xfs", &statbuf) != 0) { scds_syslog(LOG_ERR, "Cannot access XFS binary : <%s> ", strerror(errno)); return (1); }
La propriété Liste_ports spécifie un port unique.
scds_port_list_t *portlist; err = scds_get_port_list(scds_handle, &portlist); if (err != SCHA_ERR_NOERR) { scds_syslog(LOG_ERR, "Could not access property Port_list: %s.", scds_error_string(err)); return (1); /* Validation Failure */ } #ifdef TEST if (portlist->num_ports != 1) { scds_syslog(LOG_ERR, "Property Port_list must have only one value."); scds_free_port_list(portlist); return (1); /* Validation Failure */ } #endif
Le groupe de ressources contenant le service de données contient également au moins une ressource d'adresse réseau.
scds_net_resource_list_t *snrlp; if ((err = scds_get_rs_hostnames(scds_handle, &snrlp)) != SCHA_ERR_NOERR) { scds_syslog(LOG_ERR, "No network address resource in resource group: %s.", scds_error_string(err)); return (1); /* Validation Failure */ } /* Renvoi d'une erreur en l'absence de ressources d'adresse réseau */ if (snrlp == NULL || snrlp->num_netresources == 0) { scds_syslog(LOG_ERR, "No network address resource in resource group."); rc = 1; goto finished; }
Avant son renvoi, validation_svc() libère toutes les ressources allouées.
finished: scds_free_net_list(snrlp); scds_free_port_list(portlist); return (rc); /* renvoi du résultat de la validation */
avant sa fermeture, la méthode de validation_xfnts appelle scds_close() pour récupérer les ressources allouées par scds_initialize(). Reportez-vous à la rubrique Fonction scds_initialize() et à la page scds_close(3HA) du manuel pour plus de détails.