创建资源时,以及群集管理员更新资源的属性或其包含组时,RGM 将调用 Validate 方法。在进行创建或更新之前,RGM 将调用 Validate,任何节点上该方法返回失败出口代码都将导致创建或更新操作取消。
仅当群集管理员更改资源或资源组属性,或当监视器设置 Status 和 Status_msg 资源属性时,RGM 才会调用 Validate。RGM 在设置属性时不调用 Validate。
只要 PROBE 方法尝试将数据服务故障转移到新节点上,Monitor_check 方法还将显式调用 Validate 方法。
RGM 将对传递给其他方法的那些正被更新的属性和值调用 Validate 和其他参数。在 xfnts_validate 的开头调用 scds_initialize() 将解析 RGM 传递给 xfnts_validate 所有参数和存储在 scds_handle 参数中的信息。xfnts_validate 调用的子例行程序将使用此信息。
xfnts_validate 方法将调用 svc_validate() 以验证以下条件:
已经为该资源设置了 Confdir_list 属性并定义了一个目录。
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 */ }
Confdir_list 所指定的目录包含 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); }
该服务器守护进程二进制文件可以在该群集节点上访问。
if (stat("/usr/openwin/bin/xfs", &statbuf) != 0) { scds_syslog(LOG_ERR, "Cannot access XFS binary : <%s> ", strerror(errno)); return (1); }
Port_list 属性将指定单个端口。
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
包含数据服务的资源组还至少包含一个网络地址资源。
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; }
在返回之前,svc_validate() 将释放所有分配的资源。
finished: scds_free_net_list(snrlp); scds_free_port_list(portlist); return (rc); /* return result of validation */
退出前,xfnts_validate 方法将调用 scds_close() 以收回由 scds_initialize() 分配的资源。scds_initialize() 函数和 scds_close(3HA) 手册页包含更多信息。