]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-down-servers-20070913
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 13 Sep 2007 18:59:21 +0000 (18:59 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 13 Sep 2007 18:59:21 +0000 (18:59 +0000)
Do not assign a new downTime to a server that is already down.
Doing so breaks the logic to preserve callback validity until the
server comes back up.

(cherry picked from commit 70fa2d2499fbe687e55559fd6d154601645734d6)

src/WINNT/afsd/cm_callback.c
src/WINNT/afsd/cm_callback.h
src/WINNT/afsd/cm_conn.c
src/WINNT/afsd/cm_scache.c
src/WINNT/afsd/cm_server.c

index 6d0db27c587a0c582e8d23cc63afdff43d6ba1e0..c296bd51282095f27389ef834b02d0be9eb09ea3 100644 (file)
@@ -231,7 +231,7 @@ void cm_RevokeCallback(struct rx_call *callp, cm_cell_t * cellp, AFSFid *fidp)
  */
 void cm_RevokeVolumeCallback(struct rx_call *callp, cm_cell_t *cellp, AFSFid *fidp)
 {
-    long hash;
+    unsigned long hash;
     cm_scache_t *scp;
     cm_fid_t tfid;
 
@@ -411,7 +411,7 @@ SRXAFSCB_InitCallBackState(struct rx_call *callp)
     struct sockaddr_in taddr;
     cm_server_t *tsp;
     cm_scache_t *scp;
-    int hash;
+    afs_uint32 hash;
     int discarded;
     struct rx_connection *connp;
     struct rx_peer *peerp;
@@ -686,7 +686,7 @@ SRXAFSCB_GetLock(struct rx_call *callp, long index, AFSDBLock *lockp)
 int
 SRXAFSCB_GetCE(struct rx_call *callp, long index, AFSDBCacheEntry *cep)
 {
-    int i;
+    afs_uint32 i;
     cm_scache_t * scp;
     int code;
     struct rx_connection *connp;
@@ -792,7 +792,7 @@ SRXAFSCB_GetCE(struct rx_call *callp, long index, AFSDBCacheEntry *cep)
 int
 SRXAFSCB_GetCE64(struct rx_call *callp, long index, AFSDBCacheEntry64 *cep)
 {
-    int i;
+    afs_uint32 i;
     cm_scache_t * scp;
     int code;
     struct rx_connection *connp;
@@ -1799,9 +1799,9 @@ long cm_CBServersUp(cm_scache_t *scp, time_t * downTime)
 /* called periodically by cm_daemon to shut down use of expired callbacks */
 void cm_CheckCBExpiration(void)
 {
-    int i;
+    afs_uint32 i;
     cm_scache_t *scp;
-    time_t now, downTime = 0;
+    time_t now, downTime;
         
     osi_Log0(afsd_logp, "CheckCBExpiration");
 
@@ -1809,7 +1809,7 @@ void cm_CheckCBExpiration(void)
     lock_ObtainWrite(&cm_scacheLock);
     for (i=0; i<cm_data.scacheHashTableSize; i++) {
         for (scp = cm_data.scacheHashTablep[i]; scp; scp=scp->nextp) {
-
+            downTime = 0;
             if (scp->cbServerp && scp->cbExpires > 0 && now > scp->cbExpires && 
                  (cm_CBServersUp(scp, &downTime) || downTime == 0 || downTime >= scp->cbExpires)) 
             {
@@ -1835,26 +1835,59 @@ void cm_CheckCBExpiration(void)
 
 
 void 
-cm_GiveUpAllCallbacks(cm_server_t *tsp)
+cm_GiveUpAllCallbacks(cm_server_t *tsp, afs_int32 markDown)
 {
     long code;
     cm_conn_t *connp;
     struct rx_connection * rxconnp;
 
-    if (tsp->type == CM_SERVER_FILE && !(tsp->flags & CM_SERVERFLAG_DOWN)) {
+    if ((tsp->type == CM_SERVER_FILE) && !(tsp->flags & CM_SERVERFLAG_DOWN)) 
+    {
         code = cm_ConnByServer(tsp, cm_rootUserp, &connp);
         if (code == 0) {
             rxconnp = cm_GetRxConn(connp);
             rx_SetConnDeadTime(rxconnp, 10);
-           code = RXAFS_GiveUpAllCallBacks(rxconnp);
+            code = RXAFS_GiveUpAllCallBacks(rxconnp);
             rx_SetConnDeadTime(rxconnp, ConnDeadtimeout);
-           rx_PutConnection(rxconnp);
+            rx_PutConnection(rxconnp);
+        }
+
+        if (markDown) {
+            cm_server_vols_t * tsrvp;
+            cm_volume_t * volp;
+            int i;
+
+            lock_ObtainMutex(&tsp->mx);
+            if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
+                tsp->flags |= CM_SERVERFLAG_DOWN;
+                tsp->downTime = osi_Time();
+            }
+            cm_ForceNewConnections(tsp);
+            lock_ReleaseMutex(&tsp->mx);
+
+            /* Now update the volume status */
+            for (tsrvp = tsp->vols; tsrvp; tsrvp = tsrvp->nextp) {
+                for (i=0; i<NUM_SERVER_VOLS; i++) {
+                    if (tsrvp->ids[i] != 0) {
+                        cm_req_t req;
+
+                        cm_InitReq(&req);
+
+                        code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
+                                                 &req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
+                        if (code == 0) {    
+                            cm_UpdateVolumeStatus(volp, tsrvp->ids[i]);
+                            cm_PutVolume(volp);
+                        }
+                    }
+                }
+            }
         }
     }
 }
 
 void
-cm_GiveUpAllCallbacksAllServers(void)
+cm_GiveUpAllCallbacksAllServers(afs_int32 markDown)
 {
     cm_server_t *tsp;
 
@@ -1862,7 +1895,7 @@ cm_GiveUpAllCallbacksAllServers(void)
     for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
         cm_GetServerNoLock(tsp);
         lock_ReleaseWrite(&cm_serverLock);
-        cm_GiveUpAllCallbacks(tsp);
+        cm_GiveUpAllCallbacks(tsp, markDown);
         lock_ObtainWrite(&cm_serverLock);
         cm_PutServerNoLock(tsp);
     }
index 5df58c7c9a3176e90b35f9259082744c0d26e474..5f6653f245092eda69e2114af0538b5869c1a051 100644 (file)
@@ -68,8 +68,8 @@ extern osi_rwlock_t cm_callbackLock;
 
 extern void cm_CallbackNotifyChange(cm_scache_t *scp);
 
-extern void cm_GiveUpAllCallbacks(cm_server_t *tsp);
+extern void cm_GiveUpAllCallbacks(cm_server_t *tsp, afs_int32 markDown);
 
-extern void cm_GiveUpAllCallbacksAllServers(void);
+extern void cm_GiveUpAllCallbacksAllServers(afs_int32 markDown);
 
 #endif /*  _CM_CALLBACK_H_ENV__ */
index b635998ccad6f4522307883ac6ec80e0cdc735c5..a440d483623ae66c7ac4ae5e5bfe48d1cfe0d1f2 100644 (file)
@@ -552,8 +552,10 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
         /* mark server as down */
         lock_ObtainMutex(&serverp->mx);
        if (reqp->flags & CM_REQ_NEW_CONN_FORCED) {
-           serverp->flags |= CM_SERVERFLAG_DOWN;
-            serverp->downTime = osi_Time();
+            if (!(serverp->flags & CM_SERVERFLAG_DOWN)) {
+                serverp->flags |= CM_SERVERFLAG_DOWN;
+                serverp->downTime = osi_Time();
+            }
         } else {
            reqp->flags |= CM_REQ_NEW_CONN_FORCED;
            forcing_new = 1;
index 06e4b2017a03dc1d40dadb5d83e535c021558bb8..f4138b45c9bb0b9022ff42783a5c68700d143fa5 100644 (file)
@@ -474,19 +474,26 @@ void
 cm_SuspendSCache(void)
 {
     cm_scache_t * scp;
-
-    cm_GiveUpAllCallbacksAllServers();
+    time_t now;
+
+    cm_GiveUpAllCallbacksAllServers(TRUE);
+
+    /* 
+     * After this call all servers are marked down.
+     * Do not clear the callbacks, instead change the
+     * expiration time so that the callbacks will be expired
+     * when the servers are marked back up.  However, we
+     * want the callbacks to be preserved as long as the 
+     * servers are down.  That way if the machine resumes
+     * without network, the stat cache item will still be
+     * considered valid.
+     */
+    now = osi_Time();
 
     lock_ObtainWrite(&cm_scacheLock);
-    for ( scp = cm_data.allSCachesp; scp;
-          scp = scp->allNextp ) {
-        if (scp->cbServerp && 
-            !(scp->cbServerp->flags & CM_SERVERFLAG_DOWN)) {
-            cm_PutServer(scp->cbServerp);
-            scp->cbServerp = NULL;
-        }
-        scp->cbExpires = 0;
-        scp->flags &= ~CM_SCACHEFLAG_CALLBACK;
+    for ( scp = cm_data.allSCachesp; scp; scp = scp->allNextp ) {
+        if (scp->cbServerp)
+            scp->cbExpires = now+1;
     }
     lock_ReleaseWrite(&cm_scacheLock);
 }
@@ -525,7 +532,7 @@ cm_ShutdownSCache(void)
     }
     lock_ReleaseWrite(&cm_scacheLock);
 
-    cm_GiveUpAllCallbacksAllServers();
+    cm_GiveUpAllCallbacksAllServers(FALSE);
 
     return cm_dnlcShutdown();
 }
index 87374b876969e8a90d76a5dcc0f2e0415f62644d..870631cf1866ef4a49b16ec0b362d16ee7b204ba 100644 (file)
@@ -152,8 +152,10 @@ cm_PingServer(cm_server_t *tsp)
         }
     } else {
        /* mark server as down */
-       tsp->flags |= CM_SERVERFLAG_DOWN;
-        tsp->downTime = osi_Time();
+        if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
+            tsp->flags |= CM_SERVERFLAG_DOWN;
+            tsp->downTime = osi_Time();
+        }
        if (code != VRESTARTING)
            cm_ForceNewConnections(tsp);