Windows: No network, no probe
[openafs.git] / src / WINNT / afsd / cm_server.c
index cf0bba8..c3ada8a 100644 (file)
@@ -206,6 +206,51 @@ cm_RankServer(cm_server_t * tsp)
     return code;
 }
 
+static void
+cm_MarkServerDown(cm_server_t *tsp, afs_int32 code, int wasDown)
+{
+
+    /* mark server as down */
+    if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
+       _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
+       tsp->downTime = time(NULL);
+    }
+    if (code != VRESTARTING) {
+       lock_ReleaseMutex(&tsp->mx);
+       cm_ForceNewConnections(tsp);
+       lock_ObtainMutex(&tsp->mx);
+    }
+    /* Now update the volume status if necessary */
+    if (!wasDown) {
+       if (tsp->type == CM_SERVER_FILE) {
+           cm_server_vols_t * tsrvp;
+           cm_volume_t * volp;
+           int i;
+           cm_req_t req;
+
+           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_FindVolumeByID(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);
+                       }
+                   }
+               }
+           }
+       }
+       cm_RankServer(tsp);
+    }
+}
+
 void
 cm_PingServer(cm_server_t *tsp)
 {
@@ -235,7 +280,10 @@ cm_PingServer(cm_server_t *tsp)
     afs_inet_ntoa_r(tsp->addr.sin_addr.S_un.S_addr, hoststr);
     lock_ReleaseMutex(&tsp->mx);
 
-    code = cm_ConnByServer(tsp, cm_rootUserp, FALSE, &connp);
+    if (cm_noIPAddr > 0)
+       code = cm_ConnByServer(tsp, cm_rootUserp, FALSE, &connp);
+    else
+       code = RX_CALL_DEAD;    /* No network */
     if (code == 0) {
        /* now call the appropriate ping call.  Drop the timeout if
        * the server is known to be down, so that we don't waste a
@@ -311,45 +359,12 @@ cm_PingServer(cm_server_t *tsp)
             cm_RankServer(tsp);
         }
     } else {
-       /* mark server as down */
-        if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
-            _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
-            tsp->downTime = time(NULL);
-        }
-       if (code != VRESTARTING) {
-            lock_ReleaseMutex(&tsp->mx);
-           cm_ForceNewConnections(tsp);
-            lock_ObtainMutex(&tsp->mx);
-        }
+       cm_MarkServerDown(tsp, code, wasDown);
+
        osi_Log3(afsd_logp, "cm_PingServer server %s (%s) is down with caps 0x%x",
                  osi_LogSaveString(afsd_logp, hoststr),
                  tsp->type == CM_SERVER_VLDB ? "vldb" : "file",
                  tsp->capabilities);
-
-        /* Now update the volume status if necessary */
-        if (!wasDown) {
-            cm_server_vols_t * tsrvp;
-            cm_volume_t * volp;
-            int i;
-
-            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_FindVolumeByID(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);
-                        }
-                    }
-                }
-            }
-            cm_RankServer(tsp);
-        }
     }
 
     if (tsp->waitCount == 0)
@@ -518,10 +533,18 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
             lock_ReleaseMutex(&tsp->mx);
 
             serversp[nconns] = tsp;
-            code = cm_ConnByServer(tsp, cm_rootUserp, FALSE, &conns[nconns]);
+           if (cm_noIPAddr > 0)
+               code = cm_ConnByServer(tsp, cm_rootUserp, FALSE, &conns[nconns]);
+           else
+               code = RX_CALL_DEAD;
             if (code) {
-                lock_ObtainRead(&cm_serverLock);
-                cm_PutServerNoLock(tsp);
+               if (code == RX_CALL_DEAD) {
+                   lock_ObtainMutex(&tsp->mx);
+                   cm_MarkServerDown(tsp, code, isDown);
+                   lock_ReleaseMutex(&tsp->mx);
+               }
+               lock_ObtainRead(&cm_serverLock);
+               cm_PutServerNoLock(tsp);
                 continue;
             }
             lock_ObtainRead(&cm_serverLock);
@@ -604,46 +627,13 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
                     cm_RankServer(tsp);
                 }
             } else {
-                /* mark server as down */
-                if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
-                    _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
-                    tsp->downTime = time(NULL);
-                }
-                if (code != VRESTARTING) {
-                    lock_ReleaseMutex(&tsp->mx);
-                    cm_ForceNewConnections(tsp);
-                    lock_ObtainMutex(&tsp->mx);
-                }
-                afs_inet_ntoa_r(tsp->addr.sin_addr.S_un.S_addr, hoststr);
+               cm_MarkServerDown(tsp, results[i], wasDown);
+
+               afs_inet_ntoa_r(tsp->addr.sin_addr.S_un.S_addr, hoststr);
                 osi_Log3(afsd_logp, "cm_MultiPingServer server %s (%s) is down with caps 0x%x",
                           osi_LogSaveString(afsd_logp, hoststr),
                           tsp->type == CM_SERVER_VLDB ? "vldb" : "file",
                           tsp->capabilities);
-
-                /* Now update the volume status if necessary */
-                if (!wasDown) {
-                    cm_server_vols_t * tsrvp;
-                    cm_volume_t * volp;
-                    int i;
-
-                    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_FindVolumeByID(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);
-                                }
-                            }
-                        }
-                    }
-                    cm_RankServer(tsp);
-                }
             }
 
             if (tsp->waitCount == 0)
@@ -688,9 +678,17 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
             lock_ReleaseMutex(&tsp->mx);
 
             serversp[nconns] = tsp;
-            code = cm_ConnByServer(tsp, cm_rootUserp, FALSE, &conns[nconns]);
+           if (cm_noIPAddr > 0)
+               code = cm_ConnByServer(tsp, cm_rootUserp, FALSE, &conns[nconns]);
+           else
+               code = RX_CALL_DEAD;
             if (code) {
-                lock_ObtainRead(&cm_serverLock);
+               if (code == RX_CALL_DEAD) {
+                   lock_ObtainMutex(&tsp->mx);
+                   cm_MarkServerDown(tsp, code, isDown);
+                   lock_ReleaseMutex(&tsp->mx);
+               }
+               lock_ObtainRead(&cm_serverLock);
                 cm_PutServerNoLock(tsp);
                 continue;
             }
@@ -741,23 +739,13 @@ static void cm_CheckServersMulti(afs_uint32 flags, cm_cell_t *cellp)
                 if (wasDown)
                     cm_RankServer(tsp);
             } else {
-                /* mark server as down */
-                if (!(tsp->flags & CM_SERVERFLAG_DOWN)) {
-                    _InterlockedOr(&tsp->flags, CM_SERVERFLAG_DOWN);
-                    tsp->downTime = time(NULL);
-                }
-                if (code != VRESTARTING) {
-                    lock_ReleaseMutex(&tsp->mx);
-                    cm_ForceNewConnections(tsp);
-                    lock_ObtainMutex(&tsp->mx);
-                }
-                afs_inet_ntoa_r(tsp->addr.sin_addr.S_un.S_addr, hoststr);
+               cm_MarkServerDown(tsp, results[i], wasDown);
+
+               afs_inet_ntoa_r(tsp->addr.sin_addr.S_un.S_addr, hoststr);
                 osi_Log3(afsd_logp, "cm_MultiPingServer server %s (%s) is down with caps 0x%x",
                           osi_LogSaveString(afsd_logp, hoststr),
                           tsp->type == CM_SERVER_VLDB ? "vldb" : "file",
                           tsp->capabilities);
-                if (!wasDown)
-                    cm_RankServer(tsp);
             }
 
             if (tsp->waitCount == 0)
@@ -874,25 +862,32 @@ void cm_SetServerNoInlineBulk(cm_server_t * serverp, int no)
     lock_ReleaseMutex(&serverp->mx);
 }
 
+afs_int32 cm_UpdateIFInfo(void)
+{
+    afs_int32 code;
+    /* get network related info */
+    cm_noIPAddr = CM_MAXINTERFACE_ADDR;
+    code = syscfg_GetIFInfo(&cm_noIPAddr,
+                            cm_IPAddr, cm_SubnetMask,
+                            cm_NetMtu, cm_NetFlags);
+    cm_LanAdapterChangeDetected = 0;
+    return code;
+}
+
 void cm_SetServerIPRank(cm_server_t * serverp)
 {
     unsigned long      serverAddr;     /* in host byte order */
     unsigned long      myAddr, myNet, mySubnet;/* in host byte order */
     unsigned long      netMask;
     int                i;
-    long code;
+    afs_int32          code;
 
     lock_ObtainRead(&cm_syscfgLock);
     if (cm_LanAdapterChangeDetected) {
         lock_ConvertRToW(&cm_syscfgLock);
         if (cm_LanAdapterChangeDetected) {
-            /* get network related info */
-            cm_noIPAddr = CM_MAXINTERFACE_ADDR;
-            code = syscfg_GetIFInfo(&cm_noIPAddr,
-                                     cm_IPAddr, cm_SubnetMask,
-                                     cm_NetMtu, cm_NetFlags);
-            cm_LanAdapterChangeDetected = 0;
-        }
+           code = cm_UpdateIFInfo();
+       }
         lock_ConvertWToR(&cm_syscfgLock);
     }