#include <string.h>
#include "afsd.h"
+#include <WINNT\syscfg.h>
#include <osi.h>
#include <rx/rx.h>
{
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
wasDown ? "down" : "up",
tsp->capabilities);
+ rxconnp = cm_GetRxConn(connp);
if (wasDown)
- rx_SetConnDeadTime(connp->callp, 10);
+ rx_SetConnDeadTime(rxconnp, 10);
if (tsp->type == CM_SERVER_VLDB) {
- code = VL_ProbeServer(connp->callp);
+ code = VL_ProbeServer(rxconnp);
}
else {
/* file server */
- rxconnp = cm_GetRxConn(connp);
code = RXAFS_GetCapabilities(rxconnp, &caps);
if (code == RXGEN_OPCODE)
code = RXAFS_GetTime(rxconnp, &secs, &usecs);
- rx_PutConnection(rxconnp);
}
if (wasDown)
- rx_SetConnDeadTime(connp->callp, ConnDeadtimeout);
+ rx_SetConnDeadTime(rxconnp, ConnDeadtimeout);
+ rx_PutConnection(rxconnp);
cm_PutConn(connp);
} /* got an unauthenticated connection to this server */
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) {
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) )
+ 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) {