Changeset 1729


Ignore:
Timestamp:
05/16/12 17:06:32 (12 years ago)
Author:
omamce
Message:

Fonction DEM_write_state : gestion du verrou (.lock) dans le cas ou plusieurs processus veulent ecrire en meme temps.
Fait 10 tentatives espacees de 1 seconde pour ecrire dans le fichier.

Olivier

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TOOLS/PACK_IPSL/DEM_utilities.sh

    r1709 r1729  
    2424function DEM_write_state { 
    2525# Mettre à jour l'état du pack pour une simulation 
    26      
    2726    local L_CONFIG_FILE=${1} 
    2827    local L_CONFIG_CARD=${2} 
    2928    local L_NEW_STATE=${3} 
     29 
     30    local L_MAX_TRY=10 L_TRY=0 L_CHECK L_PP 
     31 
     32    # On essaye ${L_MAX_TRY} fois de mettre à jour le fichier 
     33    while [ ${L_TRY} -le ${L_MAX_TRY} ] 
     34    do 
     35        if [[ ! -f ${L_CONFIG_FILE}.lock ]] 
     36        then  
     37            echo ${$}  >> ${L_CONFIG_FILE}.lock     ; chmod -w ${L_CONFIG_FILE}.lock 
     38            L_CHECK=$( wc -l ${L_CONFIG_FILE}.lock | awk '{print $1}' ) 
     39            if [[ ${L_CHECK} -gt 1 ]] 
     40            then 
     41                DEM_log -0 "Erreur. Plusieurs processus on pose un verrou sur ${L_CONFIG_FILE}" 
     42                for L_PP in $( awk  '{print $1}' ${L_CONFIG_FILE}.lock )  
     43                do 
     44                    DEM_log -0 "Erreur. Process : ${L_PP}" 
     45                done 
     46                return 1 
     47            fi 
     48 
     49            local L_OLD_LINE=$( grep ${L_CONFIG_CARD} ${L_CONFIG_FILE} ) 
     50            [[ ${?} -eq 0 ]] || ( return 1 ; ) 
     51            if [[ ${L_OLD_LINE} = "" ]] 
     52            then 
     53                DEM_log -0 "Erreur. Dans le fichier : ${L_CONFIG_FILE}, Experience ${L_CONFIG_CARD} non trouvee" 
     54                return 1 
     55            fi 
     56            local L_OLD_STATE=$( echo ${L_OLD_LINE} | awk '{print $2}' ) 
     57            [[ ${?} -eq 0 ]] || ( return 1 ; ) 
     58             
     59            L_NEW_LINE="${L_CONFIG_CARD} ${L_NEW_STATE}" 
     60 
     61            sed -i "s%${L_OLD_LINE}%${L_NEW_LINE}%" ${L_CONFIG_FILE} 
     62            rm -f ${L_CONFIG_FILE}.lock 
     63            break 
     64        else 
     65            (( L_TRY = L_TRY + 1 )) 
     66            DEM_log -3 "Fichier ${L_CONFIG_FILE} en cours de modif par un autre processus. Essai ${L_TRY}" 
     67            sleep 1 
     68        fi 
     69            
     70    done 
    3071     
    31     local L_OLD_LINE=$( grep ${L_CONFIG_CARD} ${L_CONFIG_FILE} ) 
    32     [[ ${?} -eq 0 ]] || ( return 1 ; ) 
    33     local L_OLD_STATE=$( echo ${L_OLD_LINE} | awk '{print $2}' ) 
    34     [[ ${?} -eq 0 ]] || ( return 1 ; ) 
    35      
    36     L_NEW_LINE="${L_CONFIG_CARD} ${L_NEW_STATE}" 
    37  
    38     if [[ ! -f ${L_CONFIG_FILE}.lock ]] 
     72    if [[ ${L_TRY} -ge ${L_MAX_TRY} ]] 
    3973    then  
    40         touch ${L_CONFIG_FILE}.lock 
    41         sed -i "s%${L_OLD_LINE}%${L_NEW_LINE}%" ${L_CONFIG_FILE} 
    42         rm -f ${L_CONFIG_FILE}.lock 
    43     else 
    4474        DEM_log -0 "Erreur. Verrou sur le fichier : ${L_CONFIG_FILE}" 
    4575        return 1 
    4676    fi 
    47      
     77 
    4878    return 0 
    4979} 
     
    75105# DEM_log [-0|-1|-2|-3] Message 
    76106# 
    77     local MESSAGE P_LINE 
     107    local MESSAGE P_LINE L_NAME 
    78108    LOG_LEV=${LOG_LEV:-3} 
    79109    local OPTARG OPTIND L_LOG=1 
    80110    local L_DEM_LOG=${DEM_LOG:-dem_log.${$}} 
    81111 
    82     while getopts 0123 l_name 
     112    while getopts 0123 L_NAME 
    83113    do 
    84         case ${l_name} in 
     114        case ${L_NAME} in 
    85115            ( 0 )  L_LOG=1 ;; 
    86116            ( 1 )  L_LOG=1 ;; 
     
    101131    return 
    102132} 
     133 
Note: See TracChangeset for help on using the changeset viewer.