From: Jeffrey Altman Date: Fri, 31 Jan 2014 05:49:44 +0000 (-0500) Subject: Windows: cm_AddCellProc always call cm_NewServer X-Git-Tag: upstream/1.8.0_pre1^2~791 X-Git-Url: https://git.michaelhowe.org/gitweb/?a=commitdiff_plain;h=dd9e59805b37a93f0f64c67cfa3ba4d80f1f358c;p=packages%2Fo%2Fopenafs.git Windows: cm_AddCellProc always call cm_NewServer The current implementation of cm_NewServer handles races and collisions. There is no need to perform a cm_FindServer() check first. Just call cm_NewServer() for all server entries. Move the logging of server creation and cell assignment to cm_NewServer(). Change-Id: If0cdb2eda9bcb6234eeaef7c2a35edf751a9c0ca Reviewed-on: http://gerrit.openafs.org/10775 Tested-by: BuildBot Reviewed-by: Jeffrey Altman --- diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index df7dc64ed..990584b77 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -44,20 +44,8 @@ long cm_AddCellProc(void *rockp, struct sockaddr_in *addrp, char *hostnamep, uns cellp = cellrockp->cellp; probe = !(cellrockp->flags & CM_FLAG_NOPROBE); - /* if this server was previously created by fs setserverprefs */ - if ( tsp = cm_FindServer(addrp, CM_SERVER_VLDB, FALSE)) - { - if ( !tsp->cellp ) - tsp->cellp = cellp; - else if (tsp->cellp != cellp) { - osi_Log3(afsd_logp, "found a vlserver %s associated with two cells named %s and %s", - osi_LogSaveString(afsd_logp,hostnamep), - osi_LogSaveString(afsd_logp,tsp->cellp->name), - osi_LogSaveString(afsd_logp,cellp->name)); - } - } - else - tsp = cm_NewServer(addrp, CM_SERVER_VLDB, cellp, NULL, probe ? 0 : CM_FLAG_NOPROBE); + tsp = cm_NewServer(addrp, CM_SERVER_VLDB, cellp, NULL, + probe ? 0 : CM_FLAG_NOPROBE); if (adminRank) tsp->adminRank = adminRank; diff --git a/src/WINNT/afsd/cm_server.c b/src/WINNT/afsd/cm_server.c index 256f1dbc2..52e1672f1 100644 --- a/src/WINNT/afsd/cm_server.c +++ b/src/WINNT/afsd/cm_server.c @@ -938,6 +938,7 @@ void cm_SetServerIPRank(cm_server_t * serverp) cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cellp, afsUUID *uuidp, afs_uint32 flags) { cm_server_t *tsp; + char hoststr[16]; osi_assertx(socketp->sin_family == AF_INET, "unexpected socket family"); @@ -951,7 +952,26 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell tsp->uuid = *uuidp; _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID); } - lock_ReleaseWrite(&cm_serverLock); + + if (cellp != NULL && tsp->cellp == NULL) { + tsp->cellp = cellp; + afs_inet_ntoa_r(tsp->addr.sin_addr.s_addr, hoststr); + osi_Log3(afsd_logp, "cm_NewServer assigning server %s to cell (%u) %s", + osi_LogSaveString(afsd_logp,hoststr), + cellp->cellID, + osi_LogSaveString(afsd_logp,cellp->name)); + } + else if (tsp->cellp != cellp) { + afs_inet_ntoa_r(tsp->addr.sin_addr.s_addr, hoststr); + osi_Log5(afsd_logp, + "cm_NewServer found a server %s associated with two cells (%u) %s and (%u) %s", + osi_LogSaveString(afsd_logp,hoststr), + tsp->cellp->cellID, + osi_LogSaveString(afsd_logp,tsp->cellp->name), + cellp->cellID, + osi_LogSaveString(afsd_logp,cellp->name)); + } + lock_ReleaseWrite(&cm_serverLock); return tsp; } @@ -959,7 +979,6 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell if (tsp) { memset(tsp, 0, sizeof(*tsp)); tsp->type = type; - tsp->cellp = cellp; if (uuidp && !afs_uuid_is_nil(uuidp)) { tsp->uuid = *uuidp; _InterlockedOr(&tsp->flags, CM_SERVERFLAG_UUID); @@ -979,6 +998,15 @@ cm_server_t *cm_NewServer(struct sockaddr_in *socketp, int type, cm_cell_t *cell cm_numFileServers++; break; } + + if (cellp != NULL) { + tsp->cellp = cellp; + afs_inet_ntoa_r(tsp->addr.sin_addr.s_addr, hoststr); + osi_Log3(afsd_logp, "cm_NewServer new server %s in cell (%u) %s", + osi_LogSaveString(afsd_logp,hoststr), + cellp->cellID, + osi_LogSaveString(afsd_logp,cellp->name)); + } } lock_ReleaseWrite(&cm_serverLock); /* release server lock */