Sun Cluster 数据服务开发者指南(适用于 Solaris OS)

Validate 方法

RGM 会在两种情况下调用资源类型实现的 Validate 方法: 1) 创建资源类型的新资源时;2) 更新资源或资源组的特性时。 这两种方案可以根据传送到资源的 Validate 方法的命令行选项 -c(创建)或 -u(更新)是否存在来区分。

对一组节点中的每一个节点都调用 Validate 方法,其中该组节点都是由资源类型特性 INIT_NODES 的值定义的。 如果 INIT_NODES 设置为 RG_PRIMARIES,则将对每一个可以承载含有该资源的资源组的节点(主节点)调用 Validate。 如果 INIT_NODES 设置为 RT_INSTALLED_NODES,则将对每一个安装有资源类型软件的节点(通常是群集中的所有节点)调用 ValidateINIT_NODES 的缺省值为 RG_PRIMARIES(请参阅 rt_reg(4))。 调用 Validate 方法时,RGM 尚未创建资源(在创建回叫的情况下)或尚未应用所更新特性的更新后的值(在更新回叫的情况下)。 资源类型实现的 Validate 回叫方法的用途是检查所建议的资源设置(按照该资源的建议特性设置指定)是否适用于该资源类型。


注意:

如果您使用 HAStoragePlus 管理的本地文件系统,则使用 scds_hasp_check 检查 HAStoragePlus 资源的状态。使用为该资源定义的 Resource_dependenciesResource_dependencies_weak 系统特性,从资源依赖的所有 SUNW.HAStoragePlus(5) 资源中获取此信息。 有关 scds_hasp_check 调用返回的状态码的完整列表,请参阅 scds_hasp_check(3HA)


DSDL 函数 scds_initialize() 按以下方式处理这些情况:

假设实现资源特性验证的函数为 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() 系统调用,就可以很方便地实现此目的。