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

Validate 方法

资源类型实现的 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_dependenciesResource_dependencies_weak 系统属性获得的。有关 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);
}

验证函数还应当记录资源验证失败的原因。不过,如果忽略细节(第 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() 函数的实现。