ping task working

This commit is contained in:
Jürg Schulthess 2025-03-28 18:16:20 +01:00
parent da20485870
commit e1e5bceb05
5 changed files with 68 additions and 41 deletions

View File

@ -219,7 +219,7 @@ public class RNSNetwork {
baseDestination.announce(); baseDestination.announce();
log.debug("Sent initial announce from {} ({})", Hex.encodeHexString(baseDestination.getHash()), baseDestination.getName()); log.debug("Sent initial announce from {} ({})", Hex.encodeHexString(baseDestination.getHash()), baseDestination.getName());
// Start up first networking thread (the "server loop", JS: the "Tasks engine") // Start up first networking thread (the "server loop", the "Tasks engine")
rnsNetworkEPC.start(); rnsNetworkEPC.start();
} }
@ -299,6 +299,10 @@ public class RNSNetwork {
} catch (InterruptedException e) { } catch (InterruptedException e) {
log.error("exception: ", e); log.error("exception: ", e);
} }
//var pl = p.getPeerLink();
//if (nonNull(pl) & (pl.getStatus() == ACTIVE)) {
// pl.teardown();
//}
} }
// Stop processing threads (the "server loop") // Stop processing threads (the "server loop")
try { try {
@ -467,33 +471,33 @@ public class RNSNetwork {
return task; return task;
} }
task = maybeProduceBroadcastTask(now); //task = maybeProduceBroadcastTask(now);
if (task != null) { //if (task != null) {
return task; // return task;
} //}
return null; return null;
} }
//private Task maybeProducePeerMessageTask() { ////private Task maybeProducePeerMessageTask() {
// return getImmutableConnectedPeers().stream() //// return getImmutableConnectedPeers().stream()
// .map(Peer::getMessageTask) //// .map(Peer::getMessageTask)
// .filter(Objects::nonNull) //// .filter(Objects::nonNull)
// .findFirst() //// .findFirst()
// .orElse(null); //// .orElse(null);
//} ////}
////private Task maybeProducePeerMessageTask() {
//// return getImmutableIncomingPeers().stream()
//// .map(RNSPeer::getMessageTask)
//// .filter(RNSPeer::isAvailable)
//// .findFirst()
//// .orElse(null);
////}
//private Task maybeProducePeerMessageTask() { //private Task maybeProducePeerMessageTask() {
// return getImmutableIncomingPeers().stream() // return getImmutableIncomingPeers().stream()
// .map(RNSPeer::getMessageTask) // .map(RNSPeer::getMessageTask)
// .filter(RNSPeer::isAvailable)
// .findFirst() // .findFirst()
// .orElse(null); // .orElse(null);
//} //}
private Task maybeProducePeerMessageTask() {
return getImmutableIncomingPeers().stream()
.map(RNSPeer::getMessageTask)
.findFirst()
.orElse(null);
}
//private Task maybeProducePeerPingTask(Long now) { //private Task maybeProducePeerPingTask(Long now) {
// return getImmutableHandshakedPeers().stream() // return getImmutableHandshakedPeers().stream()
@ -604,8 +608,8 @@ public class RNSNetwork {
//@Synchronized //@Synchronized
public void prunePeers() throws DataException { public void prunePeers() throws DataException {
// run periodically (by the Controller) // run periodically (by the Controller)
//var peerList = getLinkedPeers(); var peerList = getLinkedPeers();
var peerList = getImmutableLinkedPeers(); //var peerList = getImmutableLinkedPeers();
log.info("number of links (linkedPeers) before pruning: {}", peerList.size()); log.info("number of links (linkedPeers) before pruning: {}", peerList.size());
Link pLink; Link pLink;
LinkStatus lStatus; LinkStatus lStatus;

View File

@ -67,6 +67,7 @@ import lombok.extern.slf4j.Slf4j;
import lombok.Setter; import lombok.Setter;
import lombok.Data; import lombok.Data;
import lombok.AccessLevel; import lombok.AccessLevel;
//import lombok.Synchronized;
// //
//import org.qortal.network.message.Message; //import org.qortal.network.message.Message;
//import org.qortal.network.message.MessageException; //import org.qortal.network.message.MessageException;
@ -98,7 +99,7 @@ public class RNSPeer {
private Boolean deleteMe = false; private Boolean deleteMe = false;
private Boolean isVacant = true; private Boolean isVacant = true;
private Long lastPacketRtt = null; private Long lastPacketRtt = null;
private byte[] emptyBuffer = {0,0,0}; private byte[] emptyBuffer = {0,0,0,0,0,0,0,0};
private Double requestResponseProgress; private Double requestResponseProgress;
@Setter(AccessLevel.PACKAGE) private Boolean peerTimedOut = false; @Setter(AccessLevel.PACKAGE) private Boolean peerTimedOut = false;
@ -182,6 +183,13 @@ public class RNSPeer {
this.peerLink.setPacketCallback(this::linkPacketReceived); this.peerLink.setPacketCallback(this::linkPacketReceived);
} }
@Override
public String toString() {
// for messages we want an address-like string representation
//return encodeHexString(this.getDestinationHash());
return this.getPeerLink().toString();
}
public BufferedRWPair getOrInitPeerBuffer() { public BufferedRWPair getOrInitPeerBuffer() {
var channel = this.peerLink.getChannel(); var channel = this.peerLink.getChannel();
if (nonNull(this.peerBuffer)) { if (nonNull(this.peerBuffer)) {
@ -225,8 +233,8 @@ public class RNSPeer {
if (isFalse(this.isInitiator)) { if (isFalse(this.isInitiator)) {
sendCloseToRemote(this.peerLink); sendCloseToRemote(this.peerLink);
} }
peerLink.teardown(); this.peerLink.teardown();
}else { } else {
log.info("shutdown - status (non-ACTIVE): {}", peerLink.getStatus()); log.info("shutdown - status (non-ACTIVE): {}", peerLink.getStatus());
} }
this.peerLink = null; this.peerLink = null;
@ -308,17 +316,19 @@ public class RNSPeer {
*/ */
public void peerBufferReady(Integer readyBytes) { public void peerBufferReady(Integer readyBytes) {
// get the message data // get the message data
var data = this.peerBuffer.read(readyBytes); byte[] data = this.peerBuffer.read(readyBytes);
log.info("data length, data: {}, {}", data.length, data); ByteBuffer bb = ByteBuffer.wrap(data);
log.info("data length: {}, data: {}, ByteBuffer: {}", data.length, data, bb);
//var pureData = Arrays.copyOfRange(data, this.messageMagic.length - 1, data.length); //var pureData = Arrays.copyOfRange(data, this.messageMagic.length - 1, data.length);
log.trace("peerBufferReady - data bytes: {}", data.length); log.trace("peerBufferReady - data bytes: {}", data.length);
if (ByteBuffer.wrap(data, 0, emptyBuffer.length).equals(ByteBuffer.wrap(emptyBuffer, 0, emptyBuffer.length))) { if (ByteBuffer.wrap(data, 0, emptyBuffer.length).equals(ByteBuffer.wrap(emptyBuffer, 0, emptyBuffer.length))) {
log.info("peerBufferReady - empty buffer detected (length: {})", data.length); log.info("peerBufferReady - empty buffer detected (length: {})", data.length);
//this.peerBuffer.flush();
} else { } else {
try { try {
//this.peerBuffer.flush(); log.info("***> creating message from {} bytes", data.length);
Message message = Message.fromByteBuffer(ByteBuffer.wrap(data)); Message message = Message.fromByteBuffer(bb);
log.info("type {} message received ({} bytes): {}", message.getType(), data.length, message); log.info("type {} message received ({} bytes): {}", message.getType(), data.length, message);
// Handle message based on type // Handle message based on type
switch (message.getType()) { switch (message.getType()) {
@ -330,13 +340,15 @@ public class RNSPeer {
// break; // break;
case PING: case PING:
onPingMessage(this, message); if (isFalse(this.isInitiator)) {
// Note: buffer flush done in onPingMessage method onPingMessage(this, message);
// Note: buffer flush done in onPingMessage method
}
break; break;
case PONG: case PONG:
//log.info("PONG received"); log.info("PONG received");
//break; break;
// Do we need this ? (We don't have RNSPeer versions) // Do we need this ? (We don't have RNSPeer versions)
//case PEERS_V2: //case PEERS_V2:
@ -345,16 +357,19 @@ public class RNSPeer {
// break; // break;
default: default:
// Bump up to controller for possible action //if (isFalse(this.isInitiator)) {
//Controller.getInstance().onNetworkMessage(peer, message); // Bump up to controller for possible action
Controller.getInstance().onRNSNetworkMessage(this, message); //Controller.getInstance().onNetworkMessage(peer, message);
this.peerBuffer.flush(); Controller.getInstance().onRNSNetworkMessage(this, message);
this.peerBuffer.flush();
//}
break; break;
} }
} catch (MessageException e) { } catch (MessageException e) {
//log.error("{} from peer {}", e.getMessage(), this); //log.error("{} from peer {}", e.getMessage(), this);
log.error("{} from peer {}", e, this); log.error("{} from peer {}", e, this);
} }
//this.peerBuffer.flush(); // clear buffer
} }
} }
@ -466,17 +481,18 @@ public class RNSPeer {
/** Utility methods */ /** Utility methods */
public void pingRemote() { public void pingRemote() {
var link = this.peerLink; var link = this.peerLink;
if (nonNull(link)) { //if (nonNull(link) & (isFalse(link.isInitiator()))) {
if (nonNull(link) & link.isInitiator()) {
if (peerLink.getStatus() == ACTIVE) { if (peerLink.getStatus() == ACTIVE) {
log.info("pinging remote: {}", link); log.info("pinging remote: {}", link);
var data = "ping".getBytes(UTF_8); var data = "ping".getBytes(UTF_8);
link.setPacketCallback(this::linkPacketReceived); link.setPacketCallback(this::linkPacketReceived);
Packet pingPacket = new Packet(link, data); Packet pingPacket = new Packet(link, data);
PacketReceipt packetReceipt = pingPacket.send(); PacketReceipt packetReceipt = pingPacket.send();
packetReceipt.setDeliveryCallback(this::packetDelivered);
// Note: don't setTimeout, we want it to timeout with FAIL if not deliverable // Note: don't setTimeout, we want it to timeout with FAIL if not deliverable
//packetReceipt.setTimeout(5000L); //packetReceipt.setTimeout(5000L);
packetReceipt.setTimeoutCallback(this::packetTimedOut); packetReceipt.setTimeoutCallback(this::packetTimedOut);
packetReceipt.setDeliveryCallback(this::packetDelivered);
} else { } else {
log.info("can't send ping to a peer {} with (link) status: {}", log.info("can't send ping to a peer {} with (link) status: {}",
encodeHexString(peerLink.getDestination().getHash()), peerLink.getStatus()); encodeHexString(peerLink.getDestination().getHash()), peerLink.getStatus());

View File

@ -9,6 +9,8 @@ import java.io.IOException;
import java.nio.BufferUnderflowException; import java.nio.BufferUnderflowException;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Arrays; import java.util.Arrays;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/** /**
* Network message for sending over network, or unpacked data received from network. * Network message for sending over network, or unpacked data received from network.
@ -33,6 +35,7 @@ import java.util.Arrays;
* </p> * </p>
*/ */
public abstract class Message { public abstract class Message {
private static final Logger LOGGER = LogManager.getLogger(Message.class);
// MAGIC(4) + TYPE(4) + HAS-ID(1) + ID?(4) + DATA-SIZE(4) + CHECKSUM?(4) + DATA?(*) // MAGIC(4) + TYPE(4) + HAS-ID(1) + ID?(4) + DATA-SIZE(4) + CHECKSUM?(4) + DATA?(*)
private static final int MAGIC_LENGTH = 4; private static final int MAGIC_LENGTH = 4;
@ -95,9 +98,11 @@ public abstract class Message {
byte[] messageMagic = new byte[MAGIC_LENGTH]; byte[] messageMagic = new byte[MAGIC_LENGTH];
readOnlyBuffer.get(messageMagic); readOnlyBuffer.get(messageMagic);
if (!Arrays.equals(messageMagic, Network.getInstance().getMessageMagic())) if (!Arrays.equals(messageMagic, Network.getInstance().getMessageMagic())) {
LOGGER.info("xyz - mM: {}, Network getMessageMagic: {}", messageMagic, Network.getInstance().getMessageMagic());
// Didn't receive correct Message "magic" // Didn't receive correct Message "magic"
throw new MessageException("Received incorrect message 'magic'"); throw new MessageException("Received incorrect message 'magic'");
}
// Find supporting object // Find supporting object
int typeValue = readOnlyBuffer.getInt(); int typeValue = readOnlyBuffer.getInt();

View File

@ -24,6 +24,7 @@ public class RNSMessageTask implements Task {
@Override @Override
public void perform() throws InterruptedException { public void perform() throws InterruptedException {
//RNSNetwork.getInstance().onMessage(peer, nextMessage); //RNSNetwork.getInstance().onMessage(peer, nextMessage);
// TODO: what do we do in the Reticulum case? => implement // TODO: what do we do in the Reticulum case?
// Note: this is automatically handled (asynchronously) by the RNSPeer peerBufferReady callback
} }
} }

View File

@ -45,9 +45,10 @@ public class RNSPingTask implements Task {
//} catch (MessageException e) { //} catch (MessageException e) {
// LOGGER.error(e.getMessage(), e); // LOGGER.error(e.getMessage(), e);
//} //}
// Note: We might use peer.sendMessage(pingMessage) instead
peer.getResponse(pingMessage); peer.getResponse(pingMessage);
//// task is not over here. //// task is not over here (Reticulum is asynchronous)
//peer.setLastPing(NTP.getTime() - now); //peer.setLastPing(NTP.getTime() - now);
} }
} }