int doPing;
int isDown;
int isFS;
+ int isVLDB;
lock_ObtainRead(&cm_serverLock);
for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
doPing = 0;
isDown = tsp->flags & CM_SERVERFLAG_DOWN;
isFS = tsp->type == CM_SERVER_FILE;
+ isVLDB = tsp->type == CM_SERVER_VLDB;
/* only do the ping if the cell matches the requested cell, or we're
* matching all cells (cellp == NULL), and if we've requested to ping
((isDown && (flags & CM_FLAG_CHECKDOWNSERVERS)) ||
(!isDown && (flags & CM_FLAG_CHECKUPSERVERS))) &&
((!(flags & CM_FLAG_CHECKVLDBSERVERS) ||
- !isFS && (flags & CM_FLAG_CHECKVLDBSERVERS)) &&
+ isVLDB && (flags & CM_FLAG_CHECKVLDBSERVERS)) &&
(!(flags & CM_FLAG_CHECKFILESERVERS) ||
isFS && (flags & CM_FLAG_CHECKFILESERVERS)))) {
doPing = 1;
}
serverAddr = ntohl(serverp->addr.sin_addr.s_addr);
- serverp->ipRank = CM_IPRANK_LOW; /* default setings */
+ serverp->ipRank = CM_IPRANK_LOW; /* default settings */
for ( i=0; i < cm_noIPAddr; i++)
{
}
cm_server_t *
-cm_FindServerByIP(afs_uint32 ipaddr, int type)
+cm_FindServerByIP(afs_uint32 ipaddr, unsigned short port, int type)
{
cm_server_t *tsp;
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)
+ tsp->addr.sin_addr.S_un.S_addr == ipaddr &&
+ (tsp->addr.sin_port == port || tsp->addr.sin_port == 0))
+ break;
+ }
+
+ /* bump ref count if we found the server */
+ if (tsp)
+ cm_GetServerNoLock(tsp);
+
+ lock_ReleaseRead(&cm_serverLock);
+
+ return tsp;
+}
+
+cm_server_t *
+cm_FindServerByUuid(afsUUID *serverUuid, int type)
+{
+ cm_server_t *tsp;
+
+ lock_ObtainRead(&cm_serverLock);
+ for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
+ if (tsp->type == type && !afs_uuid_equal(&tsp->uuid, serverUuid))
break;
}
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_addr.s_addr == addrp->sin_addr.s_addr &&
+ (tsp->addr.sin_port == addrp->sin_port || tsp->addr.sin_port == 0))
break;
}
if (lock)
lock_ObtainRead(&cm_serverLock);
- sprintf(output, "%s - dumping servers - cm_numFileServers=%d, cm_numVldbServers=%d\r\n",
+ sprintf(output,
+ "%s - dumping servers - cm_numFileServers=%d, cm_numVldbServers=%d\r\n",
cookie, cm_numFileServers, cm_numVldbServers);
WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
down = ctime(&tsp->downTime);
down[strlen(down)-1] = '\0';
- sprintf(output, "%s - tsp=0x%p cell=%s addr=%-15s uuid=%s type=%s caps=0x%x flags=0x%x waitCount=%u rank=%u downTime=\"%s\" refCount=%u\r\n",
- cookie, tsp, tsp->cellp ? tsp->cellp->name : "", hoststr, uuidstr, type,
- tsp->capabilities, tsp->flags, tsp->waitCount, tsp->ipRank,
+ sprintf(output,
+ "%s - tsp=0x%p cell=%s addr=%-15s port=%u uuid=%s type=%s caps=0x%x "
+ "flags=0x%x waitCount=%u rank=%u downTime=\"%s\" refCount=%u\r\n",
+ cookie, tsp, tsp->cellp ? tsp->cellp->name : "", hoststr,
+ ntohs(tsp->addr.sin_port), uuidstr, type,
+ tsp->capabilities, tsp->flags, tsp->waitCount, tsp->ipRank,
(tsp->flags & CM_SERVERFLAG_DOWN) ? down : "up",
tsp->refCount);
WriteFile(outputFile, output, (DWORD)strlen(output), &zilch, NULL);
return (0);
}
+/*
+ * Determine if two servers are in fact the same.
+ *
+ * Returns 1 if they match, 0 if they do not
+ */
+int cm_ServerEqual(cm_server_t *srv1, cm_server_t *srv2)
+{
+ RPC_STATUS status;
+
+ if (srv1 == NULL || srv2 == NULL)
+ return 0;
+
+ if (srv1 == srv2)
+ return 1;
+ if (srv1->flags & CM_SERVERFLAG_UUID) {
+ if (!(srv2->flags & CM_SERVERFLAG_UUID))
+ return 0;
+
+ /* Both support UUID */
+ if (UuidEqual((UUID *)&srv1->uuid, (UUID *)&srv2->uuid, &status))
+ return 1;
+ }
+
+ return 0;
+}