private async Task RemovePeerAsync(BoundPeer peer) { _logger.Debug($"Removing peer [{peer.Address.ToHex()}] from table."); await _routing.RemovePeerAsync(peer); foreach (KBucket bucket in _routing.NonFullBuckets) { foreach (BoundPeer replacement in bucket.ReplacementCache) { // FIXME: appropriate cancellation token required. await PingAsync(replacement, RequestTimeout, CancellationToken.None); } } }
// FIXME: If this method is called almost same time, problem occurs. private async Task RemovePeerAsync(BoundPeer peer, CancellationToken cancellationToken) { _logger.Debug($"Removing peer [{peer.Address.ToHex()}] from table."); await _routing.RemovePeerAsync(peer); var bucket = _routing.BucketOf(peer); var cachePeers = new BoundPeer[bucket.ReplacementCache.Count]; bucket.ReplacementCache.CopyTo(cachePeers); foreach (BoundPeer replacement in cachePeers) { try { await PingAsync(replacement, _requestTimeout, cancellationToken); break; } catch (TimeoutException) { bucket.ReplacementCache.Remove(replacement); } } }
private async Task RemovePeerAsync(BoundPeer peer, CancellationToken cancellationToken) { _logger.Debug("Removing peer [{peer}] from table.", peer); await _routing.RemovePeerAsync(peer); }