예제 #1
0
        private void UpdateReputationAndMaxPeersCount()
        {
            var storedNodes = _peerStorage.GetPersistedNodes();

            foreach (var node in storedNodes)
            {
                _activePeers.TryGetValue(node.NodeId, out Peer peer);
                if (peer == null)
                {
                    _candidatePeers.TryGetValue(node.NodeId, out peer);
                }

                if (peer == null)
                {
                    continue;
                }

                long newRep = _stats.GetNewPersistedReputation(peer.Node);
                if (newRep != node.Reputation)
                {
                    node.Reputation = newRep;
                    _peerStorage.UpdateNode(node);
                }
            }

            //if we have more persisted nodes then the threshold, we run cleanup process
            if (storedNodes.Length > _networkConfig.PersistedPeerCountCleanupThreshold)
            {
                var activePeers = _activePeers.Values;
                CleanupPersistedPeers(activePeers, storedNodes);
            }
        }
예제 #2
0
        private void UpdateReputationAndMaxPeersCount()
        {
            NetworkNode[] storedNodes = _peerStorage.GetPersistedNodes();
            foreach (NetworkNode node in storedNodes)
            {
                if (node.Port < 0 || node.Port > ushort.MaxValue)
                {
                    continue;
                }

                Peer peer   = _peerPool.GetOrAdd(node, false);
                long newRep = _stats.GetNewPersistedReputation(peer.Node);
                if (newRep != node.Reputation)
                {
                    node.Reputation = newRep;
                    _peerStorage.UpdateNode(node);
                }
            }

            //if we have more persisted nodes then the threshold, we run cleanup process
            if (storedNodes.Length > _networkConfig.PersistedPeerCountCleanupThreshold)
            {
                ICollection <Peer> activePeers = _activePeers.Values;
                CleanupPersistedPeers(activePeers, storedNodes);
            }
        }
예제 #3
0
        private void UpdateReputationAndMaxPeersCount()
        {
            var storedNodes    = _peerStorage.GetPersistedNodes();
            var activePeers    = _activePeers.Values;
            var peers          = activePeers.Concat(_candidatePeers.Values).GroupBy(x => x.Node.Id).Select(x => x.First()).ToDictionary(x => x.Node.Id);
            var nodesForUpdate = new List <NetworkNode>();

            foreach (var node in storedNodes)
            {
                if (!peers.ContainsKey(node.NodeId))
                {
                    continue;
                }

                var  peer   = peers[node.NodeId];
                long newRep = _stats.GetNewPersistedReputation(peer.Node);
                if (newRep != node.Reputation)
                {
                    node.Reputation = newRep;
                    nodesForUpdate.Add(node);
                }
            }

            if (nodesForUpdate.Any())
            {
                //we need to update all stored notes to update reputation
                _peerStorage.UpdateNodes(nodesForUpdate.ToArray());
            }

            //if we have more persisted nodes then the threshold, we run cleanup process
            if (storedNodes.Length > _networkConfig.PersistedPeerCountCleanupThreshold)
            {
                CleanupPersistedPeers(activePeers, storedNodes);
            }
        }