Windows: cm_AddCellProc always call cm_NewServer
authorJeffrey Altman <jaltman@your-file-system.com>
Fri, 31 Jan 2014 05:49:44 +0000 (00:49 -0500)
committerJeffrey Altman <jaltman@your-file-system.com>
Sat, 8 Feb 2014 15:25:00 +0000 (07:25 -0800)
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 <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@your-file-system.com>

src/WINNT/afsd/cm_cell.c
src/WINNT/afsd/cm_server.c

index df7dc64..990584b 100644 (file)
@@ -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;
index 256f1db..52e1672 100644 (file)
@@ -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 */