Merge pull request #7343 from alvasw/fix_crash_due_to_broken_filter_provided_nodes_merge

Fix crash due to broken filter provided nodes merge
This commit is contained in:
Alejandro García 2025-01-15 20:23:55 +00:00 committed by GitHub
commit 65f64fc80e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 41 additions and 50 deletions

View file

@ -26,6 +26,7 @@ import bisq.common.util.Utilities;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -66,9 +67,9 @@ public class BtcNodesSetupPreferences {
break;
case PROVIDED:
default:
List<BtcNode> hardcodedBtcNodes = btcNodes.getProvidedBtcNodes();
List<String> filterProvidedBtcNodes = config.filterProvidedBtcNodes;
List<String> bannedBtcNodes = config.bannedBtcNodes;
Stream<BtcNode> hardcodedBtcNodes = btcNodes.getProvidedBtcNodes().stream();
Stream<String> filterProvidedBtcNodes = config.filterProvidedBtcNodes.stream();
Stream<String> bannedBtcNodes = config.bannedBtcNodes.stream();
result = FederatedBtcNodeProvider.getNodes(hardcodedBtcNodes, filterProvidedBtcNodes, bannedBtcNodes);
break;
}

View file

@ -6,6 +6,7 @@ import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import lombok.extern.slf4j.Slf4j;
@ -14,24 +15,23 @@ import org.jetbrains.annotations.Nullable;
@Slf4j
public class FederatedBtcNodeProvider {
static List<BtcNodes.BtcNode> getNodes(List<BtcNodes.BtcNode> hardcodedBtcNodes,
List<String> filterProvidedBtcNodesConfig,
List<String> bannedBtcNodesConfig) {
Set<BtcNodes.BtcNode> filterProvidedBtcNodes = filterProvidedBtcNodesConfig.stream()
static List<BtcNodes.BtcNode> getNodes(Stream<BtcNodes.BtcNode> hardcodedBtcNodes,
Stream<String> filterProvidedBtcNodesConfig,
Stream<String> bannedBtcNodesConfig) {
Stream<BtcNodes.BtcNode> filterProvidedBtcNodes = filterProvidedBtcNodesConfig
.filter(n -> !n.isEmpty())
.map(FederatedBtcNodeProvider::getNodeAddress)
.filter(Objects::nonNull)
.map(nodeAddress -> new BtcNodes.BtcNode(null, nodeAddress.getHostName(), null, nodeAddress.getPort(), "Provided by filter"))
.collect(Collectors.toSet());
hardcodedBtcNodes.addAll(filterProvidedBtcNodes);
.map(nodeAddress -> new BtcNodes.BtcNode(null, nodeAddress.getHostName(), null,
nodeAddress.getPort(), "Provided by filter"));
Set<NodeAddress> bannedBtcNodeHostNames = bannedBtcNodesConfig.stream()
Set<NodeAddress> bannedBtcNodeHostNames = bannedBtcNodesConfig
.filter(n -> !n.isEmpty())
.map(FederatedBtcNodeProvider::getNodeAddress)
.filter(Objects::nonNull)
.collect(Collectors.toSet());
return hardcodedBtcNodes.stream()
return Stream.concat(hardcodedBtcNodes, filterProvidedBtcNodes)
.filter(btcNode -> {
String nodeAddress = btcNode.hasOnionAddress() ? btcNode.getOnionAddress() :
btcNode.getHostNameOrAddress();

View file

@ -1,8 +1,7 @@
package bisq.core.btc.nodes;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;
import org.junit.jupiter.api.Test;
@ -20,12 +19,11 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
);
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
List<String> filterProvidedBtcNodes = Collections.emptyList();
List<String> bannedBtcNodes = Collections.emptyList();
Stream<String> filterProvidedBtcNodes = Stream.empty();
Stream<String> bannedBtcNodes = Stream.empty();
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
.getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
assertIterableEquals(hardcodedNodes, selectedNodes);
}
@ -43,13 +41,12 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
);
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
List<String> filterProvidedBtcNodes = Collections.emptyList();
Stream<String> filterProvidedBtcNodes = Stream.empty();
String bannedFullAddress = bannedAddress + ":" + port;
List<String> bannedBtcNodes = List.of(bannedFullAddress);
Stream<String> bannedBtcNodes = Stream.of(bannedFullAddress);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
.getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
var expected = List.of(
new BtcNodes.BtcNode(null, "alice.onion", null,
@ -72,13 +69,12 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
);
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
List<String> filterProvidedBtcNodes = Collections.emptyList();
Stream<String> filterProvidedBtcNodes = Stream.empty();
String bannedFullAddress = bannedAddress + ":" + 1234;
List<String> bannedBtcNodes = List.of(bannedFullAddress);
Stream<String> bannedBtcNodes = Stream.of(bannedFullAddress);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
.getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
assertIterableEquals(hardcodedNodes, selectedNodes);
}
@ -96,13 +92,12 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
);
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
List<String> filterProvidedBtcNodes = Collections.emptyList();
Stream<String> filterProvidedBtcNodes = Stream.empty();
String bannedFullAddress = "[" + bannedAddress + "]" + ":" + port;
List<String> bannedBtcNodes = List.of(bannedFullAddress);
Stream<String> bannedBtcNodes = Stream.of(bannedFullAddress);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
.getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
var expected = List.of(
new BtcNodes.BtcNode(null, "alice.onion", null,
@ -125,13 +120,12 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
);
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
List<String> filterProvidedBtcNodes = Collections.emptyList();
Stream<String> filterProvidedBtcNodes = Stream.empty();
String bannedFullAddress = "[" + bannedAddress + "]" + ":" + 1234;
List<String> bannedBtcNodes = List.of(bannedFullAddress);
Stream<String> bannedBtcNodes = Stream.of(bannedFullAddress);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
.getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
assertIterableEquals(hardcodedNodes, selectedNodes);
}
@ -149,12 +143,11 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
);
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
List<String> filterProvidedBtcNodes = Collections.emptyList();
List<String> bannedBtcNodes = List.of(bannedHostName + ":" + port);
Stream<String> filterProvidedBtcNodes = Stream.empty();
Stream<String> bannedBtcNodes = Stream.of(bannedHostName + ":" + port);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
.getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
var expected = List.of(
new BtcNodes.BtcNode(null, "alice.onion", null,
@ -177,12 +170,11 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
);
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
List<String> filterProvidedBtcNodes = Collections.emptyList();
List<String> bannedBtcNodes = List.of(bannedHostName + ":" + 1234);
Stream<String> filterProvidedBtcNodes = Stream.empty();
Stream<String> bannedBtcNodes = Stream.of(bannedHostName + ":" + 1234);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
.getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
assertIterableEquals(hardcodedNodes, selectedNodes);
}
@ -200,12 +192,11 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
);
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
List<String> filterProvidedBtcNodes = Collections.emptyList();
List<String> bannedBtcNodes = List.of(bannedOnionAddress + ":" + BtcNodes.BtcNode.DEFAULT_PORT);
Stream<String> filterProvidedBtcNodes = Stream.empty();
Stream<String> bannedBtcNodes = Stream.of(bannedOnionAddress + ":" + BtcNodes.BtcNode.DEFAULT_PORT);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
.getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
var expected = List.of(
new BtcNodes.BtcNode(null, "alice.onion", null,
@ -229,12 +220,11 @@ public class FederatedBtcNodeProviderTest {
BtcNodes.BtcNode.DEFAULT_PORT, "@charlie")
);
List<BtcNodes.BtcNode> mutableHardcodedList = new ArrayList<>(hardcodedNodes);
List<String> filterProvidedBtcNodes = Collections.emptyList();
List<String> bannedBtcNodes = List.of(bannedOnionAddress + ":" + 1234);
Stream<String> filterProvidedBtcNodes = Stream.empty();
Stream<String> bannedBtcNodes = Stream.of(bannedOnionAddress + ":" + 1234);
List<BtcNodes.BtcNode> selectedNodes = FederatedBtcNodeProvider
.getNodes(mutableHardcodedList, filterProvidedBtcNodes, bannedBtcNodes);
.getNodes(hardcodedNodes.stream(), filterProvidedBtcNodes, bannedBtcNodes);
assertIterableEquals(hardcodedNodes, selectedNodes);
}