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;
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);
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;
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);
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)
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);
}