saddr.sin_family = AF_INET;
dwRank += (rand() & 0x000f);
- tsp = cm_FindServer(&saddr, CM_SERVER_VLDB);
+ tsp = cm_FindServer(&saddr, CM_SERVER_VLDB, FALSE);
if ( tsp ) /* an existing server - ref count increased */
{
lock_ObtainMutex(&tsp->mx);
tsp->ipRank = (USHORT)dwRank;
- tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET);
tsp->adminRank = tsp->ipRank;
lock_ReleaseMutex(&tsp->mx);
tsp = cm_NewServer(&saddr, CM_SERVER_VLDB, NULL, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */
lock_ObtainMutex(&tsp->mx);
tsp->ipRank = (USHORT)dwRank;
- tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET);
tsp->adminRank = tsp->ipRank;
lock_ReleaseMutex(&tsp->mx);
}
saddr.sin_family = AF_INET;
dwRank += (rand() & 0x000f);
- tsp = cm_FindServer(&saddr, CM_SERVER_FILE);
+ tsp = cm_FindServer(&saddr, CM_SERVER_FILE, FALSE);
if ( tsp ) /* an existing server - ref count increased */
{
lock_ObtainMutex(&tsp->mx);
tsp->ipRank = (USHORT)dwRank;
- tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET);
tsp->adminRank = tsp->ipRank;
lock_ReleaseMutex(&tsp->mx);
tsp = cm_NewServer(&saddr, CM_SERVER_FILE, NULL, NULL, CM_FLAG_NOPROBE); /* refcount = 1 */
lock_ObtainMutex(&tsp->mx);
tsp->ipRank = (USHORT)dwRank;
- tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PREF_SET);
tsp->adminRank = tsp->ipRank;
lock_ReleaseMutex(&tsp->mx);
}
host = rx_HostOf(peerp);
port = rx_PortOf(peerp);
- tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE);
+ tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE, FALSE);
if (tsp) {
cellp = tsp->cellp;
cm_PutServer(tsp);
{
char *p = NULL;
- struct sockaddr_in taddr;
cm_server_t *tsp = NULL;
cm_scache_t *scp = NULL;
cm_cell_t* cellp = NULL;
RpcStringFree(&p);
}
- tsp = cm_FindServerByUuid(serverUuid, CM_SERVER_FILE);
+ tsp = cm_FindServerByUuid(serverUuid, CM_SERVER_FILE, FALSE);
}
if (!tsp)
- tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE);
+ tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE, FALSE);
if (tsp) {
cellp = tsp->cellp;
cm_PutServer(tsp);
}
if (connp && peerp) {
- taddr.sin_family = AF_INET;
- taddr.sin_addr.s_addr = rx_HostOf(rx_PeerOf(rx_ConnectionOf(callp)));
- taddr.sin_port = rx_PortOf(rx_PeerOf(rx_ConnectionOf(callp)));
-
- tsp = cm_FindServer(&taddr, CM_SERVER_FILE);
+ tsp = cm_FindServerByIP(host, port, CM_SERVER_FILE, FALSE);
osi_Log1(afsd_logp, "InitCallbackState3 server %x", tsp);
lock_ObtainMutex(&tsp->mx);
if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
- tsp->flags |= CM_SERVERFLAG_DOWN;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
tsp->downTime = time(NULL);
}
/* Now update the volume status */
lock_ObtainMutex(&tsp->mx);
if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
- tsp->flags |= CM_SERVERFLAG_DOWN;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
tsp->downTime = time(NULL);
}
/* Now update the volume status */
lock_ObtainMutex(&tsp->mx);
tsp->waitCount--;
if (tsp->waitCount == 0)
- tsp->flags &= ~CM_SERVERFLAG_PINGING;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING);
else
osi_Wakeup((LONG_PTR)tsp);
lock_ReleaseMutex(&tsp->mx);
return;
}
- tsp->flags |= CM_SERVERFLAG_PINGING;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PINGING);
wasDown = tsp->flags & CM_SERVERFLAG_DOWN;
afs_inet_ntoa_r(tsp->addr.sin_addr.S_un.S_addr, hoststr);
lock_ReleaseMutex(&tsp->mx);
lock_ObtainMutex(&tsp->mx);
if (code >= 0 || code == RXGEN_OPCODE) {
/* mark server as up */
- tsp->flags &= ~CM_SERVERFLAG_DOWN;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN);
tsp->downTime = 0;
/* we currently handle 32-bits of capabilities */
} else {
/* mark server as down */
if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
- tsp->flags |= CM_SERVERFLAG_DOWN;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
tsp->downTime = time(NULL);
}
if (code != VRESTARTING) {
}
if (tsp->waitCount == 0)
- tsp->flags &= ~CM_SERVERFLAG_PINGING;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING);
else
osi_Wakeup((LONG_PTR)tsp);
lock_ReleaseMutex(&tsp->mx);
continue;
}
- tsp->flags |= CM_SERVERFLAG_PINGING;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PINGING);
lock_ReleaseMutex(&tsp->mx);
serversp[nconns] = tsp;
if (results[i] >= 0 || results[i] == RXGEN_OPCODE) {
/* mark server as up */
- tsp->flags &= ~CM_SERVERFLAG_DOWN;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN);
tsp->downTime = 0;
/* we currently handle 32-bits of capabilities */
} else {
/* mark server as down */
if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
- tsp->flags |= CM_SERVERFLAG_DOWN;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
tsp->downTime = time(NULL);
}
if (code != VRESTARTING) {
}
if (tsp->waitCount == 0)
- tsp->flags &= ~CM_SERVERFLAG_PINGING;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING);
else
osi_Wakeup((LONG_PTR)tsp);
continue;
}
- tsp->flags |= CM_SERVERFLAG_PINGING;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_PINGING);
lock_ReleaseMutex(&tsp->mx);
serversp[nconns] = tsp;
if (results[i] >= 0) {
/* mark server as up */
- tsp->flags &= ~CM_SERVERFLAG_DOWN;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_DOWN);
tsp->downTime = 0;
tsp->capabilities = 0;
} else {
/* mark server as down */
if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
- tsp->flags |= CM_SERVERFLAG_DOWN;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
tsp->downTime = time(NULL);
}
if (code != VRESTARTING) {
}
if (tsp->waitCount == 0)
- tsp->flags &= ~CM_SERVERFLAG_PINGING;
+ _InterlockedAnd(&tsp->flags, ~CM_SERVERFLAG_PINGING);
else
osi_Wakeup((LONG_PTR)tsp);
{
lock_ObtainMutex(&serverp->mx);
if (no64bit)
- serverp->flags |= CM_SERVERFLAG_NO64BIT;
+ _InterlockedOr(&serverp->flags, CM_SERVERFLAG_NO64BIT);
else
- serverp->flags &= ~CM_SERVERFLAG_NO64BIT;
+ _InterlockedAnd(&serverp->flags, ~CM_SERVERFLAG_NO64BIT);
lock_ReleaseMutex(&serverp->mx);
}
{
lock_ObtainMutex(&serverp->mx);
if (no)
- serverp->flags |= CM_SERVERFLAG_NOINLINEBULK;
+ _InterlockedOr(&serverp->flags, CM_SERVERFLAG_NOINLINEBULK);
else
- serverp->flags &= ~CM_SERVERFLAG_NOINLINEBULK;
+ _InterlockedAnd(&serverp->flags, ~CM_SERVERFLAG_NOINLINEBULK);
lock_ReleaseMutex(&serverp->mx);
}
osi_assertx(socketp->sin_family == AF_INET, "unexpected socket family");
+ lock_ObtainWrite(&cm_serverLock); /* get server lock */
+ tsp = cm_FindServer(socketp, type, TRUE);
+ if (tsp) {
+ /* we might have found a server created by set server prefs */
+ if (uuidp && !afs_uuid_is_nil(uuidp) &&
+ !(tsp->flags & CM_SERVERFLAG_UUID))
+ {
+ tsp->uuid = *uuidp;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID);
+ }
+ lock_ReleaseWrite(&cm_serverLock);
+ return tsp;
+ }
+
tsp = malloc(sizeof(*tsp));
if (tsp) {
memset(tsp, 0, sizeof(*tsp));
tsp->cellp = cellp;
if (uuidp && !afs_uuid_is_nil(uuidp)) {
tsp->uuid = *uuidp;
- tsp->flags |= CM_SERVERFLAG_UUID;
+ _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID);
}
tsp->refCount = 1;
lock_InitializeMutex(&tsp->mx, "cm_server_t mutex", LOCK_HIERARCHY_SERVER);
cm_SetServerPrefs(tsp);
- lock_ObtainWrite(&cm_serverLock); /* get server lock */
tsp->allNextp = cm_allServersp;
cm_allServersp = tsp;
cm_numFileServers++;
break;
}
+ }
+ lock_ReleaseWrite(&cm_serverLock); /* release server lock */
- lock_ReleaseWrite(&cm_serverLock); /* release server lock */
-
- 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 */
- }
+ if (!(flags & CM_FLAG_NOPROBE) && tsp) {
+ _InterlockedOr(&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 *
-cm_FindServerByIP(afs_uint32 ipaddr, unsigned short port, int type)
+cm_FindServerByIP(afs_uint32 ipaddr, unsigned short port, int type, int locked)
{
cm_server_t *tsp;
- lock_ObtainRead(&cm_serverLock);
+ if (!locked)
+ lock_ObtainRead(&cm_serverLock);
+
for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
if (tsp->type == type &&
tsp->addr.sin_addr.S_un.S_addr == ipaddr &&
if (tsp)
cm_GetServerNoLock(tsp);
- lock_ReleaseRead(&cm_serverLock);
+ if (!locked)
+ lock_ReleaseRead(&cm_serverLock);
return tsp;
}
cm_server_t *
-cm_FindServerByUuid(afsUUID *serverUuid, int type)
+cm_FindServerByUuid(afsUUID *serverUuid, int type, int locked)
{
cm_server_t *tsp;
- lock_ObtainRead(&cm_serverLock);
+ if (locked)
+ lock_ObtainRead(&cm_serverLock);
+
for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
if (tsp->type == type && !afs_uuid_equal(&tsp->uuid, serverUuid))
break;
if (tsp)
cm_GetServerNoLock(tsp);
- lock_ReleaseRead(&cm_serverLock);
+ if (!locked)
+ lock_ReleaseRead(&cm_serverLock);
return tsp;
}
/* find a server based on its properties */
-cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type)
+cm_server_t *cm_FindServer(struct sockaddr_in *addrp, int type, int locked)
{
- cm_server_t *tsp;
-
osi_assertx(addrp->sin_family == AF_INET, "unexpected socket value");
- lock_ObtainRead(&cm_serverLock);
- for (tsp = cm_allServersp; tsp; tsp=tsp->allNextp) {
- if (tsp->type == type &&
- tsp->addr.sin_addr.s_addr == addrp->sin_addr.s_addr &&
- (tsp->addr.sin_port == addrp->sin_port || tsp->addr.sin_port == 0))
- break;
- }
-
- /* bump ref count if we found the server */
- if (tsp)
- cm_GetServerNoLock(tsp);
-
- /* drop big table lock */
- lock_ReleaseRead(&cm_serverLock);
-
- /* return what we found */
- return tsp;
+ return cm_FindServerByIP(addrp->sin_addr.s_addr, addrp->sin_port, type, locked);
}
cm_server_vols_t *cm_NewServerVols(void) {