lock_ObtainMutex(&tsp->mx);
tsp->ipRank = (USHORT)dwRank;
tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ tsp->adminRank = tsp->ipRank;
lock_ReleaseMutex(&tsp->mx);
/* set preferences for an existing vlserver */
lock_ObtainMutex(&tsp->mx);
tsp->ipRank = (USHORT)dwRank;
tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ tsp->adminRank = tsp->ipRank;
lock_ReleaseMutex(&tsp->mx);
}
}
{
lock_ObtainMutex(&tsp->mx);
tsp->ipRank = (USHORT)dwRank;
- tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ tsp->adminRank = tsp->ipRank;
lock_ReleaseMutex(&tsp->mx);
/* find volumes which might have RO copy
lock_ObtainMutex(&tsp->mx);
tsp->ipRank = (USHORT)dwRank;
tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ tsp->adminRank = tsp->ipRank;
lock_ReleaseMutex(&tsp->mx);
}
}
long cm_daemonTokenCheckInterval = 180;
long cm_daemonCheckOfflineVolInterval = 600;
long cm_daemonPerformanceTuningInterval = 0;
+long cm_daemonRankServerInterval = 600;
osi_rwlock_t cm_daemonLock;
dummyLen = sizeof(DWORD);
code = RegQueryValueEx(parmKey, "daemonPerformanceTuningInterval", NULL, NULL,
(BYTE *) &dummy, &dummyLen);
+ dummyLen = sizeof(DWORD);
+ code = RegQueryValueEx(parmKey, "daemonRankServerInterval", NULL, NULL,
+ (BYTE *) &dummy, &dummyLen);
+ if (code == ERROR_SUCCESS && dummy)
+ cm_daemonRankServerInterval = dummy;
+ afsi_log("daemonRankServerInterval is %d", cm_daemonRankServerInterval);
+
if (code == ERROR_SUCCESS)
cm_daemonPerformanceTuningInterval = dummy;
afsi_log("daemonPerformanceTuningInterval is %d", cm_daemonPerformanceTuningInterval);
time_t lastTokenCacheCheck;
time_t lastBusyVolCheck;
time_t lastPerformanceCheck;
+ time_t lastServerRankCheck;
char thostName[200];
unsigned long code;
struct hostent *thp;
lastBusyVolCheck = now - cm_daemonCheckOfflineVolInterval/2 * (rand() % cm_daemonCheckOfflineVolInterval);
if (cm_daemonPerformanceTuningInterval)
lastPerformanceCheck = now - cm_daemonPerformanceTuningInterval/2 * (rand() % cm_daemonPerformanceTuningInterval);
+ lastServerRankCheck = now - cm_daemonRankServerInterval/2 * (rand() % cm_daemonRankServerInterval);
while (daemon_ShutdownFlag == 0) {
if (powerStateSuspended) {
default:
afsi_log("Unknown Windows Firewall Configuration error");
}
- }
+ }
/* find out what time it is */
now = osi_Time();
-
+
/* Determine whether an address change took place that we need to respond to */
if (bAddrChangeCheck)
bAddrChangeCheck = 0;
now = osi_Time();
}
+ /* Rank all up servers */
+ if ((now > lastServerRankCheck + cm_daemonRankServerInterval) &&
+ daemon_ShutdownFlag == 0 &&
+ powerStateSuspended == 0) {
+ lastServerRankCheck = now;
+ osi_Log0(afsd_logp, "cm_Daemon RankServer");
+ cm_RankUpServers();
+ if(daemon_ShutdownFlag == 1 || powerStateSuspended)
+ break;
+ now = osi_Time();
+ }
+
if (cm_daemonCheckVolCBInterval &&
now > lastVolCBRenewalCheck + cm_daemonCheckVolCBInterval &&
daemon_ShutdownFlag == 0 &&
lock_ObtainMutex(&tsp->mx);
tsp->ipRank = rank;
tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ tsp->adminRank = tsp->ipRank;
lock_ReleaseMutex(&tsp->mx);
switch (type) {
lock_ObtainMutex(&tsp->mx);
tsp->ipRank = rank;
tsp->flags |= CM_SERVERFLAG_PREF_SET;
+ tsp->adminRank = tsp->ipRank;
lock_ReleaseMutex(&tsp->mx);
tsp->ipRank = rank;
}
#include <WINNT/afsreg.h>
#include <osi.h>
#include <rx/rx.h>
+#include <math.h>
osi_rwlock_t cm_serverLock;
osi_rwlock_t cm_syscfgLock;
lock_ReleaseRead(&cm_serverLock);
}
+/*
+ * lock_ObtainMutex must be held prior to calling
+ * this function.
+ */
+afs_int32
+cm_RankServer(cm_server_t * tsp)
+{
+ afs_int32 code = 0; /* start with "success" */
+ struct rx_debugPeer tpeer;
+ afs_uint16 port;
+
+ switch(tsp->type) {
+ case CM_SERVER_VLDB:
+ port = htons(7003);
+ break;
+ case CM_SERVER_FILE:
+ port = htons(7000);
+ break;
+ default:
+ return -1;
+ }
+
+ code = rx_GetLocalPeers(tsp->addr.sin_addr.s_addr, port, &tpeer);
+
+ /*check if rx_GetLocalPeers succeeded and if there is data for tsp */
+ if(code == 0 && (tpeer.rtt == 0 && tpeer.rtt_dev == 0))
+ code = -1;
+
+ if(code == 0) {
+ if((tsp->flags & CM_SERVERFLAG_PREF_SET))
+ tsp->ipRank = tsp->adminRank + ((int)(623 * log(tpeer.rtt) / 10) *
+ 10 + 5);
+ else /* rank has not been set by admin, derive rank from rtt */
+ tsp->ipRank = (int)(7200 * log(tpeer.rtt) / 5000) * 5000 + 5000;
+
+ tsp->ipRank += (rand() & 0x000f); /* randomize */
+ }
+
+ return code;
+}
+
void
cm_PingServer(cm_server_t *tsp)
{
lock_ReleaseMutex(&tsp->mx);
}
+void
+cm_RankUpServers()
+{
+ cm_server_t * tsp;
+
+ lock_ObtainRead(&cm_serverLock);
+ for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
+ cm_GetServerNoLock(tsp);
+ lock_ReleaseRead(&cm_serverLock);
+
+ lock_ObtainMutex(&tsp->mx);
+
+ /* if the server is not down, rank the server */
+ if(!(tsp->flags & CM_SERVERFLAG_DOWN))
+ cm_RankServer(tsp);
+
+ lock_ReleaseMutex(&tsp->mx);
+
+ lock_ObtainRead(&cm_serverLock);
+ cm_PutServerNoLock(tsp);
+ }
+ lock_ReleaseRead(&cm_serverLock);
+}
+
static void cm_CheckServersSingular(afs_uint32 flags, cm_cell_t *cellp)
{
/* ping all file servers, up or down, with unauthenticated connection,
cm_server_vols_t * vols; /* by mx */
time_t downTime; /* by mx */
afsUUID uuid; /* by mx */
+ unsigned short adminRank; /* only set if admin sets a rank */
} cm_server_t;
enum repstate {srv_not_busy, srv_busy, srv_offline, srv_deleted};
extern cm_server_t *cm_allServersp;
+extern afs_int32 cm_RankServer(cm_server_t * server);
+
+extern void cm_RankUpServers();
+
extern void cm_SetServerPrefs(cm_server_t * serverp);
extern void cm_InsertServerList(cm_serverRef_t** list,cm_serverRef_t* element);