{
cm_server_t *tsp;
- lock_ObtainRead(&cm_serverLock);
+ lock_ObtainWrite(&cm_serverLock);
for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
cm_GetServerNoLock(tsp);
cm_ForceNewConnections(tsp);
cm_PutServerNoLock(tsp);
}
- lock_ReleaseRead(&cm_serverLock);
+ lock_ReleaseWrite(&cm_serverLock);
}
void
if (code >= 0) {
/* mark server as up */
tsp->flags &= ~CM_SERVERFLAG_DOWN;
+ tsp->downTime = 0;
/* we currently handle 32-bits of capabilities */
if (caps.Capabilities_len > 0) {
cm_volume_t * volp;
int i;
- lock_ReleaseMutex(&tsp->mx);
for (tsrvp = tsp->vols; tsrvp; tsrvp = tsrvp->nextp) {
for (i=0; i<NUM_SERVER_VOLS; i++) {
if (tsrvp->ids[i] != 0) {
cm_InitReq(&req);
+ lock_ReleaseMutex(&tsp->mx);
code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
&req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
+ lock_ObtainMutex(&tsp->mx);
if (code == 0) {
cm_UpdateVolumeStatus(volp, tsrvp->ids[i]);
cm_PutVolume(volp);
}
}
}
- lock_ObtainMutex(&tsp->mx);
}
} else {
/* mark server as down */
- tsp->flags |= CM_SERVERFLAG_DOWN;
+ if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
+ tsp->flags |= CM_SERVERFLAG_DOWN;
+ tsp->downTime = osi_Time();
+ }
if (code != VRESTARTING)
cm_ForceNewConnections(tsp);
cm_volume_t * volp;
int i;
- lock_ReleaseMutex(&tsp->mx);
for (tsrvp = tsp->vols; tsrvp; tsrvp = tsrvp->nextp) {
for (i=0; i<NUM_SERVER_VOLS; i++) {
if (tsrvp->ids[i] != 0) {
cm_InitReq(&req);
+ lock_ReleaseMutex(&tsp->mx);
code = cm_GetVolumeByID(tsp->cellp, tsrvp->ids[i], cm_rootUserp,
&req, CM_GETVOL_FLAG_NO_LRU_UPDATE, &volp);
+ lock_ObtainMutex(&tsp->mx);
if (code == 0) {
cm_UpdateVolumeStatus(volp, tsrvp->ids[i]);
cm_PutVolume(volp);
}
}
}
- lock_ObtainMutex(&tsp->mx);
}
}
void cm_PutServer(cm_server_t *serverp)
{
lock_ObtainWrite(&cm_serverLock);
- osi_assert(serverp->refCount-- > 0);
+ osi_assertx(serverp->refCount-- > 0, "cm_server_t refCount 0");
lock_ReleaseWrite(&cm_serverLock);
}
void cm_PutServerNoLock(cm_server_t *serverp)
{
- osi_assert(serverp->refCount-- > 0);
+ osi_assertx(serverp->refCount-- > 0, "cm_server_t refCount 0");
}
void cm_SetServerNo64Bit(cm_server_t * serverp, int no64bit)
} /* and of for loop */
}
-cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp) {
+cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp, afs_uint32 flags) {
cm_server_t *tsp;
- osi_assert(socketp->sin_family == AF_INET);
+ osi_assertx(socketp->sin_family == AF_INET, "unexpected socket family");
tsp = malloc(sizeof(*tsp));
if (tsp) {
tsp->refCount = 1;
lock_InitializeMutex(&tsp->mx, "cm_server_t mutex");
tsp->addr = *socketp;
- tsp->flags = CM_SERVERFLAG_DOWN; /* assume down; ping will mark up if available */
cm_SetServerPrefs(tsp);
cm_allServersp = tsp;
lock_ReleaseWrite(&cm_serverLock); /* release server lock */
- cm_PingServer(tsp); /* Obtain Capabilities and check up/down state */
+ if ( !(flags & CM_FLAG_NOPROBE) ) {
+ tsp->flags = CM_SERVERFLAG_DOWN; /* assume down; ping will mark up if available */
+ cm_PingServer(tsp); /* Obtain Capabilities and check up/down state */
+ }
}
return tsp;
}
{
cm_server_t *tsp;
- osi_assert(addrp->sin_family == AF_INET);
+ osi_assertx(addrp->sin_family == AF_INET, "unexpected socket value");
lock_ObtainWrite(&cm_serverLock);
for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) {