diff --git a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml
deleted file mode 100644
index 0c856aac..00000000
--- a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
- io.reticulum
- reticulum-network-stack
- 1.0-SNAPSHOT
-
-
- true
-
- 20250418180444
-
-
- jar
- 1.0-SNAPSHOT
- 20250418180444
-
-
- pom
- 1.0-SNAPSHOT
- 20241218212752
-
-
-
-
diff --git a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.jar b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.jar
deleted file mode 100644
index e1d6ad48..00000000
Binary files a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.jar and /dev/null differ
diff --git a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.pom b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.pom
deleted file mode 100644
index 1b1cc206..00000000
--- a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.pom
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
- 4.0.0
- io.reticulum
- reticulum-network-stack
- 1.0-SNAPSHOT
- POM was created from install:install-file
-
diff --git a/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml b/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml
deleted file mode 100644
index 45dbe562..00000000
--- a/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
- io.reticulum
- reticulum-network-stack
-
-
- 1.0-SNAPSHOT
-
- 20250418180444
-
-
diff --git a/pom.xml b/pom.xml
index 82e0f42f..42fe7ea9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -52,6 +52,7 @@
3.5.2
3.25.3
1.5.3
+ c0eeadf
1.17
2.0.10
5.18.2
@@ -512,6 +513,12 @@
altcoinj
${altcoinj.version}
+
+
+ com.github.sergst83
+ reticulum-network-stack
+ ${reticulum.version}
+
com.googlecode.json-simple
@@ -805,12 +812,6 @@
jaxb-runtime
${jaxb-runtime.version}
-
-
- io.reticulum
- reticulum-network-stack
- 1.0-SNAPSHOT
-
com.fasterxml.jackson.core
jackson-databind
diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java
index ae2d6a99..c69bb2eb 100644
--- a/src/main/java/org/qortal/controller/Controller.java
+++ b/src/main/java/org/qortal/controller/Controller.java
@@ -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 seeds = new ArrayList<>(RNSNetwork.getInstance().getActiveImmutableLinkedPeers());
+ //
+ // // 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) {
@@ -2918,7 +2985,7 @@ public class Controller extends Thread {
return true;
// Needs a mutable copy of the unmodifiableList
- List peers = new ArrayList<>(RNSNetwork.getInstance().getImmutableActiveLinkedPeers());
+ List peers = new ArrayList<>(RNSNetwork.getInstance().getActiveImmutableLinkedPeers());
if (peers == null)
return false;
diff --git a/src/main/java/org/qortal/controller/RNSSynchronizer.java b/src/main/java/org/qortal/controller/RNSSynchronizer.java
index c28413e8..29453b3f 100644
--- a/src/main/java/org/qortal/controller/RNSSynchronizer.java
+++ b/src/main/java/org/qortal/controller/RNSSynchronizer.java
@@ -218,7 +218,7 @@ public class RNSSynchronizer extends Thread {
return true;
// Needs a mutable copy of the unmodifiableList
- List peers = new ArrayList<>(RNSNetwork.getInstance().getImmutableActiveLinkedPeers());
+ List peers = new ArrayList<>(RNSNetwork.getInstance().getActiveImmutableLinkedPeers());
//// Disregard peers that have "misbehaved" recently
//peers.removeIf(Controller.hasMisbehaved);
@@ -395,7 +395,7 @@ public class RNSSynchronizer extends Thread {
}
private boolean checkRecoveryModeForPeers(List qualifiedPeers) {
- List linkedPeers = RNSNetwork.getInstance().getImmutableActiveLinkedPeers();
+ List linkedPeers = RNSNetwork.getInstance().getActiveImmutableLinkedPeers();
if (!linkedPeers.isEmpty()) {
// There is at least one handshaked peer
diff --git a/src/main/java/org/qortal/network/RNSNetwork.java b/src/main/java/org/qortal/network/RNSNetwork.java
index 85d26bf6..611625a1 100644
--- a/src/main/java/org/qortal/network/RNSNetwork.java
+++ b/src/main/java/org/qortal/network/RNSNetwork.java
@@ -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;
@@ -252,7 +252,7 @@ public class RNSNetwork {
}
public void broadcast(Function peerMessageBuilder) {
- for (RNSPeer peer : getImmutableActiveLinkedPeers()) {
+ for (RNSPeer peer : getActiveImmutableLinkedPeers()) {
if (this.isShuttingDown) {
return;
}
@@ -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;
}
@@ -531,7 +531,7 @@ public class RNSNetwork {
//// Note: we might not need this. All messages handled asynchronously in Reticulum
//// (RNSPeer peerBufferReady callback)
//private Task maybeProducePeerMessageTask() {
- // return getImmutableActiveLinkedPeers().stream()
+ // return getActiveImmutableLinkedPeers().stream()
// .map(RNSPeer::getMessageTask)
// .filter(Objects::nonNull)
// .findFirst()
@@ -555,7 +555,7 @@ public class RNSNetwork {
// log.info("ilp - {}", ilp);
//}
//return ilp;
- return getImmutableActiveLinkedPeers().stream()
+ return getActiveImmutableLinkedPeers().stream()
.map(peer -> peer.getPingTask(now))
.filter(Objects::nonNull)
.findFirst()
@@ -589,7 +589,7 @@ public class RNSNetwork {
return SingletonContainer.INSTANCE;
}
- public List getImmutableActiveLinkedPeers() {
+ public List getActiveImmutableLinkedPeers() {
List activePeers = Collections.synchronizedList(new ArrayList<>());
for (RNSPeer p: this.immutableLinkedPeers) {
if (nonNull(p.getPeerLink()) && (p.getPeerLink().getStatus() == ACTIVE)) {
@@ -609,13 +609,13 @@ 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();
}
- this.linkedPeers.remove(peer); // thread safe
+ this.linkedPeers.remove(this.linkedPeers.indexOf(peer)); // thread safe
this.immutableLinkedPeers = List.copyOf(this.linkedPeers);
}
@@ -635,7 +635,7 @@ public class RNSNetwork {
if (nonNull(peer.getPeerLink())) {
peer.getPeerLink().teardown();
}
- this.incomingPeers.remove(peer);
+ this.incomingPeers.remove(this.incomingPeers.indexOf(peer));
this.immutableIncomingPeers = List.copyOf(this.incomingPeers);
}
@@ -649,23 +649,6 @@ public class RNSNetwork {
// TODO, methods for: getAvailablePeer
- // maintenance
- //public void removePeer(RNSPeer peer) {
- // synchronized(this) {
- // List 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();
@@ -693,7 +676,7 @@ public class RNSNetwork {
//}
}
- public List incomingNonActivePeers() {
+ public List getNonActiveIncomingPeers() {
var ips = getIncomingPeers();
List result = Collections.synchronizedList(new ArrayList<>());
Link pl;
@@ -712,76 +695,64 @@ 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());
// prune initiator peers
- List lps = getLinkedPeers();
- for (RNSPeer p : lps) {
+ //var peerList = getImmutableLinkedPeers();
+ var initiatorPeerList = getImmutableLinkedPeers();
+ var initiatorActivePeerList = getActiveImmutableLinkedPeers();
+ var incomingPeerList = getImmutableIncomingPeers();
+ var numActiveIncomingPeers = incomingPeerList.size() - getNonActiveIncomingPeers().size();
+ log.info("number of links (linkedPeers (active) / incomingPeers (active) before prunig: {} ({}), {} ({})",
+ initiatorPeerList.size(), getActiveImmutableLinkedPeers().size(),
+ incomingPeerList.size(), numActiveIncomingPeers);
+ for (RNSPeer p: initiatorActivePeerList) {
+ var pLink = p.getOrInitPeerLink();
+ p.pingRemote();
+ }
+ for (RNSPeer p : initiatorPeerList) {
var pLink = p.getPeerLink();
if (nonNull(pLink)) {
- log.info("peer link: {}, status: {}", pLink, pLink.getStatus());
- if (pLink.getStatus() == ACTIVE) {
- p.pingRemote();
- }
if (p.getPeerTimedOut()) {
+ // options: keep in case peer reconnects or remove => we'll remove it
+ removeLinkedPeer(p);
+ continue;
+ }
+ if (pLink.getStatus() == ACTIVE) {
+ continue;
+ }
+ if (pLink.getStatus() == CLOSED) {
+ removeLinkedPeer(p);
+ continue;
+ }
+ if (pLink.getStatus() == PENDING) {
pLink.teardown();
+ removeLinkedPeer(p);
+ continue;
}
}
}
- //Link pLink;
- //LinkStatus lStatus;
- //var now = Instant.now();
- //for (RNSPeer p: peerList) {
- // pLink = p.getPeerLink();
- // var peerLastAccessTimestamp = p.getLastAccessTimestamp();
- // var peerLastPingResponseReceived = p.getLastPingResponseReceived();
- // log.info("peerLink: {}, status: {}", pLink, pLink.getStatus());
- // log.info("prunePeers - pLink: {}, destinationHash: {}",
- // pLink, Hex.encodeHexString(p.getDestinationHash()));
- // log.debug("peer: {}", p);
- // if (nonNull(pLink)) {
- // if ((p.getPeerTimedOut()) && (peerLastPingResponseReceived.isBefore(now.minusMillis(LINK_UNREACHABLE_TIMEOUT)))) {
- // // close peer link for now
- // pLink.teardown();
- // }
- // lStatus = pLink.getStatus();
- // log.info("Link {} status: {}", pLink, lStatus);
- // // lStatus in: PENDING, HANDSHAKE, ACTIVE, STALE, CLOSED
- // if ((lStatus == STALE) || (pLink.getTeardownReason() == TIMEOUT) || (isUnreachable(p))) {
- // //p.shutdown();
- // //peerList.remove(p);
- // removeLinkedPeer(p);
- // } else if (lStatus == HANDSHAKE) {
- // // stuck in handshake state (do we need to shutdown/remove it?)
- // log.info("peer status HANDSHAKE");
- // //p.shutdown();
- // //peerList.remove(p);
- // removeLinkedPeer(p);
- // }
- // // either reach peer or disable link
- // p.pingRemote();
- // } else {
- // if (peerLastPingResponseReceived.isBefore(now.minusMillis(LINK_UNREACHABLE_TIMEOUT))) {
- // //peerList.remove(p);
- // removeLinkedPeer(p);
- // }
- // }
- //}
- List inaps = incomingNonActivePeers();
- //log.info("number of inactive incoming peers: {}", inaps.size());
+ // prune non-initiator peers
+ List inaps = getNonActiveIncomingPeers();
for (RNSPeer p: inaps) {
- incomingPeerList.remove(incomingPeerList.indexOf(p));
+ var pLink = p.getPeerLink();
+ if (nonNull(pLink)) {
+ // could be eg. PENDING
+ pLink.teardown();
+ }
+ removeIncomingPeer(p);
}
- log.info("number of links (linkedPeers / incomingPeers) after prunig: {}, {}", peerList.size(),
- incomingPeerList.size());
- maybeAnnounce(getBaseDestination());
+ initiatorPeerList = getImmutableLinkedPeers();
+ initiatorActivePeerList = getActiveImmutableLinkedPeers();
+ incomingPeerList = getImmutableIncomingPeers();
+ numActiveIncomingPeers = incomingPeerList.size() - getNonActiveIncomingPeers().size();
+ log.info("number of links (linkedPeers (active) / incomingPeers (active) after prunig: {} ({}), {} ({})",
+ initiatorPeerList.size(), getActiveImmutableLinkedPeers().size(),
+ incomingPeerList.size(), numActiveIncomingPeers);
}
public void maybeAnnounce(Destination d) {
- if (getLinkedPeers().size() < MIN_DESIRED_PEERS) {
+ var activePeers = getActiveImmutableLinkedPeers().size();
+ if (activePeers <= MIN_DESIRED_PEERS) {
+ log.info("Active peers ({}) <= desired peers ({}). Announcing", activePeers, MIN_DESIRED_PEERS);
d.announce();
}
}
diff --git a/src/main/java/org/qortal/network/RNSPeer.java b/src/main/java/org/qortal/network/RNSPeer.java
index 81d693d5..99177b64 100644
--- a/src/main/java/org/qortal/network/RNSPeer.java
+++ b/src/main/java/org/qortal/network/RNSPeer.java
@@ -99,17 +99,17 @@ public class RNSPeer {
int sendStreamId = 0;
private Boolean isInitiator;
private Boolean deleteMe = false;
- private Boolean isVacant = true;
+ //private Boolean isVacant = true;
private Long lastPacketRtt = null;
- private byte[] emptyBuffer = {0,0,0,0,0};
+ //private byte[] emptyBuffer = {0,0,0,0,0};
private Double requestResponseProgress;
@Setter(AccessLevel.PACKAGE) private Boolean peerTimedOut = false;
// 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.
@@ -144,7 +144,7 @@ public class RNSPeer {
initPeerLink();
//setCreationTimestamp(System.currentTimeMillis());
this.creationTimestamp = Instant.now();
- this.isVacant = true;
+ //this.isVacant = true;
this.replyQueues = new ConcurrentHashMap<>();
this.pendingMessages = new LinkedBlockingQueue<>();
this.peerData = new RNSPeerData(dhash);
@@ -164,7 +164,7 @@ public class RNSPeer {
this.lastAccessTimestamp = Instant.now();
this.lastLinkProbeTimestamp = null;
this.isInitiator = false;
- this.isVacant = false;
+ //this.isVacant = false;
//this.peerLink.setLinkEstablishedCallback(this::linkEstablished);
//this.peerLink.setLinkClosedCallback(this::linkClosed);
@@ -223,8 +223,7 @@ public class RNSPeer {
log.info("creating buffer - peerLink status: {}, channel: {}", this.peerLink.getStatus(), channel);
this.peerBuffer = Buffer.createBidirectionalBuffer(receiveStreamId, sendStreamId, channel, this::peerBufferReady);
}
- //return getPeerBuffer();
- return this.peerBuffer;
+ return getPeerBuffer();
}
public Link getOrInitPeerLink() {
@@ -342,10 +341,10 @@ public class RNSPeer {
//log.trace("peerBufferReady - data bytes: {}", data.length);
this.lastAccessTimestamp = Instant.now();
- if (ByteBuffer.wrap(data, 0, emptyBuffer.length).equals(ByteBuffer.wrap(emptyBuffer, 0, emptyBuffer.length))) {
- log.info("peerBufferReady - empty buffer detected (length: {})", data.length);
- }
- else {
+ //if (ByteBuffer.wrap(data, 0, emptyBuffer.length).equals(ByteBuffer.wrap(emptyBuffer, 0, emptyBuffer.length))) {
+ // log.info("peerBufferReady - empty buffer detected (length: {})", data.length);
+ //}
+ //else {
try {
//log.info("***> creating message from {} bytes", data.length);
Message message = Message.fromByteBuffer(bb);
@@ -370,7 +369,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 +377,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);
@@ -415,11 +414,11 @@ public class RNSPeer {
log.error("{} from peer {}", e, this);
log.info("{} from peer {}", e, this);
}
- }
+ //}
}
/**
- * 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) {
@@ -500,9 +499,12 @@ public class RNSPeer {
public void packetTimedOut(PacketReceipt receipt) {
log.info("packet timed out, receipt status: {}", receipt.getStatus());
if (receipt.getStatus() == PacketReceiptStatus.FAILED) {
+ log.info("packet timed out, receipt status: {}", PacketReceiptStatus.FAILED);
this.peerTimedOut = true;
this.peerLink.teardown();
}
+ //this.peerTimedOut = true;
+ //this.peerLink.teardown();
}
/** Link Request callbacks */
diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java
index f3f84e12..654f3529 100644
--- a/src/main/java/org/qortal/settings/Settings.java
+++ b/src/main/java/org/qortal/settings/Settings.java
@@ -616,10 +616,12 @@ 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. */
- private int reticulumMinDesiredPeers = 3;
+ private int reticulumMinDesiredPeers = 8;
/** Maximum number of task executor network threads */
private int reticulumMaxNetworkThreadPoolSize = 89;
@@ -1380,6 +1382,10 @@ public class Settings {
return connectionPoolMonitorEnabled;
}
+ public String getPreferredNetwork () {
+ return this.preferredNetwork.toLowerCase(Locale.getDefault());
+ }
+
public int getReticulumMaxPeers() {
return this.reticulumMaxPeers;
}