资源类型实现的 Validate 回调方法用于检查提议的资源设置(由对资源提议的属性设置指定)对于资源类型来说是否可以接受。
在以下两种情况下,资源组管理器 (RGM) 将调用资源类型实现的 Validate 方法:
创建属于该资源类型的新资源时
更新资源或资源组的属性时
这两种情况可以通过传递给资源的 Validate 方法的命令行选项是 -c(创建)还是 -u(更新)进行区分。
Validate 方法在节点集的每个节点上都要调用,该节点集由资源类型属性 Init_nodes 的值定义。如果 Init_nodes 设置为 RG_PRIMARIES,则在可以托管包含资源的资源组的每个节点(主节点)上调用 Validate。如果 Init_nodes 设置为 RT_INSTALLED_NODES,则在安装资源类型软件的每个节点(通常是群集中的所有节点)上调用 Validate。
Init_nodes 的默认值为 RG_PRIMARIES(请参见 rt_reg(4) 手册页)。在调用 Validate 方法时,RGM 尚未创建资源(在创建回调的情况下)或尚未应用正被更新的属性的更新值(在更新回调的情况下)。
如果使用的是由 HAStoragePlus 资源类型管理的本地文件系统,请使用 scds_hasp_check() 函数检查该资源类型的状态。此信息来自该资源所依赖的所有 SUNW.HAStoragePlus 资源的状态(联机或脱机),它是通过使用为该资源定义的 Resource_dependencies 或 Resource_dependencies_weak 系统属性获得的。有关 scds_hasp_check() 函数返回的状态代码的完整列表,请参见 scds_hasp_check(3HA) 手册页。
DSDL 函数 scds_initialize() 按照以下方式处理这些情况:
如果正在创建资源,则通过命令行传递提议资源属性时,scds_initialize() 就会将其解析。这样,您就可以使用提议资源属性值,就好像已在系统中创建了该资源一样。
如果正在更新资源或资源组,则从命令行读入正被群集管理员更新的提议属性值。其他属性(其属性值尚未被更新)则通过使用资源管理 API 从 Sun Cluster 读入。如果使用的是 DSDL,则无需考虑这些任务。可以验证某个资源的所有属性是否均可用。
假设实现资源属性验证的函数名为 svc_validate(),该函数使用 scds_get_name() 系列函数查看要验证的属性。假定可接受的资源设置由此函数的 0 返回代码表示,则资源类型的 Validate 方法可表示为以下代码段:
int main(int argc, char *argv[]) { scds_handle_t handle; int rc; if (scds_initialize(&handle, argc, argv)!= SCHA_ERR_NOERR) { return (1); /* Initialization Error */ } rc = svc_validate(handle); scds_close(&handle); return (rc); }
验证函数还应当记录资源验证失败的原因。不过,如果忽略细节(第 8 章,DSDL 资源类型实现样例包含更实际的验证函数处理),可以实现更简单的示例 svc_validate() 函数,如下所示:
int svc_validate(scds_handle_t handle) { scha_str_array_t *confdirs; struct stat statbuf; confdirs = scds_get_confdir_list(handle); if (stat(confdirs->str_array[0], &statbuf) == -1) { return (1); /* Invalid resource property setting */ } return (0); /* Acceptable setting */ }
因此,只需考虑 svc_validate() 函数的实现。