diff --git a/src/main/java/org/qortal/controller/OnlineAccountsManager.java b/src/main/java/org/qortal/controller/OnlineAccountsManager.java index d37b2aef..97af8627 100644 --- a/src/main/java/org/qortal/controller/OnlineAccountsManager.java +++ b/src/main/java/org/qortal/controller/OnlineAccountsManager.java @@ -80,7 +80,7 @@ public class OnlineAccountsManager { // one for the transition period. private static long[] POW_VERIFY_WORK_BUFFER = new long[getPoWBufferSize() / 8]; - private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(4, new NamedThreadFactory("OnlineAccounts")); + private final ScheduledExecutorService executor = Executors.newScheduledThreadPool(4, new NamedThreadFactory("OnlineAccounts", Thread.NORM_PRIORITY)); private volatile boolean isStopping = false; private final Set onlineAccountsImportQueue = ConcurrentHashMap.newKeySet(); diff --git a/src/main/java/org/qortal/controller/Synchronizer.java b/src/main/java/org/qortal/controller/Synchronizer.java index 306784f5..400e7965 100644 --- a/src/main/java/org/qortal/controller/Synchronizer.java +++ b/src/main/java/org/qortal/controller/Synchronizer.java @@ -118,8 +118,12 @@ public class Synchronizer extends Thread { } public static Synchronizer getInstance() { - if (instance == null) + if (instance == null) { instance = new Synchronizer(); + instance.setPriority(Settings.getInstance().getSynchronizerThreadPriority()); + + LOGGER.info("thread priority = " + instance.getPriority()); + } return instance; } diff --git a/src/main/java/org/qortal/controller/repository/PruneManager.java b/src/main/java/org/qortal/controller/repository/PruneManager.java index d48f85f7..8865668b 100644 --- a/src/main/java/org/qortal/controller/repository/PruneManager.java +++ b/src/main/java/org/qortal/controller/repository/PruneManager.java @@ -40,7 +40,7 @@ public class PruneManager { } public void start() { - this.executorService = Executors.newCachedThreadPool(new DaemonThreadFactory()); + this.executorService = Executors.newCachedThreadPool(new DaemonThreadFactory(Settings.getInstance().getPruningThreadPriority())); if (Settings.getInstance().isTopOnly()) { // Top-only-sync diff --git a/src/main/java/org/qortal/network/Handshake.java b/src/main/java/org/qortal/network/Handshake.java index 782ca2b7..081e79e6 100644 --- a/src/main/java/org/qortal/network/Handshake.java +++ b/src/main/java/org/qortal/network/Handshake.java @@ -269,7 +269,7 @@ public enum Handshake { private static final int POW_DIFFICULTY_POST_131 = 2; // leading zero bits - private static final ExecutorService responseExecutor = Executors.newFixedThreadPool(Settings.getInstance().getNetworkPoWComputePoolSize(), new DaemonThreadFactory("Network-PoW")); + private static final ExecutorService responseExecutor = Executors.newFixedThreadPool(Settings.getInstance().getNetworkPoWComputePoolSize(), new DaemonThreadFactory("Network-PoW", Settings.getInstance().getHandshakeThreadPriority())); private static final byte[] ZERO_CHALLENGE = new byte[ChallengeMessage.CHALLENGE_LENGTH]; diff --git a/src/main/java/org/qortal/network/Network.java b/src/main/java/org/qortal/network/Network.java index 0e5885ad..263e7134 100644 --- a/src/main/java/org/qortal/network/Network.java +++ b/src/main/java/org/qortal/network/Network.java @@ -168,7 +168,7 @@ public class Network { Settings.getInstance().getMaxNetworkThreadPoolSize(), NETWORK_EPC_KEEPALIVE, TimeUnit.SECONDS, new SynchronousQueue(), - new NamedThreadFactory("Network-EPC")); + new NamedThreadFactory("Network-EPC", Settings.getInstance().getNetworkThreadPriority())); networkEPC = new NetworkProcessor(networkExecutor); } diff --git a/src/main/java/org/qortal/repository/BlockArchiveWriter.java b/src/main/java/org/qortal/repository/BlockArchiveWriter.java index e47aabbd..7ff9d8b9 100644 --- a/src/main/java/org/qortal/repository/BlockArchiveWriter.java +++ b/src/main/java/org/qortal/repository/BlockArchiveWriter.java @@ -156,10 +156,9 @@ public class BlockArchiveWriter { if (Controller.isStopping()) { return BlockArchiveWriteResult.STOPPING; } - if (Synchronizer.getInstance().isSynchronizing()) { - Thread.sleep(1000L); - continue; - } + + // pause, since this can be a long process and other processes need to execute + Thread.sleep(Settings.getInstance().getArchivingPause()); int currentHeight = startHeight + i; if (currentHeight > endHeight) { diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index ff8e1d71..d51ddb40 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -398,6 +398,47 @@ public class Settings { */ private int dbCacheFrequency = 120; + /** + * Network Thread Priority + * + * The Network Thread Priority + * + * 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; + + /** + * 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; + + /** + * 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; + + /** + * Sychronizer Thread Priority + * + * The thread priority (1 is lowest, 10 is highest) of the threads used for synchronizing with the others peers. + */ + private int synchronizerThreadPriority = 10; + + /** + * Archiving Pause + * + * In milliseconds + * + * The pause in between archiving blocks to allow other processes to execute. + */ + private long archivingPause = 3000; + // Domain mapping public static class ThreadLimit { private String messageType; @@ -1163,4 +1204,24 @@ public class Settings { public int getDbCacheFrequency() { return dbCacheFrequency; } + + public int getNetworkThreadPriority() { + return networkThreadPriority; + } + + public int getHandshakeThreadPriority() { + return handshakeThreadPriority; + } + + public int getPruningThreadPriority() { + return pruningThreadPriority; + } + + public int getSynchronizerThreadPriority() { + return synchronizerThreadPriority; + } + + public long getArchivingPause() { + return archivingPause; + } } diff --git a/src/main/java/org/qortal/utils/DaemonThreadFactory.java b/src/main/java/org/qortal/utils/DaemonThreadFactory.java index 9a73bd1d..e07fe28c 100644 --- a/src/main/java/org/qortal/utils/DaemonThreadFactory.java +++ b/src/main/java/org/qortal/utils/DaemonThreadFactory.java @@ -8,19 +8,22 @@ public class DaemonThreadFactory implements ThreadFactory { private final String name; private final AtomicInteger threadNumber = new AtomicInteger(1); + private int priority = Thread.NORM_PRIORITY; - public DaemonThreadFactory(String name) { + public DaemonThreadFactory(String name, int priority) { this.name = name; + this.priority = priority; } - public DaemonThreadFactory() { - this(null); + public DaemonThreadFactory(int priority) { + this(null, priority);; } @Override public Thread newThread(Runnable runnable) { Thread thread = Executors.defaultThreadFactory().newThread(runnable); thread.setDaemon(true); + thread.setPriority(this.priority); if (this.name != null) thread.setName(this.name + "-" + this.threadNumber.getAndIncrement()); diff --git a/src/main/java/org/qortal/utils/NamedThreadFactory.java b/src/main/java/org/qortal/utils/NamedThreadFactory.java index 6834c3b8..290cc00d 100644 --- a/src/main/java/org/qortal/utils/NamedThreadFactory.java +++ b/src/main/java/org/qortal/utils/NamedThreadFactory.java @@ -8,15 +8,18 @@ public class NamedThreadFactory implements ThreadFactory { private final String name; private final AtomicInteger threadNumber = new AtomicInteger(1); + private final int priority; - public NamedThreadFactory(String name) { + public NamedThreadFactory(String name, int priority) { this.name = name; + this.priority = priority; } @Override public Thread newThread(Runnable runnable) { Thread thread = Executors.defaultThreadFactory().newThread(runnable); thread.setName(this.name + "-" + this.threadNumber.getAndIncrement()); + thread.setPriority(this.priority); return thread; }