Пример #1
0
        protected void ResetServers(IList <Server> servers)
        {
            var rightServers = new List <Server>();

            foreach (var server in from server in servers where server != null select server)
            {
                server.Online();
                rightServers.Add(server);
                _logger.LogDebug($"LoadBalancer [{_name}]:  addServer [{server}]");
            }
            try
            {
                _allServerLock.EnterReadLock();
                var allServer = AllServer.ToList();
                _allServerLock.ExitReadLock();
                var newServers = (from server in rightServers where !allServer.Contains(server) select server).ToArray();
                _allServerLock.EnterWriteLock();
                AllServer = new ConcurrentBag <Server>(newServers.Union(allServer));
                _allServerLock.ExitWriteLock();
                if (newServers.Length != 0)
                {
                    Interlocked.Exchange(ref _pingInProgress, 0);
                    RunPing();
                    ServersChanged?.Invoke(this, newServers);
                }
            }
            finally
            {
                if (_allServerLock.IsReadLockHeld)
                {
                    _allServerLock.ExitReadLock();
                }
                if (_allServerLock.IsWriteLockHeld)
                {
                    _allServerLock.ExitWriteLock();
                }
            }
        }
Пример #2
0
 public void MarkServerDown(Server server)
 {
     if (server == null || !server.IsAlive || !server.ReadyToServe)
     {
         return;
     }
     _logger.LogDebug($"LoadBalancer [{_name}]:  markServerDown called on [{server}]");
     try
     {
         _allServerLock.EnterWriteLock();
         server.Zombify();
         server.Offline();
         _allServerLock.ExitReadLock();
         ServersChanged?.Invoke(this, new Server[] { server });
     }
     finally
     {
         if (_allServerLock.IsReadLockHeld)
         {
             _allServerLock.ExitReadLock();
         }
     }
 }
Пример #3
0
        public void RemoveServer(Server server)
        {
            if (server.ID == null)
            {
                throw new NullIdException("Server ID is null.");
            }

            removeServer.Parameters["@ID"].Value = server.ID;

            try
            {
                connection.Open();
                if (removeServer.ExecuteNonQuery() == 0)
                {
                    throw new ZeroRowsExecutedException();
                }
            }
            finally
            {
                Close();
                removeServer.Parameters["@ID"].Value = DBNull.Value;
            }
            ServersChanged?.Invoke();
        }
Пример #4
0
 private void ServerCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
 {
     ServersChanged?.Invoke(this, new EventArgs());
 }
Пример #5
0
 public static void RaiseServersChangedEvent(object sender)
 {
     ServersChanged?.Invoke(sender, null);
 }
Пример #6
0
        private void RunPing()
        {
            try
            {
                if (_ping == null)
                {
                    return;
                }
                if (_handing)
                {
                    return;
                }
                _handing = true;

                _allServerLock.EnterReadLock();
                var servers = AllServer.Where(x => x.ReadyToServe).ToArray();
                _allServerLock.ExitReadLock();

                var result = _pingStrategy.PingServers(_ping, servers);
                if (Interlocked.CompareExchange(ref _pingInProgress, 1, 0) == 1)
                {
                    return;
                }

                _logger.LogDebug("开始执行ping操作");
                var changedServers = new List <Server>();
                var upServers      = new List <Server>();
                try
                {
                    foreach (var item in result)
                    {
                        var server  = item.Server;
                        var isAlive = item.IsAlive;
                        if (server.IsAlive != isAlive)
                        {
                            changedServers.Add(item.Server);
                            _logger.LogDebug($"LoadBalancer [{_name}]:  Server [{server}] status changed to {(isAlive ? "ALIVE" : "DEAD")}");
                        }
                        if (isAlive)
                        {
                            server.Unzombify();
                            upServers.Add(server);
                        }
                    }
                    _upServerLock.EnterWriteLock();
                    UpServer = new ConcurrentBag <Server>(upServers);
                    _upServerLock.ExitWriteLock();
                    ServersChanged?.Invoke(this, changedServers.ToArray());
                }
                finally
                {
                    if (_upServerLock.IsWriteLockHeld)
                    {
                        _upServerLock.ExitWriteLock();
                    }
                    Interlocked.Exchange(ref _pingInProgress, 0);
                }
            }
            finally
            {
                if (_allServerLock.IsReadLockHeld)
                {
                    _allServerLock.ExitReadLock();
                }
                _handing = false;
            }
        }