prepare for synchronize with main

This commit is contained in:
Jürg Schulthess 2024-11-09 19:33:32 +01:00
parent df798fc486
commit a64d64e98f
2 changed files with 124 additions and 20 deletions

28
pom.xml
View File

@ -3,11 +3,12 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>org.qortal</groupId> <groupId>org.qortal</groupId>
<artifactId>qortal</artifactId> <artifactId>qortal</artifactId>
<version>4.5.2</version> <version>4.6.1</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<skipTests>true</skipTests> <skipTests>true</skipTests>
<altcoinj.version>7dc8c6f</altcoinj.version> <altcoinj.version>7dc8c6f</altcoinj.version>
<bitcoinj.version>0.15.10</bitcoinj.version> <bitcoinj.version>0.15.10</bitcoinj.version>
<bouncycastle.version>1.70</bouncycastle.version> <bouncycastle.version>1.70</bouncycastle.version>
@ -15,26 +16,26 @@
<ciyam-at.version>1.4.2</ciyam-at.version> <ciyam-at.version>1.4.2</ciyam-at.version>
<commons-net.version>3.8.0</commons-net.version> <commons-net.version>3.8.0</commons-net.version>
<commons-text.version>1.12.0</commons-text.version> <commons-text.version>1.12.0</commons-text.version>
<commons-io.version>2.16.1</commons-io.version> <commons-io.version>2.17.0</commons-io.version>
<commons-compress.version>1.26.2</commons-compress.version> <commons-compress.version>1.27.1</commons-compress.version>
<commons-lang3.version>3.14.0</commons-lang3.version> <commons-lang3.version>3.17.0</commons-lang3.version>
<dagger.version>1.2.2</dagger.version> <dagger.version>1.2.2</dagger.version>
<extendedset.version>0.12.3</extendedset.version> <extendedset.version>0.12.3</extendedset.version>
<git-commit-id-plugin.version>4.9.10</git-commit-id-plugin.version> <git-commit-id-plugin.version>4.9.10</git-commit-id-plugin.version>
<grpc.version>1.65.0</grpc.version> <grpc.version>1.68.1</grpc.version>
<guava.version>33.2.1-jre</guava.version> <guava.version>33.3.1-jre</guava.version>
<hamcrest-library.version>2.2</hamcrest-library.version> <hamcrest-library.version>2.2</hamcrest-library.version>
<homoglyph.version>1.2.1</homoglyph.version> <homoglyph.version>1.2.1</homoglyph.version>
<hsqldb.version>2.5.1</hsqldb.version> <hsqldb.version>2.5.1</hsqldb.version>
<icu4j.version>75.1</icu4j.version> <icu4j.version>76.1</icu4j.version>
<java-diff-utils.version>4.12</java-diff-utils.version> <java-diff-utils.version>4.12</java-diff-utils.version>
<javax.servlet-api.version>4.0.1</javax.servlet-api.version> <javax.servlet-api.version>4.0.1</javax.servlet-api.version>
<jaxb-runtime.version>2.3.9</jaxb-runtime.version> <jaxb-runtime.version>2.3.9</jaxb-runtime.version>
<jersey.version>2.42</jersey.version> <jersey.version>2.42</jersey.version>
<jetty.version>9.4.54.v20240208</jetty.version> <jetty.version>9.4.56.v20240826</jetty.version>
<json-simple.version>1.1.1</json-simple.version> <json-simple.version>1.1.1</json-simple.version>
<json.version>20240303</json.version> <json.version>20240303</json.version>
<jsoup.version>1.17.2</jsoup.version> <jsoup.version>1.18.1</jsoup.version>
<junit-jupiter-engine.version>5.11.0-M2</junit-jupiter-engine.version> <junit-jupiter-engine.version>5.11.0-M2</junit-jupiter-engine.version>
<lifecycle-mapping.version>1.0.0</lifecycle-mapping.version> <lifecycle-mapping.version>1.0.0</lifecycle-mapping.version>
<log4j.version>2.23.1</log4j.version> <log4j.version>2.23.1</log4j.version>
@ -44,19 +45,18 @@
<maven-dependency-plugin.version>3.6.1</maven-dependency-plugin.version> <maven-dependency-plugin.version>3.6.1</maven-dependency-plugin.version>
<maven-jar-plugin.version>3.4.2</maven-jar-plugin.version> <maven-jar-plugin.version>3.4.2</maven-jar-plugin.version>
<maven-package-info-plugin.version>1.1.0</maven-package-info-plugin.version> <maven-package-info-plugin.version>1.1.0</maven-package-info-plugin.version>
<!--<maven-plugin.version>2.16.2</maven-plugin.version>--> <maven-plugin.version>2.17.1</maven-plugin.version>
<maven-plugin.version>3.12.1</maven-plugin.version> <maven-reproducible-build-plugin.version>0.17</maven-reproducible-build-plugin.version>
<maven-reproducible-build-plugin.version>0.16</maven-reproducible-build-plugin.version>
<maven-resources-plugin.version>3.3.1</maven-resources-plugin.version> <maven-resources-plugin.version>3.3.1</maven-resources-plugin.version>
<maven-shade-plugin.version>3.6.0</maven-shade-plugin.version> <maven-shade-plugin.version>3.6.0</maven-shade-plugin.version>
<maven-surefire-plugin.version>3.3.0</maven-surefire-plugin.version> <maven-surefire-plugin.version>3.5.2</maven-surefire-plugin.version>
<protobuf.version>3.25.3</protobuf.version> <protobuf.version>3.25.3</protobuf.version>
<replacer.version>1.5.3</replacer.version> <replacer.version>1.5.3</replacer.version>
<simplemagic.version>1.17</simplemagic.version> <simplemagic.version>1.17</simplemagic.version>
<swagger-api.version>2.0.10</swagger-api.version> <swagger-api.version>2.0.10</swagger-api.version>
<swagger-ui.version>5.17.14</swagger-ui.version> <swagger-ui.version>5.17.14</swagger-ui.version>
<upnp.version>1.2</upnp.version> <upnp.version>1.2</upnp.version>
<xz.version>1.9</xz.version> <xz.version>1.10</xz.version>
<lombok.version>1.18.30</lombok.version> <lombok.version>1.18.30</lombok.version>
<jackson.version>2.16.1</jackson.version> <jackson.version>2.16.1</jackson.version>
<slf4j.version>2.0.12</slf4j.version> <slf4j.version>2.0.12</slf4j.version>

View File

@ -13,6 +13,7 @@ import org.qortal.block.Block;
import org.qortal.block.BlockChain; import org.qortal.block.BlockChain;
import org.qortal.block.BlockChain.BlockTimingByHeight; import org.qortal.block.BlockChain.BlockTimingByHeight;
import org.qortal.controller.arbitrary.*; import org.qortal.controller.arbitrary.*;
import org.qortal.controller.hsqldb.HSQLDBDataCacheManager;
import org.qortal.controller.repository.NamesDatabaseIntegrityCheck; import org.qortal.controller.repository.NamesDatabaseIntegrityCheck;
import org.qortal.controller.repository.PruneManager; import org.qortal.controller.repository.PruneManager;
import org.qortal.controller.tradebot.TradeBot; import org.qortal.controller.tradebot.TradeBot;
@ -33,8 +34,10 @@ import org.qortal.gui.SysTray;
import org.qortal.network.Network; import org.qortal.network.Network;
import org.qortal.network.RNSNetwork; import org.qortal.network.RNSNetwork;
import org.qortal.network.Peer; import org.qortal.network.Peer;
import org.qortal.network.PeerAddress;
import org.qortal.network.message.*; import org.qortal.network.message.*;
import org.qortal.repository.*; import org.qortal.repository.*;
import org.qortal.repository.hsqldb.HSQLDBRepository;
import org.qortal.repository.hsqldb.HSQLDBRepositoryFactory; import org.qortal.repository.hsqldb.HSQLDBRepositoryFactory;
import org.qortal.settings.Settings; import org.qortal.settings.Settings;
import org.qortal.transaction.Transaction; import org.qortal.transaction.Transaction;
@ -49,8 +52,11 @@ import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths; import java.nio.file.Paths;
import java.security.SecureRandom;
import java.security.Security; import java.security.Security;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneOffset; import java.time.ZoneOffset;
@ -96,7 +102,7 @@ public class Controller extends Thread {
private final long buildTimestamp; // seconds private final long buildTimestamp; // seconds
private final String[] savedArgs; private final String[] savedArgs;
private ExecutorService callbackExecutor = Executors.newFixedThreadPool(3); private ExecutorService callbackExecutor = Executors.newFixedThreadPool(4);
private volatile boolean notifyGroupMembershipChange = false; private volatile boolean notifyGroupMembershipChange = false;
/** Latest blocks on our chain. Note: tail/last is the latest block. */ /** Latest blocks on our chain. Note: tail/last is the latest block. */
@ -404,8 +410,17 @@ public class Controller extends Thread {
RepositoryManager.setRequestedCheckpoint(Boolean.TRUE); RepositoryManager.setRequestedCheckpoint(Boolean.TRUE);
try (final Repository repository = RepositoryManager.getRepository()) { try (final Repository repository = RepositoryManager.getRepository()) {
RepositoryManager.rebuildTransactionSequences(repository); // RepositoryManager.rebuildTransactionSequences(repository);
ArbitraryDataCacheManager.getInstance().buildArbitraryResourcesCache(repository, false); ArbitraryDataCacheManager.getInstance().buildArbitraryResourcesCache(repository, false);
if( Settings.getInstance().isDbCacheEnabled() ) {
LOGGER.info("Db Cache Starting ...");
HSQLDBDataCacheManager hsqldbDataCacheManager = new HSQLDBDataCacheManager((HSQLDBRepository) repositoryFactory.getRepository());
hsqldbDataCacheManager.start();
}
else {
LOGGER.info("Db Cache Disabled");
}
} }
} catch (DataException e) { } catch (DataException e) {
// If exception has no cause or message then repository is in use by some other process. // If exception has no cause or message then repository is in use by some other process.
@ -496,7 +511,6 @@ public class Controller extends Thread {
@Override @Override
public void run() { public void run() {
Thread.currentThread().setName("Shutdown hook"); Thread.currentThread().setName("Shutdown hook");
Controller.getInstance().shutdown(); Controller.getInstance().shutdown();
} }
}); });
@ -576,10 +590,33 @@ public class Controller extends Thread {
// If GUI is enabled, we're no longer starting up but actually running now // If GUI is enabled, we're no longer starting up but actually running now
Gui.getInstance().notifyRunning(); Gui.getInstance().notifyRunning();
// Check every 10 minutes to see if the block minter is running if (Settings.getInstance().isAutoRestartEnabled()) {
Timer timer = new Timer(); // Check every 10 minutes if we have enough connected peers
Timer checkConnectedPeers = new Timer();
timer.schedule(new TimerTask() { checkConnectedPeers.schedule(new TimerTask() {
@Override
public void run() {
// Get the connected peers
int myConnectedPeers = Network.getInstance().getImmutableHandshakedPeers().size();
LOGGER.debug("Node have {} connected peers", myConnectedPeers);
if (myConnectedPeers == 0) {
// Restart node if we have 0 peers
LOGGER.info("Node have no connected peers, restarting node");
try {
RestartNode.attemptToRestart();
} catch (Exception e) {
LOGGER.error("Unable to restart the node", e);
}
}
}
}, 10*60*1000, 10*60*1000);
}
// Check every 10 minutes to see if the block minter is running
Timer checkBlockMinter = new Timer();
checkBlockMinter.schedule(new TimerTask() {
@Override @Override
public void run() { public void run() {
if (blockMinter.isAlive()) { if (blockMinter.isAlive()) {
@ -603,6 +640,73 @@ public class Controller extends Thread {
} }
} }
}, 10*60*1000, 10*60*1000); }, 10*60*1000, 10*60*1000);
// Check if we need sync from genesis and start syncing
Timer syncFromGenesis = new Timer();
syncFromGenesis.schedule(new TimerTask() {
@Override
public void run() {
LOGGER.debug("Start sync from genesis check.");
boolean canBootstrap = Settings.getInstance().getBootstrap();
boolean needsArchiveRebuild = false;
int checkHeight = 0;
Repository repository = null;
try {
repository = RepositoryManager.getRepository();
needsArchiveRebuild = (repository.getBlockArchiveRepository().fromHeight(2) == null);
checkHeight = repository.getBlockRepository().getBlockchainHeight();
} catch (DataException e) {
throw new RuntimeException(e);
}
if (canBootstrap || !needsArchiveRebuild || checkHeight > 3) {
LOGGER.debug("Bootstrapping is enabled or we have more than 2 blocks, cancel sync from genesis check.");
syncFromGenesis.cancel();
return;
}
if (needsArchiveRebuild && !canBootstrap) {
LOGGER.info("Start syncing from genesis!");
List<Peer> seeds = new ArrayList<>(Network.getInstance().getImmutableHandshakedPeers());
// Check if have a qualified peer to sync
if (seeds.isEmpty()) {
LOGGER.info("No connected peers, will try again later.");
return;
}
int index = new SecureRandom().nextInt(seeds.size());
String syncNode = String.valueOf(seeds.get(index));
PeerAddress peerAddress = PeerAddress.fromString(syncNode);
InetSocketAddress resolvedAddress = null;
try {
resolvedAddress = peerAddress.toSocketAddress();
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
InetSocketAddress finalResolvedAddress = resolvedAddress;
Peer targetPeer = seeds.stream().filter(peer -> peer.getResolvedAddress().equals(finalResolvedAddress)).findFirst().orElse(null);
Synchronizer.SynchronizationResult syncResult;
try {
do {
try {
syncResult = Synchronizer.getInstance().actuallySynchronize(targetPeer, true);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
while (syncResult == Synchronizer.SynchronizationResult.OK);
} finally {
// We are syncing now, so can cancel the check
syncFromGenesis.cancel();
}
}
}
}, 3*60*1000, 3*60*1000);
} }
/** Called by AdvancedInstaller's launch EXE in single-instance mode, when an instance is already running. */ /** Called by AdvancedInstaller's launch EXE in single-instance mode, when an instance is already running. */