public async Task CheckPeersHealthAsync() { foreach (var peer in _peerPool.GetPeers(true)) { Logger.LogDebug($"Health checking: {peer}"); if (peer.IsInvalid) { _peerPool.RemovePeer(peer.Info.Pubkey); await peer.DisconnectAsync(false); Logger.LogInformation($"Remove invalid peer: {peer}"); continue; } try { await peer.CheckHealthAsync(); } catch (NetworkException ex) { if (ex.ExceptionType == NetworkExceptionType.Unrecoverable || ex.ExceptionType == NetworkExceptionType.PeerUnstable) { Logger.LogInformation(ex, $"Removing unhealthy peer {peer}."); await _networkServer.TrySchedulePeerReconnectionAsync(peer); } } } }
public async Task DisconnectAsync(IPeer peer, bool sendDisconnect = false) { // clean the pool if (_peerPool.RemovePeer(peer.Info.Pubkey) == null) { Logger.LogWarning($"{peer} was not found in pool."); } // cancel any pending reconnection _reconnectionService.CancelReconnection(peer.RemoteEndpoint.ToString()); // dispose the peer await peer.DisconnectAsync(sendDisconnect); Logger.LogInformation($"Removed peer {peer}"); }
public async Task DisconnectAsync(IPeer peer, bool sendDisconnect = false) { if (peer == null) { throw new ArgumentNullException(nameof(peer)); } // clean the pool if (_peerPool.RemovePeer(peer.Info.Pubkey) == null) { Logger.LogWarning($"{peer} was not found in pool."); } // clean the peer await peer.DisconnectAsync(sendDisconnect); Logger.LogDebug($"Removed peer {peer}"); }
public async Task RemovePeerByPublicKey_ShouldNotBeFindable() { var peer = CreatePeer(); _peerPool.TryAddPeer(peer); _peerPool.RemovePeer(peer.Info.Pubkey); _peerPool.PeerCount.ShouldBe(0); _peerPool.FindPeerByEndpoint(peer.RemoteEndpoint).ShouldBeNull(); _peerPool.FindPeerByPublicKey(peer.Info.Pubkey).ShouldBeNull(); }