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}");
        }
Beispiel #3
0
        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}");
        }
Beispiel #4
0
        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();
        }