mirror of
https://github.com/Qortal/qortal.git
synced 2025-05-13 13:17:51 +00:00
peer mgmt fixes, remove lib/io
This commit is contained in:
parent
a75c0fc6d6
commit
a7e905f739
@ -1,24 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<metadata modelVersion="1.1.0">
|
||||
<groupId>io.reticulum</groupId>
|
||||
<artifactId>reticulum-network-stack</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<versioning>
|
||||
<snapshot>
|
||||
<localCopy>true</localCopy>
|
||||
</snapshot>
|
||||
<lastUpdated>20250418180444</lastUpdated>
|
||||
<snapshotVersions>
|
||||
<snapshotVersion>
|
||||
<extension>jar</extension>
|
||||
<value>1.0-SNAPSHOT</value>
|
||||
<updated>20250418180444</updated>
|
||||
</snapshotVersion>
|
||||
<snapshotVersion>
|
||||
<extension>pom</extension>
|
||||
<value>1.0-SNAPSHOT</value>
|
||||
<updated>20241218212752</updated>
|
||||
</snapshotVersion>
|
||||
</snapshotVersions>
|
||||
</versioning>
|
||||
</metadata>
|
Binary file not shown.
@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>io.reticulum</groupId>
|
||||
<artifactId>reticulum-network-stack</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<description>POM was created from install:install-file</description>
|
||||
</project>
|
@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<metadata>
|
||||
<groupId>io.reticulum</groupId>
|
||||
<artifactId>reticulum-network-stack</artifactId>
|
||||
<versioning>
|
||||
<versions>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</versions>
|
||||
<lastUpdated>20250418180444</lastUpdated>
|
||||
</versioning>
|
||||
</metadata>
|
7
pom.xml
7
pom.xml
@ -52,6 +52,7 @@
|
||||
<maven-surefire-plugin.version>3.5.2</maven-surefire-plugin.version>
|
||||
<protobuf.version>3.25.3</protobuf.version>
|
||||
<replacer.version>1.5.3</replacer.version>
|
||||
<reticulum.version>c0eeadf</reticulum.version>
|
||||
<simplemagic.version>1.17</simplemagic.version>
|
||||
<swagger-api.version>2.0.10</swagger-api.version>
|
||||
<swagger-ui.version>5.18.2</swagger-ui.version>
|
||||
@ -512,6 +513,12 @@
|
||||
<artifactId>altcoinj</artifactId>
|
||||
<version>${altcoinj.version}</version>
|
||||
</dependency>
|
||||
<!-- Build Reticulum from Source -->
|
||||
<dependency>
|
||||
<groupId>com.github.sergst83</groupId>
|
||||
<artifactId>reticulum-network-stack</artifactId>
|
||||
<version>${reticulum.version}</version>
|
||||
</dependency>
|
||||
<!-- Utilities -->
|
||||
<dependency>
|
||||
<groupId>com.googlecode.json-simple</groupId>
|
||||
|
@ -543,8 +543,8 @@ public class Controller extends Thread {
|
||||
LOGGER.info("Starting synchronizer");
|
||||
Synchronizer.getInstance().start();
|
||||
|
||||
//LOGGER.info("Starting synchronizer over Reticulum");
|
||||
//RNSSynchronizer.getInstance().start();
|
||||
LOGGER.info("Starting synchronizer over Reticulum");
|
||||
RNSSynchronizer.getInstance().start();
|
||||
|
||||
LOGGER.info("Starting block minter");
|
||||
blockMinter = new BlockMinter();
|
||||
@ -743,6 +743,73 @@ public class Controller extends Thread {
|
||||
}
|
||||
}
|
||||
}, 3*60*1000, 3*60*1000);
|
||||
//Timer syncFromGenesisRNS = new Timer();
|
||||
//syncFromGenesisRNS.schedule(new TimerTask() {
|
||||
// @Override
|
||||
// public void run() {
|
||||
// LOGGER.debug("Start sync from genesis check (RNS).");
|
||||
// boolean canBootstrap = Settings.getInstance().getBootstrap();
|
||||
// boolean needsArchiveRebuildRNS = false;
|
||||
// int checkHeightRNS = 0;
|
||||
//
|
||||
// try (final Repository repository = RepositoryManager.getRepository()){
|
||||
// needsArchiveRebuildRNS = (repository.getBlockArchiveRepository().fromHeight(2) == null);
|
||||
// checkHeightRNS = repository.getBlockRepository().getBlockchainHeight();
|
||||
// } catch (DataException e) {
|
||||
// throw new RuntimeException(e);
|
||||
// }
|
||||
//
|
||||
// if (canBootstrap || !needsArchiveRebuildRNS || checkHeightRNS > 3) {
|
||||
// LOGGER.debug("Bootstrapping is enabled or we have more than 2 blocks, cancel sync from genesis check.");
|
||||
// syncFromGenesisRNS.cancel();
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// if (needsArchiveRebuildRNS && !canBootstrap) {
|
||||
// LOGGER.info("Start syncing from genesis (RNS)!");
|
||||
// List<RNSPeer> seeds = new ArrayList<>(RNSNetwork.getInstance().getImmutableActiveLinkedPeers());
|
||||
//
|
||||
// // Check if have a qualified peer to sync
|
||||
// if (seeds.isEmpty()) {
|
||||
// LOGGER.info("No connected RNSPeer(s), will try again later.");
|
||||
// return;
|
||||
// }
|
||||
//
|
||||
// int index = new SecureRandom().nextInt(seeds.size());
|
||||
// RNSPeer syncPeer = seeds.get(index);
|
||||
// var syncPeerLinkAsString = syncPeer.getPeerLink().toString();
|
||||
// //String syncNode = String.valueOf(seeds.get(index));
|
||||
// //PeerAddress peerAddress = PeerAddress.fromString(syncNode);
|
||||
// //InetSocketAddress resolvedAddress = null;
|
||||
// //
|
||||
// //try {
|
||||
// // resolvedAddress = peerAddress.toSocketAddress();
|
||||
// //} catch (UnknownHostException e) {
|
||||
// // throw new RuntimeException(e);
|
||||
// //}
|
||||
// //
|
||||
// //InetSocketAddress finalResolvedAddress = resolvedAddress;
|
||||
// //Peer targetPeer = seeds.stream().filter(peer -> peer.getResolvedAddress().equals(finalResolvedAddress)).findFirst().orElse(null);
|
||||
// //RNSPeer targetPeerRNS = seeds.stream().findFirst().orElse(null);
|
||||
// RNSPeer targetPeerRNS = seeds.stream().filter(peer -> peer.getPeerLink().toString().equals(syncPeerLinkAsString)).findFirst().orElse(null);
|
||||
// RNSSynchronizer.SynchronizationResult syncResultRNS;
|
||||
//
|
||||
// try {
|
||||
// do {
|
||||
// try {
|
||||
// syncResultRNS = RNSSynchronizer.getInstance().actuallySynchronize(targetPeerRNS, true);
|
||||
// } catch (InterruptedException e) {
|
||||
// throw new RuntimeException(e);
|
||||
// }
|
||||
// }
|
||||
// while (syncResultRNS == RNSSynchronizer.SynchronizationResult.OK);
|
||||
// } finally {
|
||||
// // We are syncing now, so can cancel the check
|
||||
// syncFromGenesisRNS.cancel();
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//}, 3*60*1000, 3*60*1000);
|
||||
}
|
||||
|
||||
/** Called by AdvancedInstaller's launch EXE in single-instance mode, when an instance is already running. */
|
||||
@ -858,29 +925,29 @@ public class Controller extends Thread {
|
||||
repositoryMaintenanceInterval = getRandomRepositoryMaintenanceInterval();
|
||||
}
|
||||
|
||||
//// Prune stuck/slow/old peers
|
||||
//if (now >= prunePeersTimestamp + prunePeersInterval) {
|
||||
// prunePeersTimestamp = now + prunePeersInterval;
|
||||
//
|
||||
// try {
|
||||
// LOGGER.debug("Pruning peers...");
|
||||
// Network.getInstance().prunePeers();
|
||||
// } catch (DataException e) {
|
||||
// LOGGER.warn(String.format("Repository issue when trying to prune peers: %s", e.getMessage()));
|
||||
// }
|
||||
//}
|
||||
// Prune stuck/slow/old peers
|
||||
if (now >= prunePeersTimestamp + prunePeersInterval) {
|
||||
prunePeersTimestamp = now + prunePeersInterval;
|
||||
|
||||
//// Q: Do we need global pruning?
|
||||
//if (now >= pruneRNSPeersTimestamp + pruneRNSPeersInterval) {
|
||||
// pruneRNSPeersTimestamp = now + pruneRNSPeersInterval;
|
||||
//
|
||||
// try {
|
||||
// LOGGER.debug("Pruning Reticulum peers...");
|
||||
// RNSNetwork.getInstance().prunePeers();
|
||||
// } catch (DataException e) {
|
||||
// LOGGER.warn(String.format("Repository issue when trying to prune Reticulum peers: %s", e.getMessage()));
|
||||
// }
|
||||
//}
|
||||
try {
|
||||
LOGGER.debug("Pruning peers...");
|
||||
Network.getInstance().prunePeers();
|
||||
} catch (DataException e) {
|
||||
LOGGER.warn(String.format("Repository issue when trying to prune peers: %s", e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
// Q: Do we need global pruning?
|
||||
if (now >= pruneRNSPeersTimestamp + pruneRNSPeersInterval) {
|
||||
pruneRNSPeersTimestamp = now + pruneRNSPeersInterval;
|
||||
|
||||
try {
|
||||
LOGGER.debug("Pruning Reticulum peers...");
|
||||
RNSNetwork.getInstance().prunePeers();
|
||||
} catch (DataException e) {
|
||||
LOGGER.warn(String.format("Repository issue when trying to prune Reticulum peers: %s", e.getMessage()));
|
||||
}
|
||||
}
|
||||
|
||||
// Delete expired transactions
|
||||
if (now >= deleteExpiredTimestamp) {
|
||||
|
@ -24,7 +24,7 @@ import static io.reticulum.link.TeardownSession.TIMEOUT;
|
||||
import static io.reticulum.link.LinkStatus.ACTIVE;
|
||||
import static io.reticulum.link.LinkStatus.STALE;
|
||||
import static io.reticulum.link.LinkStatus.CLOSED;
|
||||
//import static io.reticulum.link.LinkStatus.PENDING;
|
||||
import static io.reticulum.link.LinkStatus.PENDING;
|
||||
import static io.reticulum.link.LinkStatus.HANDSHAKE;
|
||||
//import static io.reticulum.packet.PacketContextType.LINKCLOSE;
|
||||
//import static io.reticulum.identity.IdentityKnownDestination.recall;
|
||||
@ -372,7 +372,7 @@ public class RNSNetwork {
|
||||
newPeer.setMessageMagic(getMessageMagic());
|
||||
// make sure the peer has a channel and buffer
|
||||
newPeer.getOrInitPeerBuffer();
|
||||
incomingPeers.add(newPeer);
|
||||
addIncomingPeer(newPeer);
|
||||
log.info("***> Client connected, link: {}", link);
|
||||
}
|
||||
|
||||
@ -409,7 +409,7 @@ public class RNSNetwork {
|
||||
|
||||
// add to peer list if we can use more peers
|
||||
//synchronized (this) {
|
||||
var lps = RNSNetwork.getInstance().getLinkedPeers();
|
||||
var lps = RNSNetwork.getInstance().getImmutableLinkedPeers();
|
||||
for (RNSPeer p: lps) {
|
||||
var pl = p.getPeerLink();
|
||||
if ((nonNull(pl) && (pl.getStatus() == ACTIVE))) {
|
||||
@ -488,11 +488,11 @@ public class RNSNetwork {
|
||||
|
||||
final Long now = NTP.getTime();
|
||||
|
||||
// Prune stuck/slow/old peers (moved from Controller)
|
||||
task = maybeProduceRNSPrunePeersTask(now);
|
||||
if (task != null) {
|
||||
return task;
|
||||
}
|
||||
//// Prune stuck/slow/old peers (moved from Controller)
|
||||
//task = maybeProduceRNSPrunePeersTask(now);
|
||||
//if (task != null) {
|
||||
// return task;
|
||||
//}
|
||||
|
||||
// ping task (Link+Channel+Buffer)
|
||||
task = maybeProducePeerPingTask(now);
|
||||
@ -505,11 +505,11 @@ public class RNSNetwork {
|
||||
return task;
|
||||
}
|
||||
|
||||
// Prune stuck/slow/old peers (moved from Controller)
|
||||
task = maybeProduceRNSPrunePeersTask(now);
|
||||
if (task != null) {
|
||||
return task;
|
||||
}
|
||||
//// Prune stuck/slow/old peers (moved from Controller)
|
||||
//task = maybeProduceRNSPrunePeersTask(now);
|
||||
//if (task != null) {
|
||||
// return task;
|
||||
//}
|
||||
|
||||
return null;
|
||||
}
|
||||
@ -609,9 +609,9 @@ public class RNSNetwork {
|
||||
}
|
||||
|
||||
public void removeLinkedPeer(RNSPeer peer) {
|
||||
if (nonNull(peer.getPeerBuffer())) {
|
||||
peer.getPeerBuffer().close();
|
||||
}
|
||||
//if (nonNull(peer.getPeerBuffer())) {
|
||||
// peer.getPeerBuffer().close();
|
||||
//}
|
||||
if (nonNull(peer.getPeerLink())) {
|
||||
peer.getPeerLink().teardown();
|
||||
}
|
||||
@ -649,23 +649,6 @@ public class RNSNetwork {
|
||||
|
||||
// TODO, methods for: getAvailablePeer
|
||||
|
||||
// maintenance
|
||||
//public void removePeer(RNSPeer peer) {
|
||||
// synchronized(this) {
|
||||
// List<RNSPeer> peerList = this.linkedPeers;
|
||||
// log.info("removing peer {} on peer shutdown", peer);
|
||||
// peerList.remove(peer);
|
||||
// }
|
||||
//}
|
||||
|
||||
//public void pingPeer(RNSPeer peer) {
|
||||
// if (nonNull(peer)) {
|
||||
// peer.pingRemote();
|
||||
// } else {
|
||||
// log.error("peer argument is null");
|
||||
// }
|
||||
//}
|
||||
|
||||
private Boolean isUnreachable(RNSPeer peer) {
|
||||
var result = peer.getDeleteMe();
|
||||
var now = Instant.now();
|
||||
@ -713,22 +696,30 @@ public class RNSNetwork {
|
||||
//@Synchronized
|
||||
public void prunePeers() throws DataException {
|
||||
// run periodically (by the Controller)
|
||||
var peerList = getLinkedPeers();
|
||||
var incomingPeerList = getIncomingPeers();
|
||||
log.info("number of links (linkedPeers / incomingPeers) before prunig: {}, {}", peerList.size(),
|
||||
incomingPeerList.size());
|
||||
var peerList = getImmutableLinkedPeers();
|
||||
var incomingPeerList = getImmutableIncomingPeers();
|
||||
//log.info("number of links (linkedPeers / incomingPeers) before prunig: {}, {}", peerList.size(),
|
||||
// incomingPeerList.size());
|
||||
log.info("number of links (linkedPeers (active) / incomingPeers before prunig: {} ({}), {}",
|
||||
getImmutableLinkedPeers().size(), getImmutableActiveLinkedPeers().size(),
|
||||
getImmutableIncomingPeers().size());
|
||||
// prune initiator peers
|
||||
List<RNSPeer> lps = getLinkedPeers();
|
||||
List<RNSPeer> lps = getImmutableLinkedPeers();
|
||||
for (RNSPeer p : lps) {
|
||||
var pLink = p.getPeerLink();
|
||||
if (nonNull(pLink)) {
|
||||
log.info("peer link: {}, status: {}", pLink, pLink.getStatus());
|
||||
if (pLink.getStatus() == ACTIVE) {
|
||||
p.pingRemote();
|
||||
if (pLink.getStatus() == PENDING) {
|
||||
pLink.teardown();
|
||||
}
|
||||
if (p.getPeerTimedOut()) {
|
||||
pLink.teardown();
|
||||
}
|
||||
log.info("peer link: {}, status: {}", pLink, pLink.getStatus());
|
||||
if (pLink.getStatus() == ACTIVE) {
|
||||
p.pingRemote();
|
||||
} else {
|
||||
removeLinkedPeer(p);
|
||||
}
|
||||
}
|
||||
}
|
||||
//Link pLink;
|
||||
@ -773,15 +764,17 @@ public class RNSNetwork {
|
||||
List<RNSPeer> inaps = incomingNonActivePeers();
|
||||
//log.info("number of inactive incoming peers: {}", inaps.size());
|
||||
for (RNSPeer p: inaps) {
|
||||
incomingPeerList.remove(incomingPeerList.indexOf(p));
|
||||
//incomingPeerList.remove(incomingPeerList.indexOf(p));
|
||||
removeIncomingPeer(p);
|
||||
}
|
||||
log.info("number of links (linkedPeers / incomingPeers) after prunig: {}, {}", peerList.size(),
|
||||
incomingPeerList.size());
|
||||
log.info("number of links (linkedPeers (active) / incomingPeers after prunig: {} ({}), {}",
|
||||
getImmutableLinkedPeers().size(), getImmutableActiveLinkedPeers().size(),
|
||||
getImmutableIncomingPeers().size());
|
||||
maybeAnnounce(getBaseDestination());
|
||||
}
|
||||
|
||||
public void maybeAnnounce(Destination d) {
|
||||
if (getLinkedPeers().size() < MIN_DESIRED_PEERS) {
|
||||
if (getImmutableActiveLinkedPeers().size() < MIN_DESIRED_PEERS) {
|
||||
d.announce();
|
||||
}
|
||||
}
|
||||
|
@ -108,8 +108,8 @@ public class RNSPeer {
|
||||
|
||||
// for qortal networking
|
||||
private static final int RESPONSE_TIMEOUT = 3000; // [ms]
|
||||
private static final int PING_INTERVAL = 34_000; // [ms]
|
||||
private static final long LINK_PING_INTERVAL = 34 * 1000L; // ms
|
||||
private static final int PING_INTERVAL = 55_000; // [ms]
|
||||
private static final long LINK_PING_INTERVAL = 55 * 1000L; // ms
|
||||
private byte[] messageMagic; // set in message creating classes
|
||||
private Long lastPing = null; // last (packet) ping roundtrip time [ms]
|
||||
private Long lastPingSent = null; // time last (packet) ping was sent, or null if not started.
|
||||
@ -370,7 +370,7 @@ public class RNSPeer {
|
||||
break;
|
||||
|
||||
case PONG:
|
||||
//log.info("PONG received");
|
||||
log.trace("PONG received");
|
||||
break;
|
||||
|
||||
// Do we need this ? (no need to relay peer list...)
|
||||
@ -378,30 +378,30 @@ public class RNSPeer {
|
||||
// onPeersV2Message(peer, message);
|
||||
// break;
|
||||
|
||||
case BLOCK_SUMMARIES:
|
||||
// from Synchronizer
|
||||
addToQueue(message);
|
||||
break;
|
||||
|
||||
case BLOCK_SUMMARIES_V2:
|
||||
// from Synchronizer
|
||||
addToQueue(message);
|
||||
break;
|
||||
|
||||
case SIGNATURES:
|
||||
// from Synchronizer
|
||||
addToQueue(message);
|
||||
break;
|
||||
|
||||
case BLOCK:
|
||||
// from Synchronizer
|
||||
addToQueue(message);
|
||||
break;
|
||||
|
||||
case BLOCK_V2:
|
||||
// from Synchronizer
|
||||
addToQueue(message);
|
||||
break;
|
||||
//case BLOCK_SUMMARIES:
|
||||
// // from Synchronizer
|
||||
// addToQueue(message);
|
||||
// break;
|
||||
//
|
||||
//case BLOCK_SUMMARIES_V2:
|
||||
// // from Synchronizer
|
||||
// addToQueue(message);
|
||||
// break;
|
||||
//
|
||||
//case SIGNATURES:
|
||||
// // from Synchronizer
|
||||
// addToQueue(message);
|
||||
// break;
|
||||
//
|
||||
//case BLOCK:
|
||||
// // from Synchronizer
|
||||
// addToQueue(message);
|
||||
// break;
|
||||
//
|
||||
//case BLOCK_V2:
|
||||
// // from Synchronizer
|
||||
// addToQueue(message);
|
||||
// break;
|
||||
|
||||
default:
|
||||
log.info("default - type {} message received ({} bytes)", message.getType(), data.length);
|
||||
@ -419,7 +419,7 @@ public class RNSPeer {
|
||||
}
|
||||
|
||||
/**
|
||||
* we need to queue all incomming messages that follow request/response
|
||||
* we need to queue all incoming messages that follow request/response
|
||||
* with explicit handling of the response message.
|
||||
*/
|
||||
public void addToQueue(Message message) {
|
||||
@ -499,10 +499,12 @@ public class RNSPeer {
|
||||
|
||||
public void packetTimedOut(PacketReceipt receipt) {
|
||||
log.info("packet timed out, receipt status: {}", receipt.getStatus());
|
||||
if (receipt.getStatus() == PacketReceiptStatus.FAILED) {
|
||||
this.peerTimedOut = true;
|
||||
this.peerLink.teardown();
|
||||
}
|
||||
//if (receipt.getStatus() == PacketReceiptStatus.FAILED) {
|
||||
// this.peerTimedOut = true;
|
||||
// this.peerLink.teardown();
|
||||
//}
|
||||
this.peerTimedOut = true;
|
||||
this.peerLink.teardown();
|
||||
}
|
||||
|
||||
/** Link Request callbacks */
|
||||
|
@ -616,6 +616,8 @@ public class Settings {
|
||||
|
||||
// Related to Reticulum networking
|
||||
|
||||
/** Preferred network: tcpip or reticulum */
|
||||
private String preferredNetwork = "reticulum";
|
||||
/** Maximum number of Reticulum peers allowed. */
|
||||
private int reticulumMaxPeers = 55;
|
||||
/** Minimum number of Reticulum peers desired. */
|
||||
@ -1380,6 +1382,10 @@ public class Settings {
|
||||
return connectionPoolMonitorEnabled;
|
||||
}
|
||||
|
||||
public String getPreferredNetwork () {
|
||||
return this.preferredNetwork.toLowerCase(Locale.getDefault());
|
||||
}
|
||||
|
||||
public int getReticulumMaxPeers() {
|
||||
return this.reticulumMaxPeers;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user