long cm_daemonCheckVolInterval = 3600;
long cm_daemonCheckCBInterval = 60;
long cm_daemonCheckVolCBInterval = 0;
-long cm_daemonCheckLockInterval = 60;
+long cm_daemonCheckLockInterval = 2;
long cm_daemonTokenCheckInterval = 180;
long cm_daemonCheckOfflineVolInterval = 600;
long cm_daemonPerformanceTuningInterval = 0;
static time_t lastIPAddrChange = 0;
static EVENT_HANDLE cm_Daemon_ShutdownEvent = NULL;
+static EVENT_HANDLE cm_LockDaemon_ShutdownEvent = NULL;
static EVENT_HANDLE cm_IPAddrDaemon_ShutdownEvent = NULL;
static EVENT_HANDLE cm_BkgDaemon_ShutdownEvent[CM_MAX_DAEMONS] =
{NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL};
cm_PerformanceTuningInit();
}
+/* periodic lock check daemon */
+void cm_LockDaemon(long parm)
+{
+ time_t now;
+ time_t lastLockCheck;
+ char * name = "cm_LockDaemon_ShutdownEvent";
+
+ cm_LockDaemon_ShutdownEvent = thrd_CreateEvent(NULL, FALSE, FALSE, name);
+ if ( GetLastError() == ERROR_ALREADY_EXISTS )
+ afsi_log("Event Object Already Exists: %s", name);
+
+ now = osi_Time();
+ lastLockCheck = now - cm_daemonCheckLockInterval/2 + (rand() % cm_daemonCheckLockInterval);
+
+ while (daemon_ShutdownFlag == 0) {
+ if (powerStateSuspended) {
+ Sleep(1000);
+ continue;
+ }
+
+ now = osi_Time();
+
+ if (now > lastLockCheck + cm_daemonCheckLockInterval &&
+ daemon_ShutdownFlag == 0 &&
+ powerStateSuspended == 0) {
+ lastLockCheck = now;
+ cm_CheckLocks();
+ if (daemon_ShutdownFlag == 1)
+ break;
+ }
+
+ thrd_Sleep(1000); /* sleep 1 second */
+ }
+ thrd_SetEvent(cm_LockDaemon_ShutdownEvent);
+}
+
/* periodic check daemon */
void cm_Daemon(long parm)
{
time_t now;
- time_t lastLockCheck;
time_t lastVolCheck;
time_t lastCBExpirationCheck;
time_t lastVolCBRenewalCheck;
lastCBExpirationCheck = now - cm_daemonCheckCBInterval/2 + (rand() % cm_daemonCheckCBInterval);
if (cm_daemonCheckVolCBInterval)
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);
lastTokenCacheCheck = now - cm_daemonTokenCheckInterval/2 + (rand() % cm_daemonTokenCheckInterval);
now = osi_Time();
}
- if (now > lastLockCheck + cm_daemonCheckLockInterval &&
- daemon_ShutdownFlag == 0 &&
- powerStateSuspended == 0) {
- lastLockCheck = now;
- cm_CheckLocks();
- if (daemon_ShutdownFlag == 1)
- break;
- now = osi_Time();
- }
-
if (now > lastTokenCacheCheck + cm_daemonTokenCheckInterval &&
daemon_ShutdownFlag == 0 &&
powerStateSuspended == 0) {
if (cm_Daemon_ShutdownEvent)
code = thrd_WaitForSingleObject_Event(cm_Daemon_ShutdownEvent, INFINITE);
+ if (cm_LockDaemon_ShutdownEvent)
+ code = thrd_WaitForSingleObject_Event(cm_LockDaemon_ShutdownEvent, INFINITE);
+
for ( i=0; i<cm_nDaemons; i++) {
if (cm_BkgDaemon_ShutdownEvent[i])
code = thrd_WaitForSingleObject_Event(cm_BkgDaemon_ShutdownEvent[i], INFINITE);
osi_assertx(phandle != NULL, "cm_Daemon thread creation failure");
thrd_CloseHandle(phandle);
+ phandle = thrd_Create((SecurityAttrib) 0, 0,
+ (ThreadFunc) cm_LockDaemon, 0, 0, &pid, "cm_LockDaemon");
+ osi_assertx(phandle != NULL, "cm_LockDaemon thread creation failure");
+ thrd_CloseHandle(phandle);
+
for(i=0; i < cm_nDaemons; i++) {
phandle = thrd_Create((SecurityAttrib) 0, 0,
(ThreadFunc) cm_BkgDaemon, (LPVOID)(LONG_PTR)i, 0, &pid,
fileLock->flags |= CM_FILELOCK_FLAG_DELETED;
- cm_ReleaseUser(fileLock->userp);
- cm_ReleaseSCacheNoLock(scp);
-
- fileLock->userp = NULL;
- fileLock->scp = NULL;
-
n_unlocks++;
}
}
osi_Log1(afsd_logp, "cm_UnlockByKey done with %d locks", n_unlocks);
- code = cm_IntUnlock(scp, userp, reqp);
-
osi_Log1(afsd_logp, "cm_UnlockByKey code 0x%x", code);
osi_Log4(afsd_logp, " Leaving scp with excl[%d], shared[%d], client[%d], serverLock[%d]",
scp->exclusiveLocks, scp->sharedLocks, scp->clientLocks,
}
fileLock->flags |= CM_FILELOCK_FLAG_DELETED;
- if (userp != NULL) {
- cm_ReleaseUser(fileLock->userp);
- } else {
- userp = fileLock->userp;
- release_userp = TRUE;
- }
- fileLock->userp = NULL;
- cm_ReleaseSCacheNoLock(scp);
- fileLock->scp = NULL;
lock_ReleaseWrite(&cm_scacheLock);
- code = cm_IntUnlock(scp, userp, reqp);
-
if (release_userp) {
cm_ReleaseUser(userp);
release_userp = FALSE;
code = -1;
if (IS_LOCK_DELETED(fileLock)) {
+ cm_user_t *userp = fileLock->userp;
+ cm_scache_t *scp = fileLock->scp;
+ fileLock->userp = NULL;
+ fileLock->scp = NULL;
+
+ lock_ReleaseWrite(&cm_scacheLock);
+ lock_ObtainWrite(&scp->rw);
+ code = cm_IntUnlock(scp, userp, &req);
+ lock_ReleaseWrite(&scp->rw);
+
+ cm_ReleaseUser(fileLock->userp);
+ lock_ObtainWrite(&cm_scacheLock);
+ cm_ReleaseSCacheNoLock(scp);
osi_QRemove(&cm_allFileLocks, q);
cm_PutFileLock(fileLock);