mirror of
https://github.com/Qortal/qortal.git
synced 2025-04-29 22:37:52 +00:00
prepare for synchronize with main
This commit is contained in:
parent
df798fc486
commit
a64d64e98f
28
pom.xml
28
pom.xml
@ -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>
|
||||||
|
@ -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. */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user