File fix-sg_persist-commented-byLars.patch of Package resource-agents.1159
Index: resource-agents-3.9.5+git335/heartbeat/sg_persist
===================================================================
--- resource-agents-3.9.5+git335.orig/heartbeat/sg_persist
+++ resource-agents-3.9.5+git335/heartbeat/sg_persist
@@ -4,7 +4,7 @@
# OCF Resource Agent compliant PERSISTENT SCSI RESERVATION resource script.
#
#
-# Copyright (c) 2011 Evgeny Nifontov, All Rights Reserved.
+# Copyright (c) 2011 Evgeny Nifontov and lwang@suse.com All Rights Reserved.
#
# "Heartbeat drbd OCF Resource Agent: 2007, Lars Marowsky-Bree" was used
# as example of multistate OCF Resource Agent.
@@ -29,7 +29,6 @@
# Inc., 59 Temple Place - Suite 330, Boston MA 02111-1307, USA.
#
#
-
# OCF instance parameters
# OCF_RESKEY_sg_persist_resource
# OCF_RESKEY_config_file
@@ -38,79 +37,8 @@
# OCF_RESKEY_reservation_type
# OCF_RESKEY_master_score_base
# OCF_RESKEY_master_score_dev_factor
-
-#. This resource agent manages SCSI PERSISTENT RESERVATIONS.
-#. "sg_persist" from sg3_utils is used, please read its documentation.
-#. Should be used as multistate (Master/Slave) resource
-#. Slave registers its node id ("crm_node -i") as reservation key ( --param-rk ) on each device in the "devs" list.
-#. Master reservs all devices from "devs" list with reservation "--prout-type" value from "reservation_type" parameter.
-#.
-#. OCF_RESKEY_sg_persist_resource
-#. ------------------------------
-#. The name of the sg_persist resource. This parameter is required.
-#.
-#. OCF_RESKEY_config_file
-#. ----------------------
-#. Full path to the sg_persist resource configuration file. Default /etc/sg_persist.conf
-#. Configuration file should be owned by "root" and can only be writable by owner.
-#. The config file is sourced as shell script with ". \$config_file".
-#. It should provide a function with a name "sg_persist_resource_\$sg_persist_resource_name"
-#. which is then called (with no parameters).
-#. Resorce init functions for several sg_persist resources can be put in one configuration file.
-#.
-#. Config file example for sg_persist_resource=MDRAID1:
-#. ...............................
-#. sg_persist_resource_MDRAID1() {
-#. devs="/dev/sdd /dev/sde"
-#. required_devs_nof=2
-#. }
-#. ...............................
-#.
-#. Configuration file can be used for any resource parameter other then sg_persist_resource and config_file.If some parameter is specified in config file and also as crm resource parameter - the value from crm is used.
-#.
-#.
-#. OCF_RESKEY_devs
-#. ---------------
-#. Device list - required, couldn't be empty
-#. "echo \$devs" is actually used, so shell wildcars are allowed.
-#.
-#. OCF_RESKEY_required_devs_nof
-#. ----------------------------
-#. Minimum number of "working" devices from device list "devs":
-#. 1) existing
-#. 2) "sg_persist --read-keys \$device" works (Return code 0)
-#. resorce actions "start","monitor","promote" and "validate-all" return "\$OCF_ERR_INSTALLED" if the actual number of "working" devices is less then "required_devs_nof".
-#. resorce actions "stop" and "demote" tries to remove reservations and registration keys from all working devices, but always return "\$OCF_SUCCESS"
-#. Default 1
-#.
-#. OCF_RESKEY_reservation_type
-#. ---------------------------
-#. reservation type, used for --prout-type option of "sg_persist" command
-#. Default 1 - "write exclusive"
-#.
-#. OCF_RESKEY_master_score_base
-#. ----------------------------
-#. "master_score_base" value is used in "master_score" calculation:
-#. master_score = \$master_score_base + \$master_score_dev_factor * \$working_devs
-#. if set to bigger value in sg_persist resource configuration file on some node, this node will be "preferred" for master role.
-#. Default 0
-#.
-#. OCF_RESKEY_master_score_dev_factor
-#. ----------------------------------
-#. Working device factor in master_score calculation - each "working" device provides additional value to "master_score", so the node that sees more devices will be preferred for the "Master"-role
-#. Setting it to 0 will disable this behavior.
-#. Default 100
-#.
-#. OCF_RESKEY_master_score_delay
-#. ----------------------------------
-#. master decreases its master_score after delay of \$master_score_delay seconds
-#. slave increases ist master_score after delay of \$master_score_delay seconds
-#. so if some device gets inaccessible, the slave decreases its master_score first and the resource will no be sweatched
-#. and after this device reappears again the master increases its master_score first
-#. this can work only if the master_score_delay is bigger then monitor interval on both master and slave
-#. Setting it to 0 will disable this behavior.
-#. Default 30
-
+#
+#
# TODO
#
# 1) PROBLEM: devices which were not accessible during 'start' action, will be never registered/reserved
@@ -120,20 +48,24 @@
#######################################################################
# Initialization:
-[ -z "$OCF_ROOT" ] && exit 5
-[ -d ${OCF_ROOT}/resource.d/heartbeat ] && OCF_FUNCTIONS_DIR="${OCF_ROOT}/resource.d/heartbeat"
-[ -d ${OCF_ROOT}/lib/heartbeat ] && OCF_FUNCTIONS_DIR="${OCF_ROOT}/lib/heartbeat"
-
-[ -z "$OCF_FUNCTIONS_DIR" ] && exit 5
-[ -e ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs ] && OCF_SHELLFUNCS="${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs"
-[ -e ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs ] && OCF_SHELLFUNCS="${OCF_FUNCTIONS_DIR}/ocf-shellfuncs"
+#[ -z "$OCF_ROOT" ] && exit 5
+#[ -d ${OCF_ROOT}/resource.d/heartbeat ] && OCF_FUNCTIONS_DIR="${OCF_ROOT}/resource.d/heartbeat"
+#[ -d ${OCF_ROOT}/lib/heartbeat ] && OCF_FUNCTIONS_DIR="${OCF_ROOT}/lib/heartbeat"
+
+#[ -z "$OCF_FUNCTIONS_DIR" ] && exit 5
+#[ -e ${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs ] && OCF_SHELLFUNCS="${OCF_FUNCTIONS_DIR}/.ocf-shellfuncs"
+#[ -e ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs ] && OCF_SHELLFUNCS="${OCF_FUNCTIONS_DIR}/ocf-shellfuncs"
-[ -z "$OCF_SHELLFUNCS" ] && exit 5
-. $OCF_SHELLFUNCS
+#[ -z "$OCF_SHELLFUNCS" ] && exit 5
+#. $OCF_SHELLFUNCS
+
+: ${OCF_FUNCTIONS_DIR=${OCF_ROOT}/lib/heartbeat}
+. ${OCF_FUNCTIONS_DIR}/ocf-shellfuncs
#######################################################################
+
# uncomment the next line for debugging messages
-HA_debug=1
+# HA_debug=1
RESOURCE="$OCF_RESKEY_sg_persist_resource"
@@ -156,52 +88,94 @@ Master reservs all devices from "devs" l
<parameters>
<parameter name="sg_persist_resource" unique="1" required="1">
<longdesc lang="en">
-The name of the sg_persist resource. This parameter is required.
+The name of the sg_persist resource.
</longdesc>
<shortdesc lang="en">sg_persist resource name</shortdesc>
<content type="string"/>
</parameter>
+
<parameter name="config_file" unique="1" required="0">
<longdesc lang="en">
-Full path to the sg_persist resource configuration file. Default /etc/sg_persist.conf
+Full path to the sg_persist resource configuration file.
+Configuration file should be owned by "root" and can only be writable by owner.
+The config file is sourced as shell script with ". \$config_file".
+It should provide a function with a name "sg_persist_resource_\$sg_persist_resource_name"
+which is then called (with no parameters).
+Resorce init functions for several sg_persist resources can be put in one configuration file.
+ Config file example for sg_persist_resource=MDRAID1:
+ ...............................
+ sg_persist_resource_MDRAID1() {
+ devs="/dev/sdd /dev/sde"
+ required_devs_nof=2
+ }
+ ...............................
</longdesc>
<shortdesc lang="en">Path to sg_persist.conf</shortdesc>
-<content type="string"/>
+<content type="string" default="/etc/sg_persist.conf"/>
</parameter>
-<parameter name="devs" unique="1" required="0">
+
+<parameter name="devs" unique="0" required="1">
<longdesc lang="en">
-Device list - required, couldn't be empty
+Device list. Shell wildcars are allowed.
</longdesc>
<shortdesc lang="en">device list</shortdesc>
<content type="string"/>
</parameter>
-<parameter name="required_devs_nof" unique="1" required="0">
+
+<parameter name="required_devs_nof" unique="0" required="0">
<longdesc lang="en">
-Minimum number of "working" devices from device list. Default 1
+Minimum number of "working" devices from device list
+ 1) existing
+ 2) "sg_persist --read-keys \$device" works (Return code 0)
+resource actions "start","monitor","promote" and "validate-all" return "\$OCF_ERR_INSTALLED"
+if the actual number of "working" devices is less then "required_devs_nof".
+resource actions "stop" and "demote" tries to remove reservations and registration keys from
+all working devices, but always return "\$OCF_SUCCESS"
</longdesc>
<shortdesc lang="en">minimum number of working devices</shortdesc>
<content type="string" default="1"/>
</parameter>
-<parameter name="reservation_type" unique="1" required="0">
+
+<parameter name="reservation_type" unique="0" required="0">
<longdesc lang="en">
-reservation type. Default type 1: write_exclusive
+reservation type
</longdesc>
<shortdesc lang="en">reservation type</shortdesc>
-<content type="string"/>
+<content type="string" default="1" />
</parameter>
-<parameter name="master_score_base" unique="1" required="0">
+
+<parameter name="master_score_base" unique="0" required="0">
<longdesc lang="en">
-master_score_base value. Default 0
+master_score_base value
+"master_score_base" value is used in "master_score" calculation:
+master_score = \$master_score_base + \$master_score_dev_factor * \$working_devs
+if set to bigger value in sg_persist resource configuration file on some node, this node will be "preferred" for master role.
</longdesc>
<shortdesc lang="en">base master_score value</shortdesc>
-<content type="string"/>
+<content type="string" default="0" />
</parameter>
-<parameter name="master_score_dev_factor" unique="1" required="0">
+
+<parameter name="master_score_dev_factor" unique="0" required="0">
<longdesc lang="en">
-Working device factor in master_score calculation. Default 100
+Working device factor in master_score calculation
+each "working" device provides additional value to "master_score",
+so the node that sees more devices will be preferred for the "Master"-role
+Setting it to 0 will disable this behavior.
</longdesc>
<shortdesc lang="en">working device factor in master_score calculation</shortdesc>
-<content type="string"/>
+<content type="string" default="100" />
+</parameter>
+
+<parameter name="master_score_delay" unique="0" required="0">
+<longdesc lang="en">
+master/slave decreases/increases its master_score after delay of \$master_score_delay seconds
+so if some device gets inaccessible, the slave decreases its master_score first and the resource will no be sweatched
+and after this device reappears again the master increases its master_score first
+this can work only if the master_score_delay is bigger then monitor interval on both master and slave
+Setting it to 0 will disable this behavior.
+</longdesc>
+<shortdesc lang="en">master_score decrease/increase delay time</shortdesc>
+<content type="string" default="30" />
</parameter>
</parameters>
@@ -224,13 +198,12 @@ END
sg_persist_do_cmd() {
local cmd="$*"
- ocf_log debug "$RESOURCE: Calling $cmd"
+
local cmd_out
cmd_out=$($cmd)
ret=$?
- if [ $ret -ne 0 ]
- then
+ if [ $ret -ne 0 ]; then
ocf_log err "$RESOURCE: Exit code $ret"
ocf_log err "$RESOURCE: Command output: $cmd_out"
else
@@ -245,37 +218,30 @@ sg_persist_do_cmd() {
sg_persist_init() {
- if ocf_is_root
- then
- :
- else
+ if ! ocf_is_root ; then
ocf_log err "You must be root to perform this operation."
exit $OCF_ERR_PERM
- fi
+ fi
: ${SG_PERSIST:=sg_persist}
check_binary $SG_PERSIST
ROLE=$OCF_RESKEY_CRM_meta_role
- NOW=`date +%s`
+ NOW=$(date +%s)
MASTER_SCORE_VAR_NAME="master-${OCF_RESOURCE_INSTANCE}"
PENDING_VAR_NAME="pending-$MASTER_SCORE_VAR_NAME"
#only works with corocync ???
CRM_NODE="${HA_SBIN_DIR}/crm_node"
- if [ -z "$RESOURCE" ]
- then
+ if [ -z "$RESOURCE" ]; then
ocf_log err "sg_persist_resource not defined."
- if [ "$FORCE_OCF_SUCCESS" != "YES" ]
- then
- exit $OCF_ERR_INSTALLED
- fi
+ exit $OCF_ERR_INSTALLED
fi
- NODE_ID_DEC=`$CRM_NODE -i`
+ NODE_ID_DEC=$($CRM_NODE -i)
- NODE=`$CRM_NODE -l | $GREP $NODE_ID_DEC`
+ NODE=$($CRM_NODE -l | $GREP $NODE_ID_DEC)
NODE=${NODE#$NODE_ID_DEC }
NODE=${NODE% *}
@@ -283,52 +249,39 @@ sg_persist_init() {
CRM_MASTER="${HA_SBIN_DIR}/crm_master --lifetime=reboot"
PENDING_ATTRIBUTE="${HA_SBIN_DIR}/crm_attribute --lifetime=reboot --name=$PENDING_VAR_NAME --node=$NODE"
- NODE_ID_HEX=`printf '0x%x' $NODE_ID_DEC`
+ NODE_ID_HEX=$(printf '0x%x' $NODE_ID_DEC)
- if [ -z "$NODE_ID_HEX" ]
- then
+ if [ -z "$NODE_ID_HEX" ]; then
ocf_log err "Couldn't get node id with \"$CRM_NODE\""
- if [ "$FORCE_OCF_SUCCESS" != "YES" ]
- then
- exit $OCF_ERR_INSTALLED
- fi
+ exit $OCF_ERR_INSTALLED
fi
ocf_log debug "$RESOURCE: NODE:$NODE, ROLE:$ROLE, NODE_ID DEC:$NODE_ID_DEC HEX:$NODE_ID_HEX"
- CLONE_NO="$OCF_RESKEY_CRM_meta_clone"
-
+ # default configure file path
SG_PERSIST_CONF="${OCF_RESKEY_config_file:=/etc/sg_persist.conf}"
+ if [ -f "$SG_PERSIST_CONF" ]; then
+ sg_persist_read_config
+ fi
+
# no default value for device list
- devs=""
+ DEVS=${OCF_RESKEY_devs:=""}
# default number of required devices
- required_devs_nof=1
-
+ REQUIRED_DEVS_NOF=${OCF_RESKEY_required_devs_nof:=1}
+
# default reservation type
- reservation_type=1
-
+ RESERVATION_TYPE=${OCF_RESKEY_reservation_type:=1}
+
# default master score base
- master_score_base=0
+ MASTER_SCORE_BASE=${OCF_RESKEY_master_score_base:=0}
# default device factor for master score
- master_score_dev_factor=100
+ MASTER_SCORE_DEV_FACTOR=${OCF_RESKEY_master_score_dev_factor:=100}
# default delay for master score
- master_score_delay=30
-
- if [ -f "$SG_PERSIST_CONF" ]
- then
- sg_persist_read_config
- fi
-
- DEVS=${OCF_RESKEY_devs:=$devs}
- REQUIRED_DEVS_NOF=${OCF_RESKEY_required_devs_nof:=$required_devs_nof}
- RESERVATION_TYPE=${OCF_RESKEY_reservation_type:=$reservation_type}
- MASTER_SCORE_BASE=${OCF_RESKEY_master_score_base:=$master_score_base}
- MASTER_SCORE_DEV_FACTOR=${OCF_RESKEY_master_score_dev_factor:=$master_score_dev_factor}
- MASTER_SCORE_DELAY=${OCF_RESKEY_master_score_delay:=$master_score_delay}
+ MASTER_SCORE_DELAY=${OCF_RESKEY_master_score_delay:=30}
ocf_log debug "$RESOURCE: DEVS=$DEVS"
ocf_log debug "$RESOURCE: REQUIRED_DEVS_NOF=$REQUIRED_DEVS_NOF"
@@ -340,13 +293,9 @@ sg_persist_init() {
#expand path wildcards
DEVS=$(echo $DEVS)
- if [ -z "$DEVS" ]
- then
+ if [ -z "$DEVS" ]; then
ocf_log err "\"devs\" not defined"
- if [ "$FORCE_OCF_SUCCESS" != "YES" ]
- then
- exit $OCF_ERR_INSTALLED
- fi
+ exit $OCF_ERR_INSTALLED
fi
sg_persist_check_devs
@@ -355,56 +304,25 @@ sg_persist_init() {
sg_persist_read_config() {
- OWNER_UID=`stat --format %u $SG_PERSIST_CONF`
- DO_SOURCE_FILE='YES'
-
- if [ $OWNER_UID -ne 0 ]
- then
+ if [ -O $SG_PERSIST_CONF ]; then
+ . $SG_PERSIST_CONF
+ else
ocf_log err "resource configuration file \"$SG_PERSIST_CONF\" not owned by \"root\""
- DO_SOURCE_FILE='NO'
- if [ "$FORCE_OCF_SUCCESS" != "YES" ]
- then
- exit $OCF_ERR_INSTALLED
- fi
- fi
-
- ACCESS_RIGHTS=`stat --format %A $SG_PERSIST_CONF`
- GROUP_WRITE=${ACCESS_RIGHTS:5:1}
- OTHER_WRITE=${ACCESS_RIGHTS:8:1}
-
- if [ "$GROUP_WRITE$OTHER_WRITE" != "--" ]
- then
- ocf_log err "resource configuration file \"$SG_PERSIST_CONF\" writable not only by owner"
- DO_SOURCE_FILE='NO'
- if [ "$FORCE_OCF_SUCCESS" != "YES" ]
- then
- exit $OCF_ERR_INSTALLED
- fi
- fi
-
- if [ "$DO_SOURCE_FILE" == "YES" ]
- then
- . $SG_PERSIST_CONF
+ exit $OCF_ERR_INSTALLED
fi
unset DEVS
unset REQUIRED_DEVS_NOF
declare -F sg_persist_resource_$RESOURCE >/dev/null 2>&1
- if [ $? -eq 0 ]
- then
+ if [ $? -eq 0 ]; then
sg_persist_resource_$RESOURCE
else
ocf_log err "Function sg_persist_resource_$RESOURCE not defined in $SG_PERSIST_CONF"
- if [ "$FORCE_OCF_SUCCESS" != "YES" ]
- then
- exit $OCF_ERR_INSTALLED
- fi
+ exit $OCF_ERR_INSTALLED
fi
}
-#######################################################################
-
sg_persist_action_usage() {
cat <<END
usage: $0 {start|stop|monitor|validate-all|promote|demote|notify|meta-data}
@@ -420,30 +338,21 @@ sg_persist_get_status() {
for dev in ${EXISTING_DEVS[*]}
do
READ_KEYS=`sg_persist_do_cmd $SG_PERSIST --in --read-keys $dev`
- READ_KEYS_RET=$?
-
- if [ $READ_KEYS_RET -eq 0 ]
- then
+ if [ $? -eq 0 ]; then
WORKING_DEVS+=($dev)
echo $READ_KEYS | $GREP $NODE_ID_HEX >/dev/null
- if [ $? -eq 0 ]
- then
+ if [ $? -eq 0 ]; then
REGISTERED_DEVS+=($dev)
READ_RESERVATION=`sg_persist_do_cmd $SG_PERSIST --in --read-reservation $dev`
- READ_RESERVATION_RET=$?
-
- if [ $READ_RESERVATION_RET -eq 0 ]
- then
+ if [ $? -eq 0 ]; then
echo $READ_RESERVATION | $GREP $NODE_ID_HEX >/dev/null
- if [ $? -eq 0 ]
- then
+ if [ $? -eq 0 ]; then
RESERVED_DEVS+=($dev)
fi
reservation_key=`echo $READ_RESERVATION | $GREP -o 'Key=0x[0-9a-f]*' | $GREP -o '0x[0-9a-f]*'`
- if [ "$reservation_key" != "" ]
- then
+ if [ -n "$reservation_key" ]; then
DEVS_WITH_RESERVATION+=($dev)
RESERVATION_KEYS+=($reservation_key)
fi
@@ -471,20 +380,15 @@ sg_persist_check_devs() {
for dev in $DEVS
do
- if [ -e "$dev" ]
- then
+ if [ -e "$dev" ]; then
EXISTING_DEVS+=($dev)
fi
done
EXISTING_DEVS_NOF=${#EXISTING_DEVS[*]}
- if [ $EXISTING_DEVS_NOF -lt $REQUIRED_DEVS_NOF ]
- then
+ if [ $EXISTING_DEVS_NOF -lt $REQUIRED_DEVS_NOF ]; then
ocf_log err "Number of existing devices=$EXISTING_DEVS_NOF less then required_devs_nof=$REQUIRED_DEVS_NOF"
- if [ "$FORCE_OCF_SUCCESS" != "YES" ]
- then
- exit $OCF_ERR_INSTALLED
- fi
+ exit $OCF_ERR_INSTALLED
fi
}
@@ -492,8 +396,7 @@ sg_persist_check_devs() {
sg_persist_is_registered() {
for registered_dev in ${REGISTERED_DEVS[*]}
do
- if [ "$registered_dev" == "$1" ]
- then
+ if [ "$registered_dev" == "$1" ]; then
return 0
fi
done
@@ -503,8 +406,7 @@ sg_persist_is_registered() {
sg_persist_get_reservation_key() {
for array_index in ${!DEVS_WITH_RESERVATION[*]}
do
- if [ "${DEVS_WITH_RESERVATION[$array_index]}" == "$1" ]
- then
+ if [ "${DEVS_WITH_RESERVATION[$array_index]}" == "$1" ]; then
echo ${RESERVATION_KEYS[$array_index]}
return 0
fi
@@ -517,20 +419,17 @@ sg_persist_action_start() {
sg_persist_do_cmd $MASTER_SCORE_ATTRIBUTE --update=$MASTER_SCORE
sg_persist_do_cmd $PENDING_ATTRIBUTE --update=""
- if [ $WORKING_DEVS_NOF -lt $REQUIRED_DEVS_NOF ]
- then
- ocf_log err "$RESOURCE: Number of working devices=$WORKING_DEVS_NOF less then required_devs_nof=$REQUIRED_DEVS_NOF"
- exit $OCF_ERR_GENERIC
+ if [ $WORKING_DEVS_NOF -lt $REQUIRED_DEVS_NOF ]; then
+ ocf_log err "$RESOURCE: Number of working devices=$WORKING_DEVS_NOF less then required_devs_nof=$REQUIRED_DEVS_NOF"
+ exit $OCF_ERR_GENERIC
fi
for dev in ${WORKING_DEVS[*]}
do
- if sg_persist_is_registered $dev
- then
+ if sg_persist_is_registered $dev ; then
: OK
else
sg_persist_do_cmd $SG_PERSIST --out --register --param-rk=0 --param-sark=$NODE_ID_HEX $dev
- sg_persist --in --read-status $dev
if [ $? -ne 0 ]
then
return $OCF_ERR_GENERIC
@@ -543,8 +442,7 @@ sg_persist_action_start() {
sg_persist_action_stop() {
- if [ ${#REGISTERED_DEVS[*]} -eq 0 ]
- then
+ if [ ${#REGISTERED_DEVS[*]} -eq 0 ]; then
ocf_log debug "$RESOURCE stop: already no registrations"
else
# Clear preference for becoming master
@@ -563,6 +461,7 @@ sg_persist_action_stop() {
sg_persist_echo_array() {
str_count=0
arr_str=""
+
for str in "$@"
do
arr_str="$arr_str[$str_count]:$str "
@@ -576,16 +475,14 @@ sg_persist_parse_act_pending() {
ACT_PENDING_TS=0
ACT_PENDING_SCORE=0
- if [ -n "$ACT_PENDING" ]
- then
+ if [ -n "$ACT_PENDING" ]; then
ACT_PENDING_TS=${ACT_PENDING%%_*}
ACT_PENDING_SCORE=${ACT_PENDING##*_}
fi
}
sg_persist_clear_pending() {
- if [ -n "$ACT_PENDING" ]
- then
+ if [ -n "$ACT_PENDING" ]; then
DO_PENDING_UPDATE="YES"
NEW_PENDING=""
fi
@@ -619,22 +516,20 @@ sg_persist_action_monitor() {
DO_PENDING_UPDATE="NO"
if [ -n "$ACT_MASTER_SCORE" ]
then
- if [ $ACT_MASTER_SCORE -ne $MASTER_SCORE ]
- then
- if [ "$ROLE" == "Master" ]
- then
- if [ $MASTER_SCORE -lt $ACT_MASTER_SCORE ]
- then
+ if [ $ACT_MASTER_SCORE -eq $MASTER_SCORE ]; then
+ sg_persist_clear_pending
+ else
+ case $ROLE in
+ Master)
+ if [ $MASTER_SCORE -lt $ACT_MASTER_SCORE ]; then
if [ -n "$ACT_PENDING" ]
then
- if [ $(($NOW-$ACT_PENDING_TS-$MASTER_SCORE_DELAY)) -ge 0 ]
- then
+ if [ $(($NOW-$ACT_PENDING_TS-$MASTER_SCORE_DELAY)) -ge 0 ]; then
sg_persist_new_master_score $MASTER_SCORE
sg_persist_clear_pending
fi
else
- if [ $MASTER_SCORE_DELAY -eq 0 ]
- then
+ if [ $MASTER_SCORE_DELAY -eq 0 ]; then
sg_persist_new_master_score $MASTER_SCORE
sg_persist_clear_pending
else
@@ -645,19 +540,17 @@ sg_persist_action_monitor() {
sg_persist_new_master_score $MASTER_SCORE
sg_persist_clear_pending
fi
- else
- if [ $MASTER_SCORE -gt $ACT_MASTER_SCORE ]
- then
- if [ -n "$ACT_PENDING" ]
- then
- if [ $(($NOW-$ACT_PENDING_TS-$MASTER_SCORE_DELAY)) -ge 0 ]
- then
+ ;;
+
+ Slave)
+ if [ $MASTER_SCORE -gt $ACT_MASTER_SCORE ]; then
+ if [ -n "$ACT_PENDING" ]; then
+ if [ $(($NOW-$ACT_PENDING_TS-$MASTER_SCORE_DELAY)) -ge 0 ]; then
sg_persist_new_master_score $MASTER_SCORE
sg_persist_clear_pending
fi
else
- if [ $MASTER_SCORE_DELAY -eq 0 ]
- then
+ if [ $MASTER_SCORE_DELAY -eq 0 ]; then
sg_persist_new_master_score $MASTER_SCORE
sg_persist_clear_pending
else
@@ -668,39 +561,35 @@ sg_persist_action_monitor() {
sg_persist_new_master_score $MASTER_SCORE
sg_persist_clear_pending
fi
- fi
- else
- sg_persist_clear_pending
+ ;;
+
+ *)
+ ;;
+
+ esac
fi
fi
- if [ $DO_MASTER_SCORE_UPDATE == "YES" ]
- then
+ if [ $DO_MASTER_SCORE_UPDATE == "YES" ]; then
sg_persist_do_cmd $MASTER_SCORE_ATTRIBUTE --update=$NEW_MASTER_SCORE
fi
- if [ $DO_PENDING_UPDATE == "YES" ]
- then
+ if [ $DO_PENDING_UPDATE == "YES" ]; then
sg_persist_do_cmd $PENDING_ATTRIBUTE --update=$NEW_PENDING
fi
- if [ ${#REGISTERED_DEVS[*]} -eq 0 ]
- then
+ if [ ${#REGISTERED_DEVS[*]} -eq 0 ]; then
ocf_log debug "$RESOURCE monitor: no registrations"
return $OCF_NOT_RUNNING
fi
- if [ ${#RESERVED_DEVS[*]} -gt 0 ]
- then
+ if [ ${#RESERVED_DEVS[*]} -eq ${#WORKING_DEVS[*]} ]; then
return $OCF_RUNNING_MASTER
fi
- if [ ${#REGISTERED_DEVS[*]} -gt 0 ]
- then
- if [ $RESERVATION_TYPE -eq 7 ] || [ $RESERVATION_TYPE -eq 8]
- then
- if [ ${#DEVS_WITH_RESERVATION[*]} -gt 0 ]
- then
+ if [ ${#REGISTERED_DEVS[*]} -eq ${#WORKING_DEVS[*]} ]; then
+ if [ $RESERVATION_TYPE -eq 7 ] || [ $RESERVATION_TYPE -eq 8]; then
+ if [ ${#DEVS_WITH_RESERVATION[*]} -gt 0 ]; then
return $OCF_RUNNING_MASTER
else
return $OCF_SUCCESS
@@ -717,8 +606,7 @@ sg_persist_action_monitor() {
sg_persist_action_promote() {
- if [ ${#RESERVED_DEVS[*]} -gt 0 ]
- then
+ if [ ${#RESERVED_DEVS[*]} -gt 0 ]; then
ocf_log info "$RESOURCE promote: already master"
return $OCF_SUCCESS
fi
@@ -726,26 +614,23 @@ sg_persist_action_promote() {
for dev in ${WORKING_DEVS[*]}
do
reservation_key=`sg_persist_get_reservation_key $dev`
- echo "RK=$reservation_key"
- if [ $RESERVATION_TYPE -eq 1 ] || [ $RESERVATION_TYPE -eq 3 ] || [ $RESERVATION_TYPE -eq 5 ] || [ $RESERVATION_TYPE -eq 6 ]
- then
- if [ "$reservation_key" == "" ]
- then
+ case $RESERVATION_TYPE in
+ 1|3|5|6)
+ if [ -z "$reservation_key" ]; then
sg_persist_do_cmd $SG_PERSIST --out --reserve --param-rk=$NODE_ID_HEX --prout-type=$RESERVATION_TYPE $dev
- if [ $? -ne 0 ]
- then
+ if [ $? -ne 0 ]; then
return $OCF_ERR_GENERIC
fi
else
sg_persist_do_cmd $SG_PERSIST --out --preempt --param-sark=$reservation_key --param-rk=$NODE_ID_HEX --prout-type=$RESERVATION_TYPE $dev
- if [ $? -ne 0 ]
- then
+ if [ $? -ne 0 ]; then
return $OCF_ERR_GENERIC
fi
fi
- else
- if [ "$reservation_key" == "" ]
- then
+ ;;
+
+ 7|8)
+ if [ -z "$reservation_key" ]; then
sg_persist_do_cmd $SG_PERSIST --out --reserve --param-rk=$NODE_ID_HEX --prout-type=$RESERVATION_TYPE $dev
if [ $? -ne 0 ]
then
@@ -755,38 +640,54 @@ sg_persist_action_promote() {
ocf_log info "$RESOURCE promote: there already exist an reservation holder, all registrants become reservation holders"
return $OCF_SUCCESS
fi
- fi
+ ;;
+
+ *)
+ return $OCF_ERR_ARGS
+ ;;
+
+ esac
done
return $OCF_SUCCESS
}
sg_persist_action_demote() {
- #in case of 7/8, --release won't release the reservation unless unregister the key.
- if [ $RESERVATION_TYPE -eq 7 ] || [ $RESERVATION_TYPE -eq 8 ]
- then
- if [ ${#REGISTERED_DEVS[*]} -eq 0 ]
- then
+ case $RESERVATION_TYPER in
+ 1|3|5|6)
+ if [ ${#RESERVED_DEVS[*]} -eq 0 ]; then
ocf_log info "$RESOURCE demote: already slave"
return $OCF_SUCCESS
fi
- for dev in ${REGISTERED_DEVS[*]}
+ for dev in ${RESERVED_DEVS[*]}
do
- sg_persist_do_cmd $SG_PERSIST --out --register --param-rk=$NODE_ID_HEX --param-sark=0 $dev
+ sg_persist_do_cmd $SG_PERSIST --out --release --param-rk=$NODE_ID_HEX --prout-type=$RESERVATION_TYPE $dev
+ if [ $? -ne 0 ]; then
+ return $OCF_ERR_GENERIC
+ fi
done
- else
- if [ ${#RESERVED_DEVS[*]} -eq 0 ]
- then
+ ;;
+
+ 7|8) #in case of 7/8, --release won't release the reservation unless unregister the key.
+ if [ ${#REGISTERED_DEVS[*]} -eq 0 ]; then
ocf_log info "$RESOURCE demote: already slave"
return $OCF_SUCCESS
fi
- for dev in ${RESERVED_DEVS[*]}
+ for dev in ${REGISTERED_DEVS[*]}
do
- sg_persist_do_cmd $SG_PERSIST --out --release --param-rk=$NODE_ID_HEX --prout-type=$RESERVATION_TYPE $dev
+ sg_persist_do_cmd $SG_PERSIST --out --register --param-rk=$NODE_ID_HEX --param-sark=0 $dev
+ if [ $? -ne 0 ]; then
+ return $OCF_ERR_GENERIC
+ fi
done
- fi
+ ;;
+
+ *)
+ return $OCF_ERR_ARGS
+ ;;
+ esac
return $OCF_SUCCESS
}
@@ -807,20 +708,17 @@ sg_persist_action_notify() {
}
sg_persist_action_validate_all () {
- if [ -n "$SG_PERSIST_CONF" ] && [ ! -f "$SG_PERSIST_CONF" ]
- then
+ if [ -n "$SG_PERSIST_CONF" ] && [ ! -f "$SG_PERSIST_CONF" ]; then
ocf_log err "Configuration file does not exist: $SG_PERSIST_CONF"
return $OCF_ERR_CONFIGURED
fi
- if [ -z "$RESOURCE" ]
- then
+ if [ -z "$RESOURCE" ]; then
ocf_log err "No resource name specified!"
return $OCF_ERR_ARGS
fi
- if [ "$OCF_RESKEY_CRM_meta_master_max" != "1" ] && [ "$RESERVATION_TYPE" != "7" ] && [ "$RESERVATION_TYPE" != "8" ]
- then
+ if [ "$OCF_RESKEY_CRM_meta_master_max" != "1" ] && [ "$RESERVATION_TYPE" != "7" ] && [ "$RESERVATION_TYPE" != "8" ]; then
ocf_log err "Master options misconfigured."
exit $OCF_ERR_CONFIGURED
fi
@@ -828,15 +726,12 @@ sg_persist_action_validate_all () {
return $OCF_SUCCESS
}
-if [ $# -ne 1 ]
-then
+if [ $# -ne 1 ]; then
echo "Incorrect parameter count."
sg_persist_action_usage
exit $OCF_ERR_ARGS
fi
-: ${OCF_RESKEY_CRM_meta_interval=0}
-
ACTION=$1
case $ACTION in
meta-data)
@@ -848,34 +743,13 @@ case $ACTION in
sg_persist_action_validate_all
;;
- start|promote)
+ start|promote|monitor|stop|demote)
ocf_log debug "$RESOURCE: starting action \"$ACTION\""
- #ocf_log debug `env`
-
sg_persist_init
sg_persist_action_$ACTION
exit $?
;;
- monitor)
- FORCE_OCF_SUCCESS='YES'
- ocf_log debug "$RESOURCE: starting action \"$ACTION\""
- #ocf_log debug `env`
-
- sg_persist_init
- sg_persist_action_$ACTION
- exit $?
- ;;
-
- stop|demote)
- FORCE_OCF_SUCCESS='YES'
- ocf_log debug "$RESOURCE: starting action \"$ACTION\""
-
- sg_persist_init
- sg_persist_action_$ACTION
- exit $OCF_SUCCESS
- ;;
-
notify)
sg_persist_action_notify
exit $?