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; }