restart_service() 関数は、decide_restart_or_failover() によって呼び出され、同じノードまたはゾーン上でデータサービスの再起動を試行します。
この関数は次の作業を行います。
データサービスがまだ PMF 下に登録されているかどうかを判別します。
サービスがまだ登録されている場合、この関数は次の作業を行います。
データサービスの Stop メソッド名と Stop_timeout 値を取得します。
hatimerun を使用してデータサービスの Stop メソッドを起動し、Stop_timeout 値を渡します。
データサービスが正常に停止した場合は、データサービスの Start メソッド名と Start_timeout 値を取得します。
hatimerun を使用してデータサービスの Start メソッドを起動し、Start_timeout 値を渡します。
データサービスが PMF 下に登録されていない場合は、データサービスが PMF 下で許可されている再試行最大回数を超えていることを示しています。scha_control コマンドが GIVEOVER 引数付きで実行され、それによってデータサービスが別のノードまたはゾーンにフェイルオーバーします。
function restart_service
{
# データサービスを再起動するには、まずデータサービス自体が PMF に
# 登録されているかどうかを確認する。
pmfadm -q $PMF_TAG
if [[ $? -eq 0 ]]; then
# データサービスの TAG が PMF に登録されている場合、データ
# サービスを停止し、再起動する。
# 当該リソースの Stop メソッド名と
# STOP_TIMEOUT 値を取得する。
STOP_TIMEOUT=`scha_resource_get -O STOP_TIMEOUT \
-R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ
STOP_METHOD=`scha_resource_get -O STOP \
-R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ
hatimerun -t $STOP_TIMEOUT $RT_BASEDIR/$STOP_METHOD \
-R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
-T $RESOURCETYPE_NAME
if [[ $? -ne 0 ]]; then
logger-p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
“${ARGV0} Stop method failed.”
return 1
fi
# 当該リソースの START メソッド名と START_TIMEOUT 値
# を取得する。
START_TIMEOUT=`scha_resource_get -O START_TIMEOUT \
-R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ
START_METHOD=`scha_resource_get -O START \
-R $RESOURCE_NAME -G $RESOURCEGROUP_NAMÈ
hatimerun -t $START_TIMEOUT $RT_BASEDIR/$START_METHOD \
-R $RESOURCE_NAME -G $RESOURCEGROUP_NAME \
-T $RESOURCETYPE_NAME
if [[ $? -ne 0 ]]; then
logger-p ${SYSLOG_FACILITY}.err -t [$SYSLOG_TAG] \
“${ARGV0} Start method failed.”
return 1
fi
else
# データサービスの TAG が PMF に登録されていない場合、
# データサービスが PMF で許可されている最大再試行回数
# を超過している。したがって、データサービスを再起動しては
# ならない。代わりに、同じクラスタ内の別のノードへの
# フェイルオーバーを試みる。
scha_control -O GIVEOVER -G $RESOURCEGROUP_NAME \
-R $RESOURCE_NAME
fi
return 0
}