Le RGM appelle la méthode Validate 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 Validate avant la création ou la mise à jour, et un code de sortie avec échec issu de la méthode sur un nœud entraîne l'annulation de la création ou de la mise à jour.
Il n'appelle Validate 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 Status et Status_msg de la ressource.
la méthode Monitor_check appelle aussi explicitement la méthode Validate lorsque la méthode PROBE tente de basculer le service de données sur un autre nœud.
Le RGM appelle Validate 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 xfnts_validate analyse tous les arguments que le RGM transmet à xfnts_validate et enregistre les informations dans le paramètre scds_handle. Les sous-routines appelées par xfnts_validate utilisent ces informations.
La méthode xfnts_validate appelle svc_validate() qui vérifie les éléments suivants :
La propriété Confdir_list 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 Confdir_list */ 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 Confdir_list 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 nœud 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); /* Échec de la validation */ } #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); /* Échec de la validation */ } #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); /* Échec de la validation */ } /* 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, svc_validate() 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 xfnts_validate appelle scds_close() pour récupérer les ressources allouées par scds_initialize(). Reportez-vous à la rubrique Fonction scds_initialize() et à la page de manuel scds_close(3HA) pour de plus amples informations.