void cm_BkgDaemon(long parm)
{
cm_bkgRequest_t *rp;
+ afs_int32 code;
rx_StartClientThread();
}
/* we found a request */
- rp = cm_bkgListEndp;
- cm_bkgListEndp = (cm_bkgRequest_t *) osi_QPrev(&rp->q);
- osi_QRemove((osi_queue_t **) &cm_bkgListp, &rp->q);
+ for (rp = cm_bkgListEndp; rp; rp = (cm_bkgRequest_t *) osi_QPrev(&rp->q))
+ {
+ if (cm_ServerAvailable(&rp->scp->fid, rp->userp))
+ break;
+ }
+ if (rp == NULL) {
+ /* we couldn't find a request that we could process at the current time */
+ lock_ReleaseWrite(&cm_daemonLock);
+ Sleep(1000);
+ lock_ObtainWrite(&cm_daemonLock);
+ continue;
+ }
+
+ osi_QRemoveHT((osi_queue_t **) &cm_bkgListp, (osi_queue_t **) &cm_bkgListEndp, &rp->q);
osi_assert(cm_bkgQueueCount-- > 0);
lock_ReleaseWrite(&cm_daemonLock);
#ifdef DEBUG_REFCOUNT
osi_Log2(afsd_logp,"cm_BkgDaemon (before) scp 0x%x ref %d",rp->scp, rp->scp->refCount);
#endif
- (*rp->procp)(rp->scp, rp->p1, rp->p2, rp->p3, rp->p4, rp->userp);
+ code = (*rp->procp)(rp->scp, rp->p1, rp->p2, rp->p3, rp->p4, rp->userp);
#ifdef DEBUG_REFCOUNT
osi_Log2(afsd_logp,"cm_BkgDaemon (after) scp 0x%x ref %d",rp->scp, rp->scp->refCount);
#endif
- cm_ReleaseUser(rp->userp);
- cm_ReleaseSCache(rp->scp);
- free(rp);
+ if (code == 0) {
+ cm_ReleaseUser(rp->userp);
+ cm_ReleaseSCache(rp->scp);
+ free(rp);
+ }
lock_ObtainWrite(&cm_daemonLock);
+
+ switch ( code ) {
+ case CM_ERROR_TIMEDOUT:
+ case CM_ERROR_RETRY:
+ case CM_ERROR_WOULDBLOCK:
+ case CM_ERROR_ALLBUSY:
+ case CM_ERROR_ALLDOWN:
+ case CM_ERROR_ALLOFFLINE:
+ case CM_ERROR_PARTIALWRITE:
+ osi_Log2(afsd_logp,"cm_BkgDaemon re-queueing failed request 0x%p code 0x%x",
+ rp, code);
+ cm_bkgQueueCount++;
+ osi_QAddT((osi_queue_t **) &cm_bkgListp, (osi_queue_t **)&cm_bkgListEndp, &rp->q);
+ break;
+ default:
+ osi_Log2(afsd_logp,"cm_BkgDaemon failed request dropped 0x%p code 0x%x",
+ rp, code);
+ }
}
lock_ReleaseWrite(&cm_daemonLock);
}
if (now > lastVolCheck + cm_daemonCheckVolInterval) {
lastVolCheck = now;
- cm_CheckVolumes();
+ cm_RefreshVolumes();
now = osi_Time();
}
#ifdef AFS_LARGEFILES
if (SERVERHAS64BIT(connp)) {
- osi_Log4(afsd_logp, "CALL StoreData64 scp 0x%p, offset 0x%x:%08x, length 0x%x",
+ osi_Log4(afsd_logp, "CALL StartRXAFS_StoreData64 scp 0x%p, offset 0x%x:%08x, length 0x%x",
scp, biod.offset.HighPart, biod.offset.LowPart, nbytes);
code = StartRXAFS_StoreData64(callp, &tfid, &inStatus,
biod.offset.QuadPart,
nbytes,
truncPos.QuadPart);
+ if (code)
+ osi_Log1(afsd_logp, "CALL StartRXAFS_StoreData64 FAILURE, code 0x%x", code);
+ else
+ osi_Log0(afsd_logp, "CALL StartRXAFS_StoreData64 SUCCESS");
} else {
-
if (require_64bit_ops) {
- osi_Log0(afsd_logp, "Skipping StoreData. The operation requires StoreData64");
+ osi_Log0(afsd_logp, "Skipping StartRXAFS_StoreData. The operation requires large file support in the server.");
code = CM_ERROR_TOOBIG;
} else {
- osi_Log4(afsd_logp, "CALL StoreData scp 0x%p, offset 0x%x:%08x, length 0x%x",
+ osi_Log4(afsd_logp, "CALL StartRXAFS_StoreData scp 0x%p, offset 0x%x:%08x, length 0x%x",
scp, biod.offset.HighPart, biod.offset.LowPart, nbytes);
code = StartRXAFS_StoreData(callp, &tfid, &inStatus,
biod.offset.LowPart, nbytes, truncPos.LowPart);
+ if (code)
+ osi_Log1(afsd_logp, "CALL StartRXAFS_StoreData FAILURE, code 0x%x", code);
+ else
+ osi_Log0(afsd_logp, "CALL StartRXAFS_StoreData SUCCESS");
}
}
#else
- osi_Log4(afsd_logp, "CALL StoreData scp 0x%p, offset 0x%x:%08x, length 0x%x",
+ osi_Log4(afsd_logp, "CALL StartRXAFS_StoreData scp 0x%p, offset 0x%x:%08x, length 0x%x",
scp, biod.offset.HighPart, biod.offset.LowPart, nbytes);
code = StartRXAFS_StoreData(callp, &tfid, &inStatus,
biod.offset.LowPart, nbytes, truncPos.LowPart);
+ if (code)
+ osi_Log1(afsd_logp, "CALL StartRXAFS_StoreData FAILURE, code 0x%x", code);
+ else
+ osi_Log0(afsd_logp, "CALL StartRXAFS_StoreData SUCCESS");
#endif
if (code == 0) {
}
nbytes -= wbytes;
} /* while more bytes to write */
- } /* if RPC started successfully */
- else {
- osi_Log2(afsd_logp, "StartRXAFS_StoreData?? scp 0x%p failed (%lX)",scp,code);
- }
+ } /* if RPC started successfully */
if (code == 0) {
if (SERVERHAS64BIT(connp)) {
code = EndRXAFS_StoreData64(callp, &outStatus, &volSync);
if (code)
- osi_Log2(afsd_logp, "EndRXAFS_StoreData64 scp 0x%p failed (%lX)", scp, code);
+ osi_Log2(afsd_logp, "EndRXAFS_StoreData64 FAILURE scp 0x%p code %lX", scp, code);
+ else
+ osi_Log0(afsd_logp, "EndRXAFS_StoreData64 SUCCESS");
} else {
code = EndRXAFS_StoreData(callp, &outStatus, &volSync);
if (code)
- osi_Log2(afsd_logp, "EndRXAFS_StoreData scp 0x%p failed (%lX)",scp,code);
+ osi_Log2(afsd_logp, "EndRXAFS_StoreData FAILURE scp 0x%p code %lX",scp,code);
+ else
+ osi_Log0(afsd_logp, "EndRXAFS_StoreData SUCCESS");
}
}
return code;
}
-void cm_BkgStore(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4,
- cm_user_t *userp)
+afs_int32
+cm_BkgStore(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4,
+ cm_user_t *userp)
{
osi_hyper_t toffset;
long length;
cm_req_t req;
- long code;
+ long code = 0;
if (scp->flags & CM_SCACHEFLAG_DELETED) {
osi_Log4(afsd_logp, "Skipping BKG store - Deleted scp 0x%p, offset 0x%x:%08x, length 0x%x", scp, p2, p1, p3);
} else {
cm_InitReq(&req);
-#ifdef NO_BKG_RETRIES
+
+ /* Retries will be performed by the BkgDaemon thread if appropriate */
req.flags |= CM_REQ_NORETRY;
-#endif
toffset.LowPart = p1;
toffset.HighPart = p2;
osi_Log4(afsd_logp, "Starting BKG store scp 0x%p, offset 0x%x:%08x, length 0x%x", scp, p2, p1, p3);
code = cm_BufWrite(scp, &toffset, length, /* flags */ 0, userp, &req);
+
+ osi_Log4(afsd_logp, "Finished BKG store scp 0x%p, offset 0x%x:%08x, code 0x%x", scp, p2, p1, code);
}
lock_ObtainMutex(&scp->mx);
cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_ASYNCSTORE);
lock_ReleaseMutex(&scp->mx);
+
+ return code;
}
/* Called with scp locked */
scp->flags &= ~CM_SCACHEFLAG_PREFETCHING;
}
-/* do the prefetch */
-void cm_BkgPrefetch(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4,
- cm_user_t *userp)
+/* do the prefetch. if the prefetch fails, return 0 (success)
+ * because there is no harm done. */
+afs_int32
+cm_BkgPrefetch(cm_scache_t *scp, afs_uint32 p1, afs_uint32 p2, afs_uint32 p3, afs_uint32 p4,
+ cm_user_t *userp)
{
long length;
osi_hyper_t base;
cm_req_t req;
cm_InitReq(&req);
+
+ /* Retries will be performed by the BkgDaemon thread if appropriate */
req.flags |= CM_REQ_NORETRY;
base.LowPart = p1;
lock_ReleaseMutex(&scp->mx);
if (bp)
buf_Release(bp);
- return;
+ return 0;
}
code = cm_GetBuffer(scp, bp, &cpff, userp, &req);
cm_ClearPrefetchFlag(code, scp, &base);
lock_ReleaseMutex(&scp->mx);
buf_Release(bp);
- return;
+ return code;
}
/* a read was issued to offsetp, and we have to determine whether we should