RGM 会在两种情况下调用资源类型实现的 Validate 方法: 1) 创建资源类型的新资源时;2) 更新资源或资源组的特性时。 这两种方案可以根据传送到资源的 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 尚未创建资源(在创建回叫的情况下)或尚未应用所更新特性的更新后的值(在更新回叫的情况下)。 资源类型实现的 Validate 回叫方法的用途是检查所建议的资源设置(按照该资源的建议特性设置指定)是否适用于该资源类型。
如果您使用 HAStoragePlus 管理的本地文件系统,则使用 scds_hasp_check 检查 HAStoragePlus 资源的状态。使用为该资源定义的 Resource_dependencies 或 Resource_dependencies_weak 系统特性,从资源依赖的所有 SUNW.HAStoragePlus(5) 资源中获取此信息。 有关 scds_hasp_check 调用返回的状态码的完整列表,请参阅 scds_hasp_check(3HA)。
DSDL 函数 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); } |
该验证函数还应记录资源验证失败的原因。 如果不考虑相应细节内容(有关对验证函数的更为实际的处理方法,请参阅下一章),简单的 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() 函数的实现任务。 资源类型实现的典型实例可以确保名为 app.conf 的应用程序配置文件存在于 Confdir_list 特性中。 通过对源自 Confdir_list 特性的相应路径名进行 stat() 系统调用,就可以很方便地实现此目的。