/// <summary> /// This method disables future heartbeats and flushes any servers that /// may be in the heartbeat path out of that code path before further /// forward progress is allowed. /// </summary> public void DrainHeartbeats() { // // Prevent new requestors from spinning up new heartbeat requests. // HeartbeatsEnabled = false; // // Flush any in-flight requestors out of the heartbeat path by // ensuring that they have released synchronization. // Monitor.Enter(HeartbeatLock); Monitor.Exit(HeartbeatLock); // // Stop all of the active timers. New timers that have elapsed // will have already completed starting the timer again or will now // observe that future timer restarts are already forbidden. // PendingGameServersSweepTimer.Stop(); ScavengerSweepTimer.Stop(); BlacklistSweepTimer.Stop(); }
/// <summary> /// Queue initial heartbeats to active servers /// </summary> public void QueueInitialHeartbeats() { DateTime Now = DateTime.UtcNow; uint HeartbeatsStarted = 0; lock (ActiveServerTable) { foreach (var Pair in ActiveServerTable) { NWGameServer Server = Pair.Value; lock (Server) { if (!Server.Online) { continue; } Server.InitialHeartbeat = true; Server.StartHeartbeat(); HeartbeatsStarted += 1; } } } Logger.Log(LogLevel.Normal, "NWServerTracker.QueueInitialHeartbeats(): Queued {0} initial server heartbeat requests.", HeartbeatsStarted); PendingGameServersSweepTimer.Start(); ScavengerSweepTimer.Start(); BlacklistSweepTimer.Start(); }
/// <summary> /// This timer callback runs when the blacklist sweep timer elapses. /// Its purpose is to trigger a periodic refresh of the blacklist from /// the database. /// </summary> /// <param name="sender">Unused.</param> /// <param name="e">Unused.</param> private void BlacklistSweepTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { try { RefreshBlacklist(); } catch (Exception ex) { Logger.Log(LogLevel.Error, "NWServerTracker.BlacklistSweepTimer_Elapsed(): Exception refreshing blacklist: {0}", ex); } lock (HeartbeatLock) { if (!HeartbeatsEnabled) { return; } BlacklistSweepTimer.Start(); } }