windows-server-ping-20060216
authorJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 16 Feb 2006 22:03:47 +0000 (22:03 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Thu, 16 Feb 2006 22:03:47 +0000 (22:03 +0000)
add logging of server addresses, status and capabilities

prevent multiple threads from pinging the same server simultaneously.
instead, threads block and then use the result of the ping that was
already taking place.

src/WINNT/afsd/NTMakefile
src/WINNT/afsd/cm_server.c
src/WINNT/afsd/cm_server.h

index e491822..4231d62 100644 (file)
@@ -402,6 +402,7 @@ AFSD_EXELIBS =\
        $(DESTDIR)\lib\afs\mtafsint.lib \
        $(DESTDIR)\lib\libafsconf.lib \
        $(DESTDIR)\lib\afs\afsreg.lib \
+       $(DESTDIR)\lib\afs\afsutil.lib \
         $(LANAHELPERLIB)
 
 $(AFSD_EXEFILE): $(OUT)\afsd.obj $(AFSDOBJS) $(OUT)\afsd.res  $(RXOBJS) $(AFSD_EXELIBS)
index 5a2dd83..e94e348 100644 (file)
@@ -39,6 +39,25 @@ cm_PingServer(cm_server_t *tsp)
     long secs;
     long usecs;
     Capabilities caps = {0, 0};
+    char hoststr[16];
+
+    lock_ObtainMutex(&tsp->mx);
+    if (tsp->flags & CM_SERVERFLAG_PINGING) {
+       tsp->waitCount++;
+       osi_SleepM((LONG_PTR)tsp, &tsp->mx);
+       lock_ObtainMutex(&tsp->mx);
+       tsp->waitCount--;
+       if (tsp->waitCount == 0)
+           tsp->flags &= ~CM_SERVERFLAG_PINGING;
+       else 
+           osi_Wakeup((LONG_PTR)tsp);
+       lock_ReleaseMutex(&tsp->mx);
+       return;
+    }
+    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);
 
     code = cm_ConnByServer(tsp, cm_rootUserp, &connp);
     if (code == 0) {
@@ -46,7 +65,13 @@ cm_PingServer(cm_server_t *tsp)
        * the server is known to be down, so that we don't waste a
        * lot of time retiming out down servers.
        */
-        wasDown = tsp->flags & CM_SERVERFLAG_DOWN;
+
+       osi_Log4(afsd_logp, "cm_PingServer server %s (%s) was %s with caps 0x%x",
+                 osi_LogSaveString(afsd_logp, hoststr), 
+                 tsp->type == CM_SERVER_VLDB ? "vldb" : "file",
+                 wasDown ? "down" : "up",
+                 tsp->capabilities);
+
        if (wasDown)
            rx_SetConnDeadTime(connp->callp, 10);
        if (tsp->type == CM_SERVER_VLDB) {
@@ -79,13 +104,27 @@ cm_PingServer(cm_server_t *tsp)
        } else {
            tsp->capabilities = 0;
        }
-    }
-    else {
+
+       osi_Log3(afsd_logp, "cm_PingServer server %s (%s) is up with caps 0x%x",
+                 osi_LogSaveString(afsd_logp, hoststr), 
+                 tsp->type == CM_SERVER_VLDB ? "vldb" : "file",
+                 tsp->capabilities);
+    } else {
        /* mark server as down */
        tsp->flags |= CM_SERVERFLAG_DOWN;
        if (code != VRESTARTING)
            cm_ForceNewConnections(tsp);
+
+       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);
     }
+
+    if (tsp->waitCount == 0)
+       tsp->flags &= ~CM_SERVERFLAG_PINGING;
+    else 
+       osi_Wakeup((LONG_PTR)tsp);
     lock_ReleaseMutex(&tsp->mx);
 }
 
index 2d2e201..0212f0f 100644 (file)
@@ -26,6 +26,7 @@ typedef struct cm_server {
     int type;                          /* by mx */
     struct cm_conn *connsp;            /* locked by cm_connLock */
     afs_int32 flags;                   /* by mx */
+    afs_int32 waitCount;               /* by mx */
     afs_int32 capabilities;            /* by mx */
     struct cm_cell *cellp;             /* cell containing this server */
     unsigned long refCount;            /* locked by cm_serverLock */
@@ -39,7 +40,7 @@ typedef struct cm_serverRef {
     struct cm_serverRef *next;      /* locked by cm_serverLock */
     struct cm_server *server;       /* locked by cm_serverLock */
     enum repstate status;           /* locked by cm_serverLock */
-    unsigned long refCount;                   /* locked by cm_serverLock */
+    unsigned long refCount;         /* locked by cm_serverLock */
 } cm_serverRef_t;
 
 /* types */
@@ -49,6 +50,7 @@ typedef struct cm_serverRef {
 /* flags */
 #define CM_SERVERFLAG_DOWN     1       /* server is down */
 #define CM_SERVERFLAG_PREF_SET 2       /* server preference set by user */
+#define CM_SERVERFLAG_PINGING  4       /* a ping against this server in progress */
 
 /* flags for procedures */
 #define CM_FLAG_CHECKUPSERVERS         1       /* check working servers */