private void ReplaceIfWorthReplacing(SyncPeerAllocation allocation, PeerInfo peerInfo) { if (!allocation.CanBeReplaced) { return; } if (peerInfo == null) { return; } if (allocation.Current == null) { allocation.ReplaceCurrent(peerInfo); return; } if (peerInfo == allocation.Current) { if (_logger.IsTrace) { _logger.Trace($"{allocation} is already syncing with best peer {peerInfo}"); } return; } var currentLatency = _stats.GetOrAdd(allocation.Current?.SyncPeer.Node)?.GetAverageLatency(NodeLatencyStatType.BlockHeaders) ?? 100000; var newLatency = _stats.GetOrAdd(peerInfo.SyncPeer.Node)?.GetAverageLatency(NodeLatencyStatType.BlockHeaders) ?? 100001; if (newLatency / (decimal)Math.Max(1L, currentLatency) < 1m - _syncConfig.MinDiffPercentageForLatencySwitch / 100m && newLatency < currentLatency - _syncConfig.MinDiffForLatencySwitch) { if (_logger.IsInfo) { _logger.Info($"Sync peer substitution{Environment.NewLine} OUT: {allocation.Current}[{currentLatency}]{Environment.NewLine} IN : {peerInfo}[{newLatency}]"); } allocation.ReplaceCurrent(peerInfo); } else { if (_logger.IsTrace) { _logger.Trace($"Staying with current peer {allocation.Current}[{currentLatency}] (ignoring {peerInfo}[{newLatency}])"); } } }
private void ReplaceIfWorthReplacing(SyncPeerAllocation allocation, PeerInfo peerInfo) { if (!allocation.CanBeReplaced) { return; } if (peerInfo == null) { return; } if (allocation.Current == null) { allocation.ReplaceCurrent(peerInfo); return; } if (peerInfo == allocation.Current) { if (_logger.IsTrace) { _logger.Trace($"{allocation} is already syncing with best peer {peerInfo}"); } return; } var currentSpeed = _stats.GetOrAdd(allocation.Current?.SyncPeer.Node)?.GetAverageTransferSpeed() ?? 0; var newSpeed = _stats.GetOrAdd(peerInfo.SyncPeer.Node)?.GetAverageTransferSpeed() ?? 0; if (newSpeed / (decimal)Math.Max(1L, currentSpeed) > 1m + _minDiffPercentageForSpeedSwitch && newSpeed > currentSpeed + _minDiffForSpeedSwitch) { if (_logger.IsInfo) { _logger.Info($"Sync peer substitution{Environment.NewLine} OUT: {allocation.Current}[{currentSpeed}]{Environment.NewLine} IN : {peerInfo}[{newSpeed}]"); } allocation.ReplaceCurrent(peerInfo); } else { if (_logger.IsTrace) { _logger.Trace($"Staying with current peer {allocation.Current}[{currentSpeed}] (ignoring {peerInfo}[{newSpeed}])"); } } }
public SyncPeerAllocation Borrow(BorrowOptions borrowOptions, string description) { SyncPeerAllocation allocation = new SyncPeerAllocation(description); if ((borrowOptions & BorrowOptions.DoNotReplace) == BorrowOptions.DoNotReplace) { allocation.CanBeReplaced = false; } PeerInfo bestPeer = SelectBestPeerForAllocation(allocation, "BORROW"); if (bestPeer != null) { allocation.ReplaceCurrent(bestPeer); } _allocations.TryAdd(allocation, null); return(allocation); }
public SyncPeerAllocation Borrow(BorrowOptions borrowOptions, string description, long?minNumber = null) { SyncPeerAllocation allocation = new SyncPeerAllocation(description); allocation.MinBlocksAhead = minNumber - _blockTree.BestSuggestedHeader?.Number; if ((borrowOptions & BorrowOptions.DoNotReplace) == BorrowOptions.DoNotReplace) { allocation.CanBeReplaced = false; } PeerInfo bestPeer = SelectBestPeerForAllocation(allocation, "BORROW", (borrowOptions & BorrowOptions.LowPriority) == BorrowOptions.LowPriority); if (bestPeer != null) { allocation.ReplaceCurrent(bestPeer); } _allocations.TryAdd(allocation, null); return(allocation); }