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

处理特性更新

数据服务样例实现 ValidateUpdate 方法,以处理群集管理员对特性进行的更新。

Validate 方法

创建资源时以及通过管理操作更新资源或其资源组的特性时,RGM 将调用 Validate 方法。 在进行创建或更新之前,RGM 将调用 Validate,任何节点上该方法返回失败出口代码都将导致创建或更新操作取消。

仅当通过管理操作更改资源或组特性时(而不是在 RGM 设置特性时或监视器设置资源特性 StatusStatus_msg 时),RGM 才调用 Validate


注意:

PROBE 方法试图将数据服务故障切换到新节点时,Monitor_check 方法还显式调用 Validate 方法。


Validate 概述

RGM 通过不同于传送到其它方法的变量的附加变量(包括所更新的特性和值)调用 Validate。 因此,在数据服务样例中此方法必须实现一个不同的 parse_args() 函数以处理附加变量。

数据服务样例中的 Validate 方法用来检验单个特性 Confdir 扩展特性。 此特性指向 DNS 配置目录,这对于能否成功地进行 DNS 操作来说至关重要。


注意:

因为在 DNS 运行时无法更改配置目录,RTR 文件中 Confdir 特性被声明为 TUNABLE = AT_CREATION。 因此,进行更新后将永远不会调用 Validate 方法来检验 Confdir 特性,仅当创建数据服务资源时才会调用。


如果 Confdir 是 RGM 传送到 Validate 的特性之一,则 parse_args() 函数将进行检索并保存其值。 然后 Validate 将检验通过 Confdir 的新值所指向的目录是否可以存取,并检验在该目录中 named.conf 文件是否存在并包含有数据。

如果 parse_args() 函数无法从 RGM 传送的命令行变量中检索到 Confdir 的值,Validate 仍将尝试验证 Confdir 特性。 Validate 使用 scha_resource_get() 从静态配置中获取 Confdir 的值。 然后它将执行相同的检查操作,以检验该配置目录是否可以存取并包含非空的 named.conf 文件。

如果 Validate 在失败状态下退出,所有特性(而不仅仅是 Confdir)的更新或创建操作都将失败。

Validate 方法分析函数

RGM 将向 Validate 方法传送一组与其它回叫方法不同的参数,因此 Validate 需要使用与其它方法的函数不同的函数来分析变量。 有关传送到 Validate 以及其它回叫方法的参数的详细信息,请参阅 rt_callbacks(1HA) 手册页。 以下内容说明了 Validate parse_args() 函数。


#########################################################################
# Parse Validate arguments.
#
function parse_args # [args...]
{

   typeset opt
   while getopts 'cur:x:g:R:T:G:' opt
   do
         case "$opt" in
         R)
                  # Name of the DNS resource.
                  RESOURCE_NAME=$OPTARG
                  ;;
         G)
                  # Name of the resource group in which the resource is
                  # configured.
                  RESOURCEGROUP_NAME=$OPTARG
                  ;;
         T)
                  # Name of the resource type.
                  RESOURCETYPE_NAME=$OPTARG
                  ;;
         r)
                  # The method is not accessing any system defined
                  # properties so this is a no-op
                  ;;
         g)
                  # The method is not accessing any resource group
                  # properties, so this is a no-op
                  ;;
         c)
                  # Indicates the Validate method is being called while
                  # creating the resource, so this flag is a no-op.
                  ;;
         u)
                  # Indicates the updating of a property when the
                  # resource already exists. If the update is to the
                  # Confdir property then Confdir should appear in the 
                  # command-line arguments. If it does not, the method must 
                  # look for it specifically using scha_resource_get.
                  UPDATE_PROPERTY=1
                  ;;
         x)
                  # Extension property list. Separate the property and 
                  # value pairs using "=" as the separator.
                  PROPERTY=`echo $OPTARG | awk -F= '{print $1}'`
                  VAL=`echo $OPTARG | awk -F= '{print $2}'`
                  # If the Confdir extension property is found on the 
                  # command line, note its value. 
                  if [ $PROPERTY == "Confdir" ]; then
                           CONFDIR=$VAL
                           CONFDIR_FOUND=1
                  fi
                  ;;
         *)
                  logger -p ${SYSLOG_FACILITY}.err \
                  -t [$SYSLOG_TAG] \
                  "ERROR: Option $OPTARG unknown"
                  exit 1
                  ;;
         esac
   done
}

与其它方法的 parse_args() 函数一样,此函数将提供一个用于捕获资源名称的标记 (R)、用于捕获资源组名称的标记 (G) 和用于捕获 RGM 所传送的资源类型的标记 (T)。

将忽略 r 标记(用于表示系统定义的特性)、g 标记(用于表示资源组特性)和 c 标记(用于表示在创建资源时已进行了检验),因为当更新资源时将调用此方法来验证扩展特性。

u 标记将 UPDATE_PROPERTY shell 变量的值设置为 1 (TRUE)。 x 标记捕获所更新的特性的名称和值。 如果 Confdir 是所更新的特性之一,则其值将放置在 CONFDIR shell 变量中,且变量 CONFDIR_FOUND 将设置为 1 (TRUE)。

验证 Confdir

MAIN 函数中,Validate 首先将 CONFDIR 变量设置成空字符串,并将 UPDATE_PROPERTYCONFDIR_FOUND 设置成 0。


CONFDIR=""
UPDATE_PROPERTY=0
CONFDIR_FOUND=0

然后,Validate 将调用 parse_args() 分析 RGM 传送的变量。


parse_args “$@”

Validate 随后将检查特性更新后是否调用了 Validate,并检查 Confdir 扩展特性是否位于命令行上。 接下来,Validate 将检验 Confdir 特性是否具有值,如果没有,将在失败状态下退出并记录一条错误消息。


if ( (( $UPDATE_PROPERTY == 1 )) &&  (( CONFDIR_FOUND == 0 )) ); then
         config_info=`scha_resource_get -O Extension -R $RESOURCE_NAME \
            -G $RESOURCEGROUP_NAME Confdir`
         CONFDIR=`echo $config_info | awk '{print $2}'`
fi

# Verify that the Confdir property has a value. If not there is a failure
# and exit with status 1
if [[ -z $CONFDIR ]]; then
         logger -p ${SYSLOG_FACILITY}.err \
            "${ARGV0} Validate method for resource "$RESOURCE_NAME " failed"
         exit 1
fi


注意:

具体地说,上述代码将检查更新后 ($UPDATE_PROPERTY == 1) 是否调用了 Validate,并检查该特性是否位于命令行上,如果在命令行上 (CONFDIR_FOUND == 0),它将使用 scha_resource_get() 检索 Confdir 的现有值。 如果发现 Confdir 位于命令行上 (CONFDIR_FOUND == 1),则 CONFDIR 的值由 parse_args() 函数确定,而不是由 scha_resource_get() 确定。


然后,Validate 方法将使用 CONFDIR 的值检验该目录是否可以存取。 如果不可以存取,Validate 将记录一条错误消息并在错误状态下退出。


# Check if $CONFDIR is accessible.
if [ ! -d $CONFDIR ]; then
   logger -p ${SYSLOG_FACILITY}.err \
         -t [$SYSLOG_TAG] \
         "${ARGV0} Directory $CONFDIR missing or not mounted"
   exit 1
fi

在验证 Confdir 特性的更新之前,Validate 将执行 final 检查来检验 named.conf 文件是否存在。 如果不存在,该方法将记录一条错误消息并在错误状态下退出。


# Check that the named.conf file is present in the Confdir directory
if [ ! -s $CONFDIR/named.conf ]; then
         logger -p ${SYSLOG_FACILITY}.err \
            -t [$SYSLOG_TAG] \
            "${ARGV0} File $CONFDIR/named.conf is missing or empty"
         exit 1
fi

如果该 final 检查通过,Validate 将记录一条表明检查成功的消息并在成功状态下退出。


# Log a message indicating that the Validate method was successful.
logger -p ${SYSLOG_FACILITY}.err \
   -t [$SYSLOG_TAG] \
   "${ARGV0} Validate method for resource "$RESOURCE_NAME \
   " completed successfully"

exit 0

Validate 退出状态

如果 Validate 在成功 (0) 状态下退出,则使用新值创建 Confdir。 如果 Validate 在失败 (1) 状态下退出,将不会创建 Confdir 和其它任何特性并记录一条消息,说明发送至群集管理员的原因。

Update 方法

RGM 调用 Update 方法通知运行资源其特性已被更改。 在设置资源及其组的特性过程中成功地执行了管理操作后,RGM 将调用 Update。 在资源联机的节点上调用此方法。

Update 概述

Update 方法并不更新特性,此操作由 RGM 完成, 而该方法将通知运行进程已进行了更新。 数据服务样例中唯一受特性更新操作影响的进程是故障监视器,因此 Update 方法将停止和重启此进程。

Update 方法必须检验故障监视器是否正在运行,如果正在运行,将使用 pmfadm 终止该监视器。 该方法将获取实现故障监视器的探测程序的位置,然后再次使用 pmfadm 重启该程序。

使用 Update 停止监视器

Update 方法将使用 pmfadm -q 检验监视器是否正在运行,如果正在运行,它将使用 pmfadm -s TERM 终止该监视器。 成功终止监视器后,将向管理用户发送表明相应情况的消息。 如果无法停止监视器,Update 将在失败状态下退出并向管理用户发送一条错误消息。


if pmfadm -q $RESOURCE_NAME.monitor; then

# Kill the monitor that is running already
pmfadm -s $PMF_TAG TERM
    if [ $? -ne 0 ]; then
       logger -p ${SYSLOG_FACILITY}.err \
              -t [$SYSLOG_TAG] \
                 "${ARGV0} Could not stop the monitor"
       exit 1
    else
    # could successfully stop DNS. Log a message.
       logger -p ${SYSLOG_FACILITY}.err \
              -t [$RESOURCETYPE_NAME,$RESOURCEGROUP_NAME,$RESOURCE_NAME] \
                 "Monitor for HA-DNS successfully stopped"
    fi

重启监视器

要重新启动监视器,Update 方法必须定位实现探测程序的脚本。 该探测程序驻留在数据服务的基目录上,由 Rt_basedir 特性指向该目录。 Update 将检索 Rt_basedir 的值并将其存储在 RT_BASEDIR 变量中,如下所示。


RT_BASEDIR=`scha_resource_get -O RT_BASEDIR -R $RESOURCE_NAME -G \
$RESOURCEGROUP_NAME`

然后,Update 将通过 pmfadm 使用 RT_BASEDIR 的值来重启 dns_probe 程序。 如果成功,Update 将在成功状态下退出并向管理用户发送一条表明相应情况的消息。 如果 pmfadm 无法启动该探测程序,Update 将在失败状态下退出并记录一条错误消息。

Update 退出状态

Update 方法的失败将导致资源处于“更新失败”状态。 此状态对资源的 RGM 管理并无影响,但是它表明通过 syslog 工具更新管理工具的操作失败。