forked from Qortal/qortal
Keep track of peers which are too divergent, and return an isTooDivergent
boolean in /peers APIs.
isTooDivergent will be true or false if a definitive decision has been made, or missing from the response if not yet known. Therefore it should be safe to treat `"isTooDivergent": false` as a peer that is on the same chain.
This commit is contained in:
parent
dfe3754afc
commit
c03f271825
@ -1,6 +1,7 @@
|
|||||||
package org.qortal.api.model;
|
package org.qortal.api.model;
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import org.qortal.controller.Controller;
|
||||||
import org.qortal.data.block.BlockSummaryData;
|
import org.qortal.data.block.BlockSummaryData;
|
||||||
import org.qortal.data.network.PeerData;
|
import org.qortal.data.network.PeerData;
|
||||||
import org.qortal.network.Handshake;
|
import org.qortal.network.Handshake;
|
||||||
@ -36,6 +37,7 @@ public class ConnectedPeer {
|
|||||||
public Long lastBlockTimestamp;
|
public Long lastBlockTimestamp;
|
||||||
public UUID connectionId;
|
public UUID connectionId;
|
||||||
public String age;
|
public String age;
|
||||||
|
public Boolean isTooDivergent;
|
||||||
|
|
||||||
protected ConnectedPeer() {
|
protected ConnectedPeer() {
|
||||||
}
|
}
|
||||||
@ -69,6 +71,11 @@ public class ConnectedPeer {
|
|||||||
this.lastBlockSignature = peerChainTipData.getSignature();
|
this.lastBlockSignature = peerChainTipData.getSignature();
|
||||||
this.lastBlockTimestamp = peerChainTipData.getTimestamp();
|
this.lastBlockTimestamp = peerChainTipData.getTimestamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Only include isTooDivergent decision if we've had the opportunity to request block summaries this peer
|
||||||
|
if (peer.getLastTooDivergentTime() != null) {
|
||||||
|
this.isTooDivergent = Controller.wasRecentlyTooDivergent.test(peer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -769,6 +769,16 @@ public class Controller extends Thread {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public static final Predicate<Peer> wasRecentlyTooDivergent = peer -> {
|
||||||
|
Long now = NTP.getTime();
|
||||||
|
Long peerLastTooDivergentTime = peer.getLastTooDivergentTime();
|
||||||
|
if (now == null || peerLastTooDivergentTime == null)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Exclude any peers that were TOO_DIVERGENT in the last 5 mins
|
||||||
|
return (now - peerLastTooDivergentTime < 5 * 60 * 1000L);
|
||||||
|
};
|
||||||
|
|
||||||
private long getRandomRepositoryMaintenanceInterval() {
|
private long getRandomRepositoryMaintenanceInterval() {
|
||||||
final long minInterval = Settings.getInstance().getRepositoryMaintenanceMinInterval();
|
final long minInterval = Settings.getInstance().getRepositoryMaintenanceMinInterval();
|
||||||
final long maxInterval = Settings.getInstance().getRepositoryMaintenanceMaxInterval();
|
final long maxInterval = Settings.getInstance().getRepositoryMaintenanceMaxInterval();
|
||||||
|
@ -1121,6 +1121,7 @@ public class Synchronizer extends Thread {
|
|||||||
// If common block is too far behind us then we're on massively different forks so give up.
|
// If common block is too far behind us then we're on massively different forks so give up.
|
||||||
if (!force && testHeight < ourHeight - MAXIMUM_COMMON_DELTA) {
|
if (!force && testHeight < ourHeight - MAXIMUM_COMMON_DELTA) {
|
||||||
LOGGER.info(String.format("Blockchain too divergent with peer %s", peer));
|
LOGGER.info(String.format("Blockchain too divergent with peer %s", peer));
|
||||||
|
peer.setLastTooDivergentTime(NTP.getTime());
|
||||||
return SynchronizationResult.TOO_DIVERGENT;
|
return SynchronizationResult.TOO_DIVERGENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1130,6 +1131,9 @@ public class Synchronizer extends Thread {
|
|||||||
testHeight = Math.max(testHeight - step, 1);
|
testHeight = Math.max(testHeight - step, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Peer not considered too divergent
|
||||||
|
peer.setLastTooDivergentTime(0L);
|
||||||
|
|
||||||
// Prepend test block's summary as first block summary, as summaries returned are *after* test block
|
// Prepend test block's summary as first block summary, as summaries returned are *after* test block
|
||||||
BlockSummaryData testBlockSummary = new BlockSummaryData(testBlockData);
|
BlockSummaryData testBlockSummary = new BlockSummaryData(testBlockData);
|
||||||
blockSummariesFromCommon.add(0, testBlockSummary);
|
blockSummariesFromCommon.add(0, testBlockSummary);
|
||||||
|
@ -155,6 +155,11 @@ public class Peer {
|
|||||||
*/
|
*/
|
||||||
private CommonBlockData commonBlockData;
|
private CommonBlockData commonBlockData;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Last time we detected this peer as TOO_DIVERGENT
|
||||||
|
*/
|
||||||
|
private Long lastTooDivergentTime;
|
||||||
|
|
||||||
// Message stats
|
// Message stats
|
||||||
|
|
||||||
private static class MessageStats {
|
private static class MessageStats {
|
||||||
@ -383,6 +388,14 @@ public class Peer {
|
|||||||
this.commonBlockData = commonBlockData;
|
this.commonBlockData = commonBlockData;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Long getLastTooDivergentTime() {
|
||||||
|
return this.lastTooDivergentTime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastTooDivergentTime(Long lastTooDivergentTime) {
|
||||||
|
this.lastTooDivergentTime = lastTooDivergentTime;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isSyncInProgress() {
|
public boolean isSyncInProgress() {
|
||||||
return this.syncInProgress;
|
return this.syncInProgress;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user