Le RGM appelle la méthode Validate quand une ressource est créée et quand un administrateur de cluster met à jour les propriétés de la ressource ou de son groupe. 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.
Le RGM n'appelle Validate que lorsqu'un administrateur de cluster modifie les propriétés de la ressource ou du groupe de ressources, ou lorsqu'un dispositif de surveillance définit les propriétés Status et Status_msg de la ressource. Le RGM n'appelle pas Validate lorsque le RGM définit les propriétés.
La méthode Monitor_check appelle également explicitement la méthode Validate à chaque fois que la méthode PROBE tente de basculer le service de données sur un autre noeud.
Le RGM appelle Validate avec des arguments supplémentaires, en plus de ceux qui sont transmis à d'autres méthodes, dont les propriétés et les valeurs qui sont 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 l'argument 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 conditions suivantes :
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); /* Return error if there is no confdir_list extension property */ if (confdirs == NULL || confdirs->array_cnt != 1) { scds_syslog(LOG_ERR, "Property Confdir_list is not set properly."); return (1); /* Validation failure */ }
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) { /* * suppress lint error because errno.h prototype * is missing void arg */ 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é Port_list 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 qui contient 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 */ } /* Return an error if there are no network address resources */ 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); /* return result of validation */
Avant de quitter, la méthode xfnts_validate appelle scds_close() pour récupérer les ressources affectées par scds_initialize (). Les pages de manuel Fonction scds_initialize() et scds_close(3HA) contiennent plus de détails.