#!/bin/ksh93 # ALTRAN_PROLOG_BEGIN_TAG # This is an automatically generated prolog. # # Copyright (C) Altran ACT S.A.S. 2017,2020,2021. All rights reserved. # # ALTRAN_PROLOG_END_TAG # # @(#) 7d4c34b 43haes/usr/sbin/cluster/events/utils/cl_scsipr_preempt.sh, 726, 2147A_aha726, Feb 05 2021 09:50 PM export PATH=$(/usr/es/sbin/cluster/utilities/cl_get_path all) ##################################### # MAIN # ##################################### # Including file containing SCSIPR functions . /usr/es/sbin/cluster/events/utils/cl_scsipr_event_functions [[ -z $(whence clodmget) ]] && export PATH=$(/usr/es/sbin/cluster/utilities/cl_get_path all) if [[ $VERBOSE_LOGGING == "high" ]] then set -x version='1.6' fi typeset nodename="" typeset -i failed_to_preempt=0 set -A down_nodes ## Check if the current Resource Group is Critical RG typeset CRITICAL_RG=$(eval "echo \${CRITICAL_RG_ACQUIRE}") if [[ "$CRITICAL_RG" == "YES" ]] then typeset -i count=0 typeset cluster_nodes=$(clodmget -n -q "object=COMMUNICATION_PATH" -f value HACMPnode) typeset node="" for node in $cluster_nodes ; do unset state substate CAA_node_name=$(cl_nn2hn $node) if [[ -n $CAA_node_name ]] then state=$(LC_ALL=C lscluster -m $CAA_node_name | grep -w "State of node:" | awk -F " " '{print $4}') substate=$(LC_ALL=C lscluster -m $CAA_node_name | grep -w "State of node:" | awk -F " " '{print $5}') fi if [[ -z $state || $state == "DOWN" && $substate != "STOPPED" ]];then down_nodes[$count]=$node (( count++ )) fi done # # At this point, $down_nodes is an array of PowerHA node names # for which the corresponding CAA state is either DOWN or STOPPED # typeset LocalNodeName=$(get_local_nodename) if ! typeset LocalNodePRKey=$(clpr_obtain_prkey $LocalNodeName) then # : Failed generating the PR Key of node, $LocalNodeName. # return 1 fi typeset ResGrp="" typeset VolGrp="" typeset nodes_down="" typeset noden="" for noden in ${down_nodes[@]} do nodes_down=$nodes_down" "$(clodmget -n -q "object=COMMUNICATION_PATH and value=$noden" -f name HACMPnode) done for nodename in $nodes_down do if ! PR_Key=$(clpr_obtain_prkey $nodename) then # : Failed generating the PR Key of the node $nodename. # # If we failed to genrate the PR key of any one node # from among the down nodes, we would not be able to # preempt that node. Other nodes might get preempted # but data corruption might be caused even if any one # node's key remain on the VGs or disk. # Preemption of other nodes would be tried, but we # should not let RG to be acquired in this case. Hence, # setting the failed_to_preempt flag as 1. failed_to_preempt=1 # Continue to process next node continue fi # : Node $nodename is down, preempt $nodename from the Volume Groups, : which are part of any Resource Group. # typeset ResGrps=$(clodmget -n -q "nodes like \"*$nodename*\"" -f group HACMPgroup) for ResGrp in $ResGrps do typeset VolGrps=$(clodmget -n -q "group=$ResGrp and name like *VOLUME_GROUP" -f value HACMPresource) for VolGrp in $VolGrps do if clpr_ReadRes_vg $VolGrp then if clpr_verifyKey_vg $VolGrp $LocalNodePRKey then # : Node $nodename is down, preempting that node from Volume Group $VolGrp. : Verify key is already removed or not, then only try for removal # clpr_verifyKey_vg $VolGrp $PR_Key if (( $? == 0 )) then if ! clpr_preempt_abort_vg $VolGrp $PR_Key then # Checking if preemption failed by verifying the PR Key # of the node in down_nodes. # Return value of 1 indicates that the key is not present. clpr_verifyKey_vg $VolGrp $PR_Key if (( $? != 1 )) then # : Failed to preempt node $nodename from Volume Group $VolGrp. # failed_to_preempt=1 fi fi fi else # : Failed Verifying the PR Key of node $LocalNodeName on Volume Group, $VolGrp. # failed_to_preempt=1 fi else # : Failed to read reservation on Volume Group, $VolGrp. # failed_to_preempt=1 fi done done typeset diskList=$(LC_ALL=C cllsres | grep -w RAW_DISK | cut -f2 -d=) if [[ -n $diskList ]] then diskList=${diskList#\"} diskList=${diskList%\"} typeset uuid="" for uuid in $diskList do typeset hdisk=$(lspv -u | grep -w $uuid | awk '{print $1}') if [[ -n $hdisk ]] then # : Verify key is already removed or not, then only try for removal # clpr_verifyKey $hdisk $PR_Key if (( $? == 0 )) then if ! clpr_preempt_abort $hdisk $PR_Key then # Checking if preemption failed by verifying the PR Key # of the node in down_nodes. clpr_verifyKey $hdisk $PR_Key # Return value of 1 indicates that the key # is not present. if (( $? != 1 )) then # : Failed to preempt node $nodename from hdisk $hdisk. # failed_to_preempt=1 fi fi fi fi done fi diskList=$(LC_ALL=C cllsres | grep -w DISK | cut -f2 -d=) if [[ -n $diskList ]] then diskList=${diskList#\"} diskList=${diskList%\"} typeset pvid="" for pvid in $diskList do typeset hdisk=$(lspv -L | grep -w $pvid | awk '{print $1}') if [[ -n $hdisk ]] then # : Verify key is already removed or not, then only try for removal # clpr_verifyKey $hdisk $PR_Key if (( $? == 0 )) then if ! clpr_preempt_abort $hdisk $PR_Key then # Checking if preemption failed by verifying the PR Key # of the node in down_nodes. clpr_verifyKey $hdisk $PR_Key # Return value of 1 indicates that the key # is not present. if (( $? != 1 )) then # : Failed to preempt node $nodename from hdisk $hdisk. # failed_to_preempt=1 fi fi fi fi done fi done if [[ $failed_to_preempt == 1 ]] then return 1 else return 2 fi fi