Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PR for combined changes from kenny+alpha+crowetic for release candidate #211

Merged
merged 7 commits into from
Nov 8, 2024
1 change: 0 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,4 +43,3 @@ https://qortal.dev - secondary and development focused website with links to man
https://wiki.qortal.org - community built and managed wiki with detailed information regarding the project

links to telegram and discord communities are at the top of https://qortal.org as well.

19 changes: 13 additions & 6 deletions src/main/java/org/qortal/ApplyRestart.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public class ApplyRestart {
private static final String JAVA_TOOL_OPTIONS_NAME = "JAVA_TOOL_OPTIONS";
private static final String JAVA_TOOL_OPTIONS_VALUE = "";

private static final long CHECK_INTERVAL = 10 * 1000L; // ms
private static final long CHECK_INTERVAL = 30 * 1000L; // ms
private static final int MAX_ATTEMPTS = 12;

public static void main(String[] args) {
Expand All @@ -56,27 +56,27 @@ public static void main(String[] args) {
else
Settings.getInstance();

LOGGER.info("Applying restart...");
LOGGER.info("Applying restart this can take up to 5 minutes...");

// Shutdown node using API
if (!shutdownNode())
return;

try {
// Give some time for shutdown
TimeUnit.SECONDS.sleep(30);
TimeUnit.SECONDS.sleep(60);

// Remove blockchain lock if exist
ReentrantLock blockchainLock = Controller.getInstance().getBlockchainLock();
if (blockchainLock.isLocked())
blockchainLock.unlock();

// Remove blockchain lock file if exist
// Remove blockchain lock file if still exist
TimeUnit.SECONDS.sleep(60);
deleteLock();

// Restart node
TimeUnit.SECONDS.sleep(30);
TimeUnit.SECONDS.sleep(15);
restartNode(args);

LOGGER.info("Restarting...");
Expand Down Expand Up @@ -117,10 +117,17 @@ private static boolean shutdownNode() {
String response = ApiRequest.perform(baseUri + "admin/stop", params);
if (response == null) {
// No response - consider node shut down
try {
TimeUnit.SECONDS.sleep(30);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

if (apiKeyNewlyGenerated) {
// API key was newly generated for restarting node, so we need to remove it
ApplyRestart.removeGeneratedApiKey();
}

return true;
}

Expand Down Expand Up @@ -171,7 +178,7 @@ private static void deleteLock() {
LOGGER.debug("Lockfile is: {}", lockFile);
FileUtils.forceDelete(FileUtils.getFile(lockFile));
} catch (IOException e) {
LOGGER.error("Error deleting blockchain lock file: {}", e.getMessage());
LOGGER.debug("Error deleting blockchain lock file: {}", e.getMessage());
}
}

Expand Down
38 changes: 20 additions & 18 deletions src/main/java/org/qortal/controller/Controller.java
Original file line number Diff line number Diff line change
Expand Up @@ -579,26 +579,28 @@ public void run() {
// If GUI is enabled, we're no longer starting up but actually running now
Gui.getInstance().notifyRunning();

// Check every 10 minutes if we have enough connected peers
Timer checkConnectedPeers = new Timer();

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);
if (Settings.getInstance().isAutoRestartEnabled()) {
// Check every 10 minutes if we have enough connected peers
Timer checkConnectedPeers = new Timer();

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);
}, 10*60*1000, 10*60*1000);
}

// Check every 10 minutes to see if the block minter is running
Timer checkBlockMinter = new Timer();
Expand Down
10 changes: 5 additions & 5 deletions src/main/java/org/qortal/repository/hsqldb/HSQLDBCacheUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.SQLNonTransientConnectionException;
import java.sql.Statement;
import java.time.format.DateTimeFormatter;
import java.util.AbstractMap;
Expand Down Expand Up @@ -355,9 +356,7 @@ private static boolean passQuery(Predicate<String> predicate, ArbitraryResourceD
*
* @return the data cache
*/
public static ArbitraryResourceCache startCaching(int priorityRequested, int frequency, HSQLDBRepository respository) {

final ArbitraryResourceCache cache = ArbitraryResourceCache.getInstance();
public static void startCaching(int priorityRequested, int frequency, HSQLDBRepository respository) {

// ensure priority is in between 1-10
final int priority = Math.max(0, Math.min(10, priorityRequested));
Expand Down Expand Up @@ -388,8 +387,6 @@ public void run() {

// delay 1 second
timer.scheduleAtFixedRate(task, 1000, frequency * 1000);

return cache;
}

/**
Expand Down Expand Up @@ -418,6 +415,9 @@ public static void fillCache(ArbitraryResourceCache cache, HSQLDBRepository repo

fillNamepMap(cache.getLevelByName(), repository);
}
catch (SQLNonTransientConnectionException e ) {
LOGGER.warn("Connection problems. Retry later.");
}
catch (Exception e) {
LOGGER.error(e.getMessage(), e);
}
Expand Down
12 changes: 9 additions & 3 deletions src/main/java/org/qortal/settings/Settings.java
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,8 @@ public class Settings {

/** Whether we check, fetch and install auto-updates */
private boolean autoUpdateEnabled = true;
/** Whether we check, restart node without connected peers */
private boolean autoRestartEnabled = false;
/** How long between repository backups (ms), or 0 if disabled. */
private long repositoryBackupInterval = 0; // ms
/** Whether to show a notification when we backup repository. */
Expand Down Expand Up @@ -406,22 +408,22 @@ public class Settings {
* The thread priority (1 is lowest, 10 is highest) of the threads used for network peer connections. This is the
* main thread connecting to a peer in the network.
*/
private int networkThreadPriority = 5;
private int networkThreadPriority = 7;

/**
* The Handshake Thread Priority
*
* The thread priority (1 i slowest, 10 is highest) of the threads used for peer handshake messaging. This is a
* secondary thread to exchange status messaging to a peer in the network.
*/
private int handshakeThreadPriority = 5;
private int handshakeThreadPriority = 7;

/**
* Pruning Thread Priority
*
* The thread priority (1 is lowest, 10 is highest) of the threads used for database pruning and trimming.
*/
private int pruningThreadPriority = 1;
private int pruningThreadPriority = 2;

/**
* Sychronizer Thread Priority
Expand Down Expand Up @@ -973,6 +975,10 @@ public boolean isAutoUpdateEnabled() {
return this.autoUpdateEnabled;
}

public boolean isAutoRestartEnabled() {
return this.autoRestartEnabled;
}

public String[] getAutoUpdateRepos() {
return this.autoUpdateRepos;
}
Expand Down
Loading