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) {
* 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) {
} 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);
}
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 */
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 */
/* 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 */