cm_CallbackNotifyChange(scp);
lock_ObtainWrite(&cm_scacheLock);
cm_ReleaseSCacheNoLock(scp);
+
+ if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) {
+ scp->volp->cbExpiresRO = 0;
+ }
+
}
} /* search one hash bucket */
} /* search all hash buckets */
cm_CallbackNotifyChange(scp);
lock_ObtainWrite(&cm_scacheLock);
cm_ReleaseSCacheNoLock(scp);
+
+ if (discarded && (scp->flags & CM_SCACHEFLAG_PURERO) && scp->volp && scp->volp->cbExpiresRO != 0)
+ scp->volp->cbExpiresRO = 0;
+
} /* search one hash bucket */
} /* search all hash buckets */
cep->Length = scp->length.LowPart;
cep->DataVersion = scp->dataVersion;
cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
- cep->cbExpires = scp->cbExpires;
+ if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
+ cep->cbExpires = scp->volp->cbExpiresRO;
+ else
+ cep->cbExpires = scp->cbExpires;
cep->refCount = scp->refCount;
cep->opens = scp->openReads;
cep->writers = scp->openWrites;
#endif
cep->DataVersion = scp->dataVersion;
cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
- cep->cbExpires = scp->cbExpires;
+ if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
+ cep->cbExpires = scp->volp->cbExpiresRO;
+ else
+ cep->cbExpires = scp->cbExpires;
cep->refCount = scp->refCount;
cep->opens = scp->openReads;
cep->writers = scp->openWrites;
lock_ObtainWrite(&cm_callbackLock);
cbrp->callbackCount = cm_callbackCount;
cm_activeCallbackGrantingCalls++;
- cbrp->startTime = osi_Time();
+ cbrp->startTime = time(NULL);
cbrp->serverp = NULL;
lock_ReleaseWrite(&cm_callbackLock);
}
cm_racingRevokes_t *nrevp; /* where we'll be next */
int freeFlag;
cm_server_t * serverp = NULL;
- int discardScp = 0;
+ int discardScp = 0, discardVolCB = 0;
lock_ObtainWrite(&cm_callbackLock);
if (flags & CM_CALLBACK_MAINTAINCOUNT) {
serverp = cbrp->serverp;
}
scp->cbExpires = cbrp->startTime + cbp->ExpirationTime;
+ if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
+ scp->volp->cbExpiresRO = scp->cbExpires;
} else {
if (freeFlag)
serverp = cbrp->serverp;
cbrp->callbackCount, revp->callbackCount,
cm_callbackCount);
discardScp = 1;
+
+ if ((scp->flags & CM_SCACHEFLAG_PURERO) && scp->volp &&
+ (revp->flags & (CM_RACINGFLAG_CANCELVOL | CM_RACINGFLAG_CANCELALL)))
+ scp->volp->cbExpiresRO = 0;
}
if (freeFlag)
free(revp);
for (i=0; i<cm_data.scacheHashTableSize; i++) {
for (scp = cm_data.scacheHashTablep[i]; scp; scp=scp->nextp) {
downTime = 0;
+ if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) {
+ if (scp->volp->cbExpiresRO > scp->cbExpires && scp->cbExpires > 0)
+ scp->cbExpires = scp->volp->cbExpiresRO;
+ }
+
if (scp->cbServerp && scp->cbExpires > 0 && now > scp->cbExpires &&
(cm_CBServersUp(scp, &downTime) || downTime == 0 || downTime >= scp->cbExpires))
{
long cm_daemonCheckUpInterval = 240;
long cm_daemonCheckVolInterval = 3600;
long cm_daemonCheckCBInterval = 60;
+long cm_daemonCheckVolCBInterval = 1800;
long cm_daemonCheckLockInterval = 60;
long cm_daemonTokenCheckInterval = 180;
long cm_daemonCheckOfflineVolInterval = 600;
afsi_log("daemonCheckCBInterval is %d", cm_daemonCheckCBInterval);
dummyLen = sizeof(DWORD);
+ code = RegQueryValueEx(parmKey, "daemonCheckVolCBInterval", NULL, NULL,
+ (BYTE *) &dummy, &dummyLen);
+ if (code == ERROR_SUCCESS)
+ cm_daemonCheckVolCBInterval = dummy;
+ afsi_log("daemonCheckVolCBInterval is %d", cm_daemonCheckVolCBInterval);
+
+ dummyLen = sizeof(DWORD);
code = RegQueryValueEx(parmKey, "daemonCheckLockInterval", NULL, NULL,
(BYTE *) &dummy, &dummyLen);
if (code == ERROR_SUCCESS)
time_t lastLockCheck;
time_t lastVolCheck;
time_t lastCBExpirationCheck;
+ time_t lastVolCBRenewalCheck;
time_t lastDownServerCheck;
time_t lastUpServerCheck;
time_t lastTokenCacheCheck;
now = osi_Time();
lastVolCheck = now - cm_daemonCheckVolInterval/2 + (rand() % cm_daemonCheckVolInterval);
lastCBExpirationCheck = now - cm_daemonCheckCBInterval/2 + (rand() % cm_daemonCheckCBInterval);
+ lastVolCBRenewalCheck = now - cm_daemonCheckVolCBInterval/2 + (rand() % cm_daemonCheckVolCBInterval);
lastLockCheck = now - cm_daemonCheckLockInterval/2 + (rand() % cm_daemonCheckLockInterval);
lastDownServerCheck = now - cm_daemonCheckDownInterval/2 + (rand() % cm_daemonCheckDownInterval);
lastUpServerCheck = now - cm_daemonCheckUpInterval/2 + (rand() % cm_daemonCheckUpInterval);
now = osi_Time();
}
+ if (now > lastVolCBRenewalCheck + cm_daemonCheckVolCBInterval) {
+ lastVolCBRenewalCheck = now;
+ cm_VolumeRenewROCallbacks();
+ now = osi_Time();
+ }
+
if (now > lastBusyVolCheck + cm_daemonCheckOfflineVolInterval) {
lastVolCheck = now;
cm_CheckOfflineVolumes();
lock_ObtainWrite(&cm_scacheLock);
for ( scp = cm_data.allSCachesp; scp; scp = scp->allNextp ) {
- if (scp->cbServerp)
+ if (scp->cbServerp) {
+ if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) {
+ if (scp->volp->cbExpiresRO == scp->cbExpires) {
+ scp->volp->cbExpiresRO = now+1;
+ }
+ }
scp->cbExpires = now+1;
+ }
}
lock_ReleaseWrite(&cm_scacheLock);
}
cm_VolumeStatusNotification(volp, volp->ro.ID, volp->ro.state, vl_alldown);
if (volp->bk.ID)
cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_alldown);
-
+ volp->cbExpiresRO = 0;
lock_FinalizeMutex(&volp->mx);
}
cm_VolumeStatusNotification(volp, volp->ro.ID, vl_alldown, volp->ro.state);
if (volp->bk.ID)
cm_VolumeStatusNotification(volp, volp->bk.ID, vl_alldown, volp->bk.state);
+ volp->cbExpiresRO = 0;
}
}
osi_EndOnce(&once);
volp->rw.state = volp->ro.state = volp->bk.state = vl_unknown;
volp->rw.nextp = volp->ro.nextp = volp->bk.nextp = NULL;
volp->rw.flags = volp->ro.flags = volp->bk.flags = 0;
+ volp->cbExpiresRO = 0;
cm_AddVolumeToNameHashTable(volp);
lock_ReleaseWrite(&cm_volumeLock);
}
}
}
+
+void
+cm_VolumeRenewROCallbacks(void)
+{
+ cm_volume_t * volp;
+
+
+ lock_ObtainRead(&cm_volumeLock);
+ for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
+ if ( volp->cbExpiresRO > 0) {
+ cm_req_t req;
+ cm_fid_t fid;
+ cm_scache_t * scp;
+
+ fid.cell = volp->cellp->cellID;
+ fid.volume = volp->ro.ID;
+ fid.vnode = 1;
+ fid.unique = 1;
+
+ cm_InitReq(&req);
+
+ if (cm_GetSCache(&fid, &scp, cm_rootUserp, &req) == 0) {
+ lock_ReleaseRead(&cm_volumeLock);
+ lock_ObtainMutex(&scp->mx);
+ cm_GetCallback(scp, cm_rootUserp, &req, 1);
+ lock_ReleaseMutex(&scp->mx);
+ cm_ReleaseSCache(scp);
+ lock_ObtainRead(&cm_volumeLock);
+ }
+ }
+ }
+ lock_ReleaseRead(&cm_volumeLock);
+}
+
+
osi_mutex_t mx;
afs_uint32 flags; /* by mx */
afs_uint32 refCount; /* by cm_volumeLock */
+ time_t cbExpiresRO; /* latest RO expiration time; by cm_scacheLock */
} cm_volume_t;
#define CM_VOLUMEFLAG_RESET 1 /* reload this info on next use */
extern void cm_VolumeStatusNotification(cm_volume_t * volp, afs_uint32 volID, enum volstatus old, enum volstatus new);
extern enum volstatus cm_GetVolumeStatus(cm_volume_t *volp, afs_uint32 volID);
+
+extern void cm_VolumeRenewROCallbacks(void);
#endif /* __CM_VOLUME_H_ENV__ */