Maintain backwards support for pre-3.2.0 peers by only including new file list message params when sending to newer peers.

These params are optional and the process will function without them, just less efficiently.
This commit is contained in:
CalDescent 2022-02-20 20:11:53 +00:00
parent 3dadce4da4
commit eac4b0d87b
2 changed files with 39 additions and 6 deletions

View File

@ -29,6 +29,7 @@ public class ArbitraryDataFileListManager {
private static ArbitraryDataFileListManager instance; private static ArbitraryDataFileListManager instance;
private static String MIN_PEER_VERSION_FOR_FILE_LIST_STATS = "3.2.0";
/** /**
* Map of recent incoming requests for ARBITRARY transaction data file lists. * Map of recent incoming requests for ARBITRARY transaction data file lists.
@ -488,6 +489,12 @@ public class ArbitraryDataFileListManager {
arbitraryDataFileListMessage.setRequestHops(++requestHops); arbitraryDataFileListMessage.setRequestHops(++requestHops);
} }
// Remove optional parameters if the requesting peer doesn't support it yet
// A message with less statistical data is better than no message at all
if (!requestingPeer.isAtLeastVersion(MIN_PEER_VERSION_FOR_FILE_LIST_STATS)) {
arbitraryDataFileListMessage.removeOptionalStats();
}
// Forward to requesting peer // Forward to requesting peer
LOGGER.debug("Forwarding file list with {} hashes to requesting peer: {}", hashes.size(), requestingPeer); LOGGER.debug("Forwarding file list with {} hashes to requesting peer: {}", hashes.size(), requestingPeer);
if (!requestingPeer.sendMessage(arbitraryDataFileListMessage)) { if (!requestingPeer.sendMessage(arbitraryDataFileListMessage)) {
@ -594,6 +601,13 @@ public class ArbitraryDataFileListManager {
ArbitraryDataFileListMessage arbitraryDataFileListMessage = new ArbitraryDataFileListMessage(signature, ArbitraryDataFileListMessage arbitraryDataFileListMessage = new ArbitraryDataFileListMessage(signature,
hashes, NTP.getTime(), 0, ourAddress, true); hashes, NTP.getTime(), 0, ourAddress, true);
arbitraryDataFileListMessage.setId(message.getId()); arbitraryDataFileListMessage.setId(message.getId());
// Remove optional parameters if the requesting peer doesn't support it yet
// A message with less statistical data is better than no message at all
if (!peer.isAtLeastVersion(MIN_PEER_VERSION_FOR_FILE_LIST_STATS)) {
arbitraryDataFileListMessage.removeOptionalStats();
}
if (!peer.sendMessage(arbitraryDataFileListMessage)) { if (!peer.sendMessage(arbitraryDataFileListMessage)) {
LOGGER.debug("Couldn't send list of hashes"); LOGGER.debug("Couldn't send list of hashes");
peer.disconnect("failed to send list of hashes"); peer.disconnect("failed to send list of hashes");

View File

@ -22,10 +22,10 @@ public class ArbitraryDataFileListMessage extends Message {
private final byte[] signature; private final byte[] signature;
private final List<byte[]> hashes; private final List<byte[]> hashes;
private final Long requestTime; private Long requestTime;
private Integer requestHops; private Integer requestHops;
private final String peerAddress; private String peerAddress;
private final boolean isRelayPossible; private Boolean isRelayPossible;
public ArbitraryDataFileListMessage(byte[] signature, List<byte[]> hashes, Long requestTime, public ArbitraryDataFileListMessage(byte[] signature, List<byte[]> hashes, Long requestTime,
@ -109,7 +109,7 @@ public class ArbitraryDataFileListMessage extends Message {
bytes.write(hash); bytes.write(hash);
} }
if (this.requestTime == null) { // Just in case if (this.requestTime == null) { // To maintain backwards support
return bytes.toByteArray(); return bytes.toByteArray();
} }
@ -136,15 +136,26 @@ public class ArbitraryDataFileListMessage extends Message {
return clone; return clone;
} }
public void removeOptionalStats() {
this.requestTime = null;
this.requestHops = null;
this.peerAddress = null;
this.isRelayPossible = null;
}
public Long getRequestTime() { public Long getRequestTime() {
return this.requestTime; return this.requestTime;
} }
public void setRequestTime(Long requestTime) {
this.requestTime = requestTime;
}
public Integer getRequestHops() { public Integer getRequestHops() {
return this.requestHops; return this.requestHops;
} }
public void setRequestHops(int requestHops) { public void setRequestHops(Integer requestHops) {
this.requestHops = requestHops; this.requestHops = requestHops;
} }
@ -152,8 +163,16 @@ public class ArbitraryDataFileListMessage extends Message {
return this.peerAddress; return this.peerAddress;
} }
public boolean isRelayPossible() { public void setPeerAddress(String peerAddress) {
this.peerAddress = peerAddress;
}
public Boolean isRelayPossible() {
return this.isRelayPossible; return this.isRelayPossible;
} }
public void setIsRelayPossible(Boolean isRelayPossible) {
this.isRelayPossible = isRelayPossible;
}
} }