数据服务样例实现 Validate 和 Update 方法,以处理群集管理员对特性进行的更新。
创建资源时以及通过管理操作更新资源或其资源组的特性时,RGM 将调用 Validate 方法。在进行创建或更新之前,RGM 将调用 Validate,任何节点上该方法返回失败出口代码都将导致创建或更新操作取消。
仅当通过管理操作更改资源或组特性时(而不是在 RGM 设置特性时或监视器设置资源特性 Status 和 Status_msg 时),RGM 才调用 Validate。
每当 PROBE 尝试将数据服务故障转移到新节点时,Monitor_check 方法也将明确调用 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)的更新或创建操作都将失败。
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)。
在 MAIN 函数中,Validate 首先将 CONFDIR 变量设置成空字符串,并将 UPDATE_PROPERTY 和 CONFDIR_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 在成功 (0) 状态下退出,则使用新值创建 Confdir。如果 Validate 在失败 (1) 状态下退出,将不会创建 Confdir 和其他任何特性,并向群集管理员发送一条说明失败原因的消息。
RGM 调用 Update 方法通知运行资源其特性已被更改。在通过管理操作成功地设置了资源或其组的特性后,RGM 将调用 Update。对资源处于联机状态的节点调用此方法。
Update 方法并不更新特性,此操作由 RGM 完成,而该方法将通知运行进程已进行了更新。数据服务样例中唯一受特性更新操作影响的进程是故障监视器,因此 Update 方法将停止和重启此进程。
Update 方法必须检验故障监视器是否正在运行,如果正在运行,将使用 pmfadm 终止该监视器。该方法将获取实现故障监视器的探测程序的位置,然后再次使用 pmfadm 重启该程序。
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 将使用 RT_BASEDIR 的值和 pmfadm 来重启 dns_probe 程序。如果成功,Update 将在成功状态下退出并向管理用户发送一条表明相应情况的消息。如果 pmfadm 无法启动该探测程序,Update 将在失败状态下退出并记录一条错误消息。
Update 方法的失败将导致资源处于“更新失败”状态。此状态对资源的 RGM 管理并无影响,但是它表明通过 syslog 工具更新管理工具的操作失败。