ページの先頭行へ戻る
PRIMECLUSTER Global Link Services 説明書 4.6 (伝送路二重化機能編)
FUJITSU Software

3.12.3 全伝送路異常によるuserApplication停止抑止機能の設定

全伝送路異常時のuserApplication停止抑止機能が使用できます。

本機能の詳細は、“2.8.3 全伝送路異常によるuserApplication停止抑止機能”を参照してください。

実行させるには、以下の設定を行う必要があります。

なお、サンプルファイル(preStartGls.sh)を用意しています。

サンプルファイルは“2.8.3 全伝送路異常によるuserApplication停止抑止機能”記載の構成を満たしている場合は変更ありません。

システムログにメッセージを出力させる場合など、必要に応じて変更してください。

  1. スクリプトを運用ノード、待機ノードに配置します。
    スクリプトを配置するとき、運用ノード、待機ノードで同ディレクトリ、同スクリプト名としてください。
    スクリプト名は、サンプルファイル名(preStartGls.sh) から変更しても問題ありません。

  2. 配置したスクリプトをuserApplicationのPreOnlineスクリプトに登録します。
    PreOnlineスクリプトの登録は、RMS Wizardを使用して実施します。
    PreOnlineスクリプトの詳細については、マニュアル“PRIMECLUSTER 導入運用手引書”を参照してください。

サンプルファイル

- preStartGls.sh

#!/bin/bash
#
# Copyright(c) 2022 FUJITSU LIMITED.
# All rights reserved.
#
LANG=C
#-------------------------------------------------------
# variables
#-------------------------------------------------------
STATE_STANDBY="Standby"
STATE_FAULTED="Faulted"
CFGLOG="/var/opt/FJSVhanet/log/config.log"
PROGNAME=`/bin/basename $0`
HANETPOLL="/opt/FJSVhanet/usr/sbin/hanetpoll"
HANETPOLL_OFF="${HANETPOLL} off"
HANETPOLL_ON_YES="${HANETPOLL} on -f yes"
HANETPOLL_ON_NO="${HANETPOLL} on -f no"
RCCMDDIR="/usr/opt/reliant/bin"
HVASSERT="${RCCMDDIR}/hvassert"
HANETSELECT="hanetselect"
MSG_OFFLINE="ERROR: Remote system is not online"
MSG_TIMEOUT="Command timed out!"
MSG_STANDBY="ERROR: Actual resource state is - Standby"
HVDISP="${RCCMDDIR}/hvdisp"
ECHO="echo"  #bash built-in command
LOGGER="/usr/bin/logger"
GREP="/bin/grep"
AWK="/bin/awk"
SED="/bin/sed"
PGREP="/usr/bin/pgrep"
DATE="/bin/date"
# flag to output a message 
SYSLOG_OUTPUT="off"
#-------------------------------------------------------
# functions
#-------------------------------------------------------
HAnetLog(){
    if [ -f ${CFGLOG} ]; then
        DATETIME=`${DATE} +"%Y/%m/%d %H:%M:%S.%3N"`
        ${ECHO} "[${DATETIME}] - [${PROGNAME}] [$$] $*" >> ${CFGLOG}
    fi
    return 0
}

HAnetSysLog(){
    log_str=$*
    if [ ${SYSLOG_OUTPUT} != "off" ]; then
        ${LOGGER} -t "hanet:${PROGNAME}" -p user.err "${log_str}" >/dev/null 2>&1
    fi
    HAnetLog ${log_str}
    return 0
}

PollExec(){

    # hanetpoll off
    poll_result=`${HANETPOLL_OFF} 2>&1`
    ret=$?
    if [ ${ret} -ne 0 ]; then
        # check hanetselect
        pgrep_result=`${PGREP} -x ${HANETSELECT}`
        if [[ ${pgrep_result} != "" ]]; then
            # exist hanetselect
            if [ -z "${poll_result}" ]; then
                poll_result="ERROR:${HANETPOLL_OFF}"
            fi
            HAnetSysLog ${poll_result}
            exit 0
        else
            HAnetLog "Polling is already stopped.  ${poll_result}"
        fi
    fi

    # hanetpoll on
    result=`$* 2>&1`
    ret=$?
    if [ ${ret} -ne 0 ]; then
        if [ -z "${result}" ]; then
            result="ERROR:$*"
        fi
        HAnetSysLog ${result}
        exit 0
    fi
    return 0
}

#-------------------------------------------------------
#   main
#-------------------------------------------------------
### In the case of Standby ( After transition )#########
if [[ ${HV_INTENDED_STATE} = ${STATE_STANDBY} ]];then
    # After state is Standby. Set no.
    PollExec ${HANETPOLL_ON_NO}
    exit 0
fi


### Get remote SysNode name ############################
remote_node=`${HVDISP} ${HV_APPLICATION} | ${AWK} \
'$1=="PriorityList" { gsub("PriorityList|'${RELIANT_HOSTNAME}'|:", ""); print $1}'`
if [[ ${remote_node} = "" ]]; then
    HAnetSysLog "Remote SysNode name is not set."
    exit 0
fi


### hvassert ###########################################
# hvassert -h node1RMS -s app1 Faulted
result=`${HVASSERT} -h ${remote_node} -s ${HV_APPLICATION} ${STATE_FAULTED} 2>&1`
ret=$?
if [ ${ret} -eq 0 ]; then
    # Last Node: hanetpoll off -> hanetpoll on -f no
    PollExec ${HANETPOLL_ON_NO}
else
    case "${result}" in

        # Remote SysNode is OFFLINE.
        *${MSG_OFFLINE}* )
            HAnetLog ${result}
            # Offline: hanetpoll off -> hanetpoll on -f no
            PollExec ${HANETPOLL_ON_NO}
            ;;
        # Command is timeout.
        *${MSG_TIMEOUT}* )
            # Timeout: hanetpoll off -> hanetpoll on -f yes
            HAnetLog ${result}
            PollExec ${HANETPOLL_ON_YES}
            ;;
        *${MSG_STANDBY}* )
            # other case Standby is normal case.: hanetpoll off -> hanetpoll on -f yes
            PollExec ${HANETPOLL_ON_YES}
            ;;
        * )
            # other case: hanetpoll off -> hanetpoll on -f yes
            HAnetLog ${result}
            PollExec ${HANETPOLL_ON_YES}
            ;;
    esac
fi

exit 0