From: Jeffrey Altman Date: Tue, 9 Aug 2011 18:26:33 +0000 (-0400) Subject: Windows: avoid duplicate volume update queries X-Git-Tag: upstream/1.6.1.pre4^2~46 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=4078a389959d3aacb805e62edef0891db7e44306;p=packages%2Fo%2Fopenafs.git Windows: avoid duplicate volume update queries If multiple volume update queries have stacked up in cm_UpdateVolumeLocation() and the active query failed, do not re-issued the blocked queries. Instead, prevent new queries for 60 seconds and fail those that blocked during the active query. Reviewed-on: http://gerrit.openafs.org/5296 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman (cherry picked from commit 21acdd92c8510a9f99243588388a2a1078547533) Change-Id: I7f0bc97ca7c194624ac854558bbed6b93a13ce63 Reviewed-on: http://gerrit.openafs.org/6795 Tested-by: BuildBot Reviewed-by: Derrick Brashear --- diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index e6e0e79f2..81ad0f7ba 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -105,6 +105,7 @@ void cm_InitVolume(int newFile, long maxVols) lock_InitializeRWLock(&volp->rw, "cm_volume_t rwlock", LOCK_HIERARCHY_VOLUME); _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RESET); _InterlockedAnd(&volp->flags, ~CM_VOLUMEFLAG_UPDATING_VL); + volp->lastUpdateTime = 0; for (volType = RWVOL; volType < NUM_VOL_TYPES; volType++) { volp->vol[volType].state = vl_unknown; volp->vol[volType].serversp = NULL; @@ -293,6 +294,15 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t * osi_Wakeup((LONG_PTR) &volp->flags); return 0; } + now = time(NULL); + } + + /* Do not query again if the last update attempt failed in the last 60 seconds */ + if ((volp->flags & CM_VOLUMEFLAG_RESET) && (volp->lastUpdateTime > now - 60)) + { + osi_Log3(afsd_logp, "cm_UpdateVolumeLocation unsuccessful update in last 60 seconds -- name %s:%s flags 0x%x", + volp->cellp->name, volp->namep, volp->flags); + return(CM_ERROR_ALLDOWN); } _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_UPDATING_VL); @@ -944,6 +954,7 @@ long cm_FindVolumeByName(struct cm_cell *cellp, char *volumeNamep, strncpy(volp->namep, name, VL_MAXNAMELEN); volp->namep[VL_MAXNAMELEN-1] = '\0'; volp->flags = CM_VOLUMEFLAG_RESET; + volp->lastUpdateTime = 0; for ( volType = RWVOL; volType < NUM_VOL_TYPES; volType++) { volp->vol[volType].state = vl_unknown; @@ -1084,6 +1095,7 @@ long cm_ForceUpdateVolume(cm_fid_t *fidp, cm_user_t *userp, cm_req_t *reqp) cm_data.mountRootGen = time(NULL); lock_ObtainWrite(&volp->rw); _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RESET); + volp->lastUpdateTime = 0; code = cm_UpdateVolumeLocation(cellp, userp, reqp, volp); lock_ReleaseWrite(&volp->rw); @@ -1118,6 +1130,7 @@ cm_serverRef_t **cm_GetVolServers(cm_volume_t *volp, afs_uint32 volume, cm_user_ firstTry = 0; lock_ObtainWrite(&volp->rw); _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RESET); + volp->lastUpdateTime = 0; code = cm_UpdateVolumeLocation(volp->cellp, userp, reqp, volp); lock_ReleaseWrite(&volp->rw); if (code == 0) @@ -1184,8 +1197,10 @@ void cm_RefreshVolumes(int lifetime) if (!(volp->flags & CM_VOLUMEFLAG_RESET)) { lock_ObtainWrite(&volp->rw); - if (volp->lastUpdateTime + lifetime <= now) + if (volp->lastUpdateTime + lifetime <= now) { _InterlockedOr(&volp->flags, CM_VOLUMEFLAG_RESET); + volp->lastUpdateTime = 0; + } lock_ReleaseWrite(&volp->rw); }