From: Jeffrey Altman Date: Thu, 13 Sep 2007 18:59:21 +0000 (+0000) Subject: DEVEL15-windows-down-servers-20070913 X-Git-Tag: openafs-devel-1_5_25~14 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=c8e221ec04c3a2d82be0003f57276789758f6a13;p=packages%2Fo%2Fopenafs.git DEVEL15-windows-down-servers-20070913 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) --- diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index 6d0db27c5..c296bd512 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -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; inextp) { - + 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; iids[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); } diff --git a/src/WINNT/afsd/cm_callback.h b/src/WINNT/afsd/cm_callback.h index 5df58c7c9..5f6653f24 100644 --- a/src/WINNT/afsd/cm_callback.h +++ b/src/WINNT/afsd/cm_callback.h @@ -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__ */ diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c index b635998cc..a440d4836 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -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; diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 06e4b2017..f4138b45c 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -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(); } diff --git a/src/WINNT/afsd/cm_server.c b/src/WINNT/afsd/cm_server.c index 87374b876..870631cf1 100644 --- a/src/WINNT/afsd/cm_server.c +++ b/src/WINNT/afsd/cm_server.c @@ -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);