RGM llama al método Validate cuando se crea un recurso y el administrador del clúster actualiza las propiedades del recurso o del grupo que lo contiene. RGM invoca Validate antes de que se apliquen la creación o la actualización y un código de salida fallido del método en cualquier nodo provoque la cancelación de la creación o actualización.
RGM sólo llama a Validate cuando el administrador del clúster cambia las propiedades de un recurso o un grupo de recursos, o cuando un supervisor establece las propiedades de recursos Status y Status_msg. RGM no llama a Validate cuando esta herramienta establece las propiedades.
El método Monitor_check también llama de forma explícita a Validate cada vez que el método PROBE intenta realizar una recuperación ante fallos del servicio de datos en un nuevo nodo.
RGM llama a Validate con argumentos adicionales a aquéllos transferidos a otros métodos, incluidos los valores y las propiedades que se están actualizando. La llamada a scds_initialize() al comienzo de xfnts_validate analiza todos los argumentos que RGM pasa a xfnts_validate y almacena la información en el argumento scds_handle. La subrutinas invocadas por xfnts_validate utilizan esta información.
El método xfnts_validate llama a svc_validate(), que comprueba las siguientes condiciones:
La propiedad Confdir_list del recurso se ha configurado y define un único directorio.
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 */ }
El directorio especificado por Confdir_list contiene el archivo 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); }
El binario del daemon de servidor está accesible en el nodo del clúster.
if (stat("/usr/openwin/bin/xfs", &statbuf) != 0) { scds_syslog(LOG_ERR, "Cannot access XFS binary : <%s> ", strerror(errno)); return (1); }
La propiedad Port_list especifica un solo puerto.
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
El grupo de recursos que contiene el servicio de datos debe contener también, al menos, un recurso de dirección de red.
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; }
Antes de retornar, svc_validate() libera todos los recursos asignados.
finished: scds_free_net_list(snrlp); scds_free_port_list(portlist); return (rc); /* return result of validation */
Antes de salir, el método xfnts_validate llama a scds_close() para reclamar los recursos asignados por scds_initialize (). Para obtener más información, consulte Función scds_initialize() y la página de comando man scds_close(3HA)