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(); } } }
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(); } } }
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(); }
private void ServerCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) { ServersChanged?.Invoke(this, new EventArgs()); }
public static void RaiseServersChangedEvent(object sender) { ServersChanged?.Invoke(sender, null); }
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; } }