Merge branch 'networking' into v2.0-beta

# Conflicts:
#	src/main/java/org/qortal/settings/Settings.java
This commit is contained in:
CalDescent 2021-10-07 18:53:49 +01:00
commit 33b715eb4e
2 changed files with 52 additions and 8 deletions

View File

@ -155,9 +155,23 @@ public class Network {
} }
// Load all known peers from repository // Load all known peers from repository
try (Repository repository = RepositoryManager.getRepository()) { synchronized (this.allKnownPeers) { List<String> fixedNetwork = Settings.getInstance().getFixedNetwork();
synchronized (this.allKnownPeers) { if (fixedNetwork != null && !fixedNetwork.isEmpty()) {
this.allKnownPeers.addAll(repository.getNetworkRepository().getAllPeers()); Long addedWhen = NTP.getTime();
String addedBy = "fixedNetwork";
List<PeerAddress> peerAddresses = new ArrayList<>();
for (String address : fixedNetwork) {
PeerAddress peerAddress = PeerAddress.fromString(address);
peerAddresses.add(peerAddress);
}
List<PeerData> peers = peerAddresses.stream()
.map(peerAddress -> new PeerData(peerAddress, addedWhen, addedBy))
.collect(Collectors.toList());
this.allKnownPeers.addAll(peers);
} else {
try (Repository repository = RepositoryManager.getRepository()) {
this.allKnownPeers.addAll(repository.getNetworkRepository().getAllPeers());
}
} }
} }
@ -513,14 +527,24 @@ public class Network {
if (socketChannel == null) { if (socketChannel == null) {
return; return;
} }
PeerAddress address = PeerAddress.fromSocket(socketChannel.socket());
List<String> fixedNetwork = Settings.getInstance().getFixedNetwork();
if (fixedNetwork != null && !fixedNetwork.isEmpty() && ipNotInFixedList(address, fixedNetwork)) {
try {
LOGGER.debug("Connection discarded from peer {} as not in the fixed network list", address);
socketChannel.close();
} catch (IOException e) {
// IGNORE
}
return;
}
final Long now = NTP.getTime(); final Long now = NTP.getTime();
Peer newPeer; Peer newPeer;
try { try {
if (now == null) { if (now == null) {
LOGGER.debug("Connection discarded from peer {} due to lack of NTP sync", LOGGER.debug("Connection discarded from peer {} due to lack of NTP sync", address);
PeerAddress.fromSocket(socketChannel.socket()));
socketChannel.close(); socketChannel.close();
return; return;
} }
@ -528,12 +552,12 @@ public class Network {
synchronized (this.connectedPeers) { synchronized (this.connectedPeers) {
if (connectedPeers.size() >= maxPeers) { if (connectedPeers.size() >= maxPeers) {
// We have enough peers // We have enough peers
LOGGER.debug("Connection discarded from peer {}", PeerAddress.fromSocket(socketChannel.socket())); LOGGER.debug("Connection discarded from peer {} because the server is full", address);
socketChannel.close(); socketChannel.close();
return; return;
} }
LOGGER.debug("Connection accepted from peer {}", PeerAddress.fromSocket(socketChannel.socket())); LOGGER.debug("Connection accepted from peer {}", address);
newPeer = new Peer(socketChannel, channelSelector); newPeer = new Peer(socketChannel, channelSelector);
this.connectedPeers.add(newPeer); this.connectedPeers.add(newPeer);
@ -541,6 +565,7 @@ public class Network {
} catch (IOException e) { } catch (IOException e) {
if (socketChannel.isOpen()) { if (socketChannel.isOpen()) {
try { try {
LOGGER.debug("Connection failed from peer {} while connecting/closing", address);
socketChannel.close(); socketChannel.close();
} catch (IOException ce) { } catch (IOException ce) {
// Couldn't close? // Couldn't close?
@ -552,6 +577,16 @@ public class Network {
this.onPeerReady(newPeer); this.onPeerReady(newPeer);
} }
private boolean ipNotInFixedList(PeerAddress address, List<String> fixedNetwork) {
for (String ipAddress : fixedNetwork) {
String[] bits = ipAddress.split(":");
if (bits.length >= 1 && bits.length <= 2 && address.getHost().equals(bits[0])) {
return false;
}
}
return true;
}
private Peer getConnectablePeer(final Long now) throws InterruptedException { private Peer getConnectablePeer(final Long now) throws InterruptedException {
// We can't block here so use tryRepository(). We don't NEED to connect a new peer. // We can't block here so use tryRepository(). We don't NEED to connect a new peer.
try (Repository repository = RepositoryManager.tryRepository()) { try (Repository repository = RepositoryManager.tryRepository()) {
@ -1145,6 +1180,10 @@ public class Network {
private boolean mergePeers(Repository repository, String addedBy, long addedWhen, List<PeerAddress> peerAddresses) private boolean mergePeers(Repository repository, String addedBy, long addedWhen, List<PeerAddress> peerAddresses)
throws DataException { throws DataException {
List<String> fixedNetwork = Settings.getInstance().getFixedNetwork();
if (fixedNetwork != null && !fixedNetwork.isEmpty()) {
return false;
}
List<PeerData> newPeers; List<PeerData> newPeers;
synchronized (this.allKnownPeers) { synchronized (this.allKnownPeers) {
for (PeerData knownPeerData : this.allKnownPeers) { for (PeerData knownPeerData : this.allKnownPeers) {

View File

@ -5,6 +5,7 @@ import java.io.FileNotFoundException;
import java.io.FileReader; import java.io.FileReader;
import java.io.IOException; import java.io.IOException;
import java.io.Reader; import java.io.Reader;
import java.util.List;
import java.util.Locale; import java.util.Locale;
import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBContext;
@ -193,6 +194,7 @@ public class Settings {
private String repositoryPath = "db"; private String repositoryPath = "db";
/** Repository connection pool size. Needs to be a bit bigger than maxNetworkThreadPoolSize */ /** Repository connection pool size. Needs to be a bit bigger than maxNetworkThreadPoolSize */
private int repositoryConnectionPoolSize = 100; private int repositoryConnectionPoolSize = 100;
private List<String> fixedNetwork;
// Export/import // Export/import
private String exportPath = "qortal-backup"; private String exportPath = "qortal-backup";
@ -584,6 +586,10 @@ public class Settings {
return this.showCheckpointNotification; return this.showCheckpointNotification;
} }
public List<String> getFixedNetwork() {
return fixedNetwork;
}
public long getAtStatesMaxLifetime() { public long getAtStatesMaxLifetime() {
return this.atStatesMaxLifetime; return this.atStatesMaxLifetime;
} }
@ -608,7 +614,6 @@ public class Settings {
return this.onlineSignaturesTrimBatchSize; return this.onlineSignaturesTrimBatchSize;
} }
public boolean isTopOnly() { public boolean isTopOnly() {
return this.topOnly; return this.topOnly;
} }