Esempio n. 1
0
        /// <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();
        }
Esempio n. 2
0
        /// <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();
        }
Esempio n. 3
0
        /// <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();
            }
        }