创建资源时和通过管理操作更新资源的特性或资源所包含的组的特性时,RGM 将调用 Validate 方法。在进行创建或更新之前,RGM 将调用 Validate,如果从任何节点上的方法返回失败出口代码都将导致创建或更新操作取消。
仅当通过管理操作更改资源或组特性时(而不是在 RGM 设置特性时或监视器设置资源特性 Status 和 Status_msg 时),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) 手册页。