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;
#ifndef SIZE_MAX
#define SIZE_MAX UINT_MAX
#endif
- osi_assert(allocsize < SIZE_MAX);
+ osi_assertx(allocsize < SIZE_MAX, "allocsize >= SIZE_MAX");
#endif
*configCount = (afs_uint32)allocsize;
config->cacheConfig_val = t_config;
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) {
- osi_assert(cm_activeCallbackGrantingCalls > 0);
+ osi_assertx(cm_activeCallbackGrantingCalls > 0,
+ "CM_CALLBACK_MAINTAINCOUNT && cm_activeCallbackGrantingCalls == 0");
}
else {
- osi_assert(cm_activeCallbackGrantingCalls-- > 0);
+ osi_assertx(cm_activeCallbackGrantingCalls-- > 0,
+ "!CM_CALLBACK_MAINTAINCOUNT && cm_activeCallbackGrantingCalls == 0");
}
if (cm_activeCallbackGrantingCalls == 0)
freeFlag = 1;
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))
{