diff --git a/src/java/nxt/BlockchainProcessorImpl.java b/src/java/nxt/BlockchainProcessorImpl.java index 218ab005f..e7f9b28f3 100755 --- a/src/java/nxt/BlockchainProcessorImpl.java +++ b/src/java/nxt/BlockchainProcessorImpl.java @@ -270,7 +270,8 @@ public void run() { return; peerHasMore = true; - Peer peer = Peers.getAnyPeer(Peer.State.CONNECTED, true); + //Peer peer = Peers.getAnyPeer(Peer.State.CONNECTED, true); + Peer peer = Peers.getBlockFeederPeer(); if (peer == null) { return; } diff --git a/src/java/nxt/peer/Peers.java b/src/java/nxt/peer/Peers.java index 8ca08f0be..b7961de60 100644 --- a/src/java/nxt/peer/Peers.java +++ b/src/java/nxt/peer/Peers.java @@ -62,6 +62,8 @@ public static enum Event { private static boolean connectWellKnownFinished; static final Set rebroadcastPeers; + private static final Map priorityBlockFeeders = new ConcurrentHashMap<>(); + private static final int priorityFeederInterval = Nxt.getIntProperty("burst.priorityFeederInterval") != 0 ? Nxt.getIntProperty("burst.priorityFeederInterval") : 300; static final int connectTimeout; static final int readTimeout; @@ -162,6 +164,11 @@ public static enum Event { rebroadcastPeers = Collections.unmodifiableSet(new HashSet<>(Nxt.getStringListProperty("burst.rebroadcastPeers"))); + List priorityFeederAddresses = Nxt.getStringListProperty("burst.priorityBlockFeeders"); + for(String address : priorityFeederAddresses) { + priorityBlockFeeders.put(address, 0); + } + List wellKnownPeersList = Constants.isTestnet ? Nxt.getStringListProperty("nxt.testnetPeers") : Nxt.getStringListProperty("nxt.wellKnownPeers"); for(String rePeer : rebroadcastPeers) { @@ -169,6 +176,12 @@ public static enum Event { wellKnownPeersList.add(rePeer); } } + for(String pPeer : priorityFeederAddresses) { + if(!wellKnownPeersList.contains(pPeer)) { + wellKnownPeersList.add(pPeer); + } + } + if (wellKnownPeersList.isEmpty() || Constants.isOffline) { wellKnownPeers = Collections.emptySet(); } else { @@ -758,6 +771,21 @@ public JSONObject call() { sendToSomePeers(request); // send to some normal peers too } + public static Peer getBlockFeederPeer() { + Peer peer = null; + int curTime = Nxt.getEpochTime(); + + Set> entries = priorityBlockFeeders.entrySet(); + for(Map.Entry e : entries) { + if(curTime - e.getValue() > priorityFeederInterval) { + e.setValue(curTime); + peer = addPeer(e.getKey()); + break; + } + } + + return peer != null ? peer : getAnyPeer(Peer.State.CONNECTED, true); + } public static Peer getAnyPeer(Peer.State state, boolean applyPullThreshold) {