############################################################
# ????	: OceanStor9000 ????
# ??      : DLM??????
# ????	:
# ??		:
#
#
#
############################################################
#!/bin/sh
set +x

G_MML_FILE_PATH="/opt/huawei/snas/script/inspect_mml"
source $G_MML_FILE_PATH/CheckItems
source $G_MML_FILE_PATH/CommonFunc.sh
CurInspectNum="289"
CurInspectFun="$(GetInspectType $CurInspectNum)"
RESULTFILE="${G_TMP_INSPECT_PATH}tmpResult${CurInspectFun}"
LOG_FILE="/var/log/inspect.log"
>${RESULTFILE}


function LOG
{
   local time=$(date)
   echo [${time}][$$][${CurInspectFun}]$@ >> ${LOG_FILE}
}

function get9000LockType()
{
    local lock_type=${1}

    case ${lock_type} in
        10)
            echo "DLM_MIN_TYPE"
            ;;
        11)
            echo "DLM_PROTOCOL_META"
            ;;
        12)
            echo "DLM_SIZE"
            ;;
        13)
            echo "DLM_IBITS"
            ;;
        14)
            echo "DLM_STRIPE"
            ;;
        15)
            echo "DLM_FLOCK"
            ;;
        16)
            echo "DLM_EXTENT"
            ;;
        17)
            echo "DLM_ABPATH_LOCK"
            ;;
        18)
            echo "DLM_CREATE"
            ;;
        19)
            echo "DLM_DIRAUTH"
            ;;
        20)
            echo "DLM_MAX_TYPE"
            ;;
        *)
            echo "ERROR_DLM_LOCK_TYPE"
            ;;
    esac

    return 0
}

function main()
{
    local tmpfile="${G_TMP_INSPECT_PATH}dlminfotmpfiled$$"
    local Result=""
    local status=""
    local isPass=0
    local bankIp=$(GetLocalIpNoPing)

    # ????????dlm???
    if [ "${bankIp}X" == "X" ]; then
        isPass=1
        echo "[ERR]Node:$(hostname)||INFO:Can't get backend IP." >> ${RESULTFILE}
        echo "${CurInspectFun}_Pass $isPass" >>${RESULTFILE}
        exit 1
    fi

    echo -n dir showall >/proc/dlm_info
    cat /proc/dlm_info | sed "/^[ \t]*$/d" >${tmpfile}

    while read line
    do
        if [ "X" != "X${Result}" ]; then
            Result="$Result||DLM Status:$line"
        else
            Result="DLM Status:$line"
        fi

        status=$(echo $line |grep -E "status=FAULT|status=ONLINE")
        if [ "X${status}" != "X" ];then
            isPass=1
            echo "[ERR]Node:${bankIp}||INFO:Protocol_Platform_Dlm($line)." >> ${RESULTFILE}
        fi
    done < ${tmpfile}
    #??????????,??????????
    Result="DLM Status:${G_SEPARATOR}||DLM Status:$bankIp||${Result}"
    echo "${Result}" >>${RESULTFILE}

    # ??9000???dlm?????
    local curseconds=$( date +%s )
    local oneDaySeconds=86400
    local locklist=""
    local printCnt=0
    
    for dlmlogfile in $(ls /var/log/snas_dlm.log*)
    do
        file_size=$( du -s ${dlmlogfile}  | awk '{print $1}' )
        if [ ${file_size} -ge 102400 ];then
            LOG "[$LINENO]${dlmlogfile} size(${file_size}K) is exceeds 100 MB,the memory may be insufficient when a large file is opened."
            echo "[ERR]Node:${bankIp}||INFO:${dlmlogfile} size(${file_size}K) is exceeds 100 MB,the memory may be insufficient when a large file is opened." >>${RESULTFILE} 2>&1
            isPass=1
            continue
        fi

        grep "ERR.*DLM_LogBlockedLockInfo" ${dlmlogfile} >/tmp/tmp_9000_dlmlockinfo
        while read line
        do
            eachLockInfo=$( echo "${line}" | awk -F "[" '{print $4}' | awk -F ")" '{print $1}' | awk -F "]" '{print $1}' )
            lock_id=$( echo "${eachLockInfo}" | awk -F/ '{print $1}' )
            lock_type=$( echo "${eachLockInfo}" | awk -F/ '{print $2}' )
            lock_create_time=$( echo "${eachLockInfo}" | awk -F/ '{print $NF}' | awk -F "." '{print $1}')
            diff_seconds=$(expr $curseconds - $lock_create_time)
        # ??????,????
            echo "${locklist}" | grep -q "${lock_id}"
            if [ $? -eq 0 ]; then
                continue
            fi

            if [ ${diff_seconds} -gt ${oneDaySeconds} ]; then
                locklist="${locklist},${lock_id}"
                printCnt=$((printCnt+1))
                lock_type=$( get9000LockType ${lock_type} )
                echo "[ERR]Node:${bankIp}||INFO:9000_blockedLockInfo  DlmLockId(${lock_id})  DlmLockType(${lock_type})  DlmLockCreateTime($(date -d @"${lock_create_time}" "+%Y-%m-%d %Hh%Mm%Ss"))." >> ${RESULTFILE}
                [ ${isPass} -eq 0 ]  && isPass=4
            fi

            if [ ${printCnt} -ge 10 ]; then
                break
            fi
        done </tmp/tmp_9000_dlmlockinfo

        if [ ${printCnt} -ge 10 ]; then
            break
        fi
    done
    #??DLM????????
    echo -n "recoverdir showForcePut" > /proc/dlm_info
    cat /proc/dlm_info | sed "/^[ \t]*$/d" > /tmp/tmp_9000_dlmmemoryleakinfo
    local forPutListCnt=$( cat /tmp/tmp_9000_dlmmemoryleakinfo | grep forPutListCnt | awk -F "=" '{print $2}' )
    if [ "X${forPutListCnt}" != "X0" -a "X${forPutListCnt}" != "X" ]; then
        isPass=1
        echo "[ERR]Node:${bankIp}||INFO: Memory leakage may occur in the offline DLM process." >> ${RESULTFILE}
    fi

    echo "${CurInspectFun}_Pass $isPass" >>${RESULTFILE}

    if [ -f ${tmpfile} ];then
        rm -f ${tmpfile}
    fi
    if [ -f "/tmp/tmp_9000_dlmlockinfo" ]; then
        rm -f /tmp/tmp_9000_dlmlockinfo
    fi
    if [ -f "/tmp/tmp_9000_dlmmemoryleakinfo" ]; then
        rm -f /tmp/tmp_9000_dlmmemoryleakinfo
    fi

    return
}

main
exit 0
