From e3923b7b22dce31f63c915004885301cd2168b5e Mon Sep 17 00:00:00 2001 From: CalDescent Date: Fri, 11 Jun 2021 19:10:04 +0100 Subject: [PATCH] Fixed issue causing frequent disconnects (found by szisti) When sending or requesting more than 1000 online accounts, peers would be disconnected with an EOF or connection reset error due to an intentional null response. This response has been removed and it will instead now only send the first 1000 accounts, which prevents the disconnections from occurring. In theory, these accounts should be in a different order on each node, so the 1000 limit should still result in a fairly even propagation of accounts. However, we may want to consider increasing this limit, to maximise the propagation speed. Thanks to szisti for tracking this one down. --- .../qortal/network/message/GetOnlineAccountsMessage.java | 8 +++----- .../org/qortal/network/message/OnlineAccountsMessage.java | 8 +++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/qortal/network/message/GetOnlineAccountsMessage.java b/src/main/java/org/qortal/network/message/GetOnlineAccountsMessage.java index dcb24fec..93f782df 100644 --- a/src/main/java/org/qortal/network/message/GetOnlineAccountsMessage.java +++ b/src/main/java/org/qortal/network/message/GetOnlineAccountsMessage.java @@ -6,6 +6,7 @@ import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import org.qortal.data.network.OnlineAccountData; import org.qortal.transform.Transformer; @@ -25,7 +26,7 @@ public class GetOnlineAccountsMessage extends Message { private GetOnlineAccountsMessage(int id, List onlineAccounts) { super(id, MessageType.GET_ONLINE_ACCOUNTS); - this.onlineAccounts = onlineAccounts; + this.onlineAccounts = onlineAccounts.stream().limit(MAX_ACCOUNT_COUNT).collect(Collectors.toList()); } public List getOnlineAccounts() { @@ -35,12 +36,9 @@ public class GetOnlineAccountsMessage extends Message { public static Message fromByteBuffer(int id, ByteBuffer bytes) throws UnsupportedEncodingException { final int accountCount = bytes.getInt(); - if (accountCount > MAX_ACCOUNT_COUNT) - return null; - List onlineAccounts = new ArrayList<>(accountCount); - for (int i = 0; i < accountCount; ++i) { + for (int i = 0; i < Math.min(MAX_ACCOUNT_COUNT, accountCount); ++i) { long timestamp = bytes.getLong(); byte[] publicKey = new byte[Transformer.PUBLIC_KEY_LENGTH]; diff --git a/src/main/java/org/qortal/network/message/OnlineAccountsMessage.java b/src/main/java/org/qortal/network/message/OnlineAccountsMessage.java index 75109a0a..6cd56009 100644 --- a/src/main/java/org/qortal/network/message/OnlineAccountsMessage.java +++ b/src/main/java/org/qortal/network/message/OnlineAccountsMessage.java @@ -6,6 +6,7 @@ import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import org.qortal.data.network.OnlineAccountData; import org.qortal.transform.Transformer; @@ -25,7 +26,7 @@ public class OnlineAccountsMessage extends Message { private OnlineAccountsMessage(int id, List onlineAccounts) { super(id, MessageType.ONLINE_ACCOUNTS); - this.onlineAccounts = onlineAccounts; + this.onlineAccounts = onlineAccounts.stream().limit(MAX_ACCOUNT_COUNT).collect(Collectors.toList()); } public List getOnlineAccounts() { @@ -35,12 +36,9 @@ public class OnlineAccountsMessage extends Message { public static Message fromByteBuffer(int id, ByteBuffer bytes) throws UnsupportedEncodingException { final int accountCount = bytes.getInt(); - if (accountCount > MAX_ACCOUNT_COUNT) - return null; - List onlineAccounts = new ArrayList<>(accountCount); - for (int i = 0; i < accountCount; ++i) { + for (int i = 0; i < Math.min(MAX_ACCOUNT_COUNT, accountCount); ++i) { long timestamp = bytes.getLong(); byte[] signature = new byte[Transformer.SIGNATURE_LENGTH];