RGM invoca el método Validate cuando se crea un recurso y cuando una acción administrativa 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 invoca Validate sólo cuando se cambian las propiedades del recurso o del grupo mediante una acción administrativa, no cuando RGM establece las propiedades ni cuando un supervisor establece las propiedades de recurso Status y Status_msg.
El método Monitor_check invoca también explícitamente el método Validate cuando el método PROBE intenta realizar una operación de recuperación de fallos del servicio de datos a otro nodo.
RGM invoca Validate con argumentos adicionales a los que se pasan a otros métodos, incluidos las propiedades y los valores que se están actualizando. La llamada a scds_initialize() al principio de xfnts_validate analiza todos los argumentos que RGM pasa a xfnts_validate y guarda la información en el parámetro scds_handle. Las subrutinas que invoca xfnts_validate utilizan esta información.
El método xfnts_validate invoca svc_validate(), que verifica lo siguiente.
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); /* Devolver error si no hay una propiedad de extensión confdir_list */ if (confdirs == NULL || confdirs->array_cnt != 1) { scds_syslog(LOG_ERR, "La propiedad Confdir_list no se ha establecido adecuadamente."); return (1); /* Fallo de validación */ }
El directorio que especifica Confdir_list contiene el archivo fontserver.cfg.
(void) sprintf(xfnts_conf, "%s/fontserver.cfg", confdirs->str_array[0]); if (stat(xfnts_conf, &statbuf) != 0) { /* * suprimir el error lint porque el prototipo de errno.h * no tiene un argumento vacío */ scds_syslog(LOG_ERR, "No se ha podido acceder al archivo <%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, "No se puede acceder al binario XFS: <%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, "No se puede acceder a la propiedad Port_list: %s.", scds_error_string(err)); return (1); /* Fallo de validación */ } #ifdef TEST if (portlist->num_ports != 1) { scds_syslog(LOG_ERR, "La propiedad Port_list sólo debe tener un valor."); scds_free_port_list(portlist); return (1); /* Fallo de validación */ } #endif
El grupo de recursos que contiene el servicio de datos incluye 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 existe un recurso de dirección de la red " "en el grupo de recursos: %s.", scds_error_string(err)); return (1); /* Fallo de validación */ } /* Devolver un error si no hay recursos de dirección de red */ if (snrlp == NULL || snrlp->num_netresources == 0) { scds_syslog(LOG_ERR, "No existe un recurso de dirección de la red en el grupo" "de recursos."); 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); /* devolver el resultado de la validación */
Antes de salir, el método xfnts_validate invoca scds_close() para reclamar los recursos asignados por scds_initialize(). Consulte Función scds_initialize() y la página de comando man scds_close(3HA) para obtener más detalles.