From b7e9af100ace24d33fe18b341522ee962ca410d0 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Wed, 6 Oct 2021 08:52:27 +0100 Subject: [PATCH] Added scheduled repository maintenance feature. Currently disabled by default. --- .../org/qortal/controller/Controller.java | 24 +++++++++++++++++++ .../java/org/qortal/settings/Settings.java | 12 ++++++++++ src/main/resources/i18n/SysTray_en.properties | 6 ++++- src/main/resources/i18n/SysTray_fi.properties | 6 ++++- src/main/resources/i18n/SysTray_hu.properties | 6 ++++- src/main/resources/i18n/SysTray_it.properties | 6 ++++- src/main/resources/i18n/SysTray_nl.properties | 4 +++- src/main/resources/i18n/SysTray_ru.properties | 6 ++++- .../resources/i18n/SysTray_zh_CN.properties | 4 +++- 9 files changed, 67 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index c3ccde35..8043ea07 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -155,6 +155,7 @@ public class Controller extends Thread { }; private long repositoryBackupTimestamp = startTime; // ms + private long repositoryMaintenanceTimestamp = startTime; // ms private long repositoryCheckpointTimestamp = startTime; // ms private long ntpCheckTimestamp = startTime; // ms private long deleteExpiredTimestamp = startTime + DELETE_EXPIRED_INTERVAL; // ms @@ -524,6 +525,7 @@ public class Controller extends Thread { Thread.currentThread().setName("Controller"); final long repositoryBackupInterval = Settings.getInstance().getRepositoryBackupInterval(); + final long repositoryMaintenanceInterval = Settings.getInstance().getRepositoryMaintenanceInterval(); final long repositoryCheckpointInterval = Settings.getInstance().getRepositoryCheckpointInterval(); // Start executor service for trimming or pruning @@ -595,6 +597,28 @@ public class Controller extends Thread { } } + // Give repository a chance to perform maintenance (if enabled) + if (repositoryMaintenanceInterval > 0 && now >= repositoryMaintenanceTimestamp + repositoryMaintenanceInterval) { + repositoryMaintenanceTimestamp = now + repositoryMaintenanceInterval; + + if (Settings.getInstance().getShowMaintenanceNotification()) + SysTray.getInstance().showMessage(Translator.INSTANCE.translate("SysTray", "DB_MAINTENANCE"), + Translator.INSTANCE.translate("SysTray", "PERFORMING_DB_MAINTENANCE"), + MessageType.INFO); + + LOGGER.info("Starting scheduled repository maintenance. This can take a while..."); + try (final Repository repository = RepositoryManager.getRepository()) { + + // Timeout if the database isn't ready for maintenance after 60 seconds + long timeout = 60 * 1000L; + repository.performPeriodicMaintenance(timeout); + + LOGGER.info("Scheduled repository maintenance completed"); + } catch (DataException | TimeoutException e) { + LOGGER.error("Scheduled repository maintenance failed", e); + } + } + // Prune stuck/slow/old peers try { Network.getInstance().prunePeers(); diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index 3d39211a..30f2cd23 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -89,6 +89,10 @@ public class Settings { private long repositoryBackupInterval = 0; // ms /** Whether to show a notification when we backup repository. */ private boolean showBackupNotification = false; + /** How long between repository maintenance attempts (ms), or 0 if disabled. */ + private long repositoryMaintenanceInterval = 0; // ms + /** Whether to show a notification when we run scheduled maintenance. */ + private boolean showMaintenanceNotification = false; /** How long between repository checkpoints (ms). */ private long repositoryCheckpointInterval = 60 * 60 * 1000L; // 1 hour (ms) default /** Whether to show a notification when we perform repository 'checkpoint'. */ @@ -558,6 +562,14 @@ public class Settings { return this.showBackupNotification; } + public long getRepositoryMaintenanceInterval() { + return this.repositoryMaintenanceInterval; + } + + public boolean getShowMaintenanceNotification() { + return this.showMaintenanceNotification; + } + public long getRepositoryCheckpointInterval() { return this.repositoryCheckpointInterval; } diff --git a/src/main/resources/i18n/SysTray_en.properties b/src/main/resources/i18n/SysTray_en.properties index ddaf19ab..07541339 100644 --- a/src/main/resources/i18n/SysTray_en.properties +++ b/src/main/resources/i18n/SysTray_en.properties @@ -21,6 +21,8 @@ CREATING_BACKUP_OF_DB_FILES = Creating backup of database files... DB_BACKUP = Database Backup +DB_MAINTENANCE = Database Maintenance + DB_CHECKPOINT = Database Checkpoint EXIT = Exit @@ -33,8 +35,10 @@ OPEN_UI = Open UI PERFORMING_DB_CHECKPOINT = Saving uncommitted database changes... +PERFORMING_DB_MAINTENANCE = Performing scheduled maintenance... + SYNCHRONIZE_CLOCK = Synchronize clock SYNCHRONIZING_BLOCKCHAIN = Synchronizing -SYNCHRONIZING_CLOCK = Synchronizing clock \ No newline at end of file +SYNCHRONIZING_CLOCK = Synchronizing clock diff --git a/src/main/resources/i18n/SysTray_fi.properties b/src/main/resources/i18n/SysTray_fi.properties index 307dd80c..edd062bc 100644 --- a/src/main/resources/i18n/SysTray_fi.properties +++ b/src/main/resources/i18n/SysTray_fi.properties @@ -21,6 +21,8 @@ CREATING_BACKUP_OF_DB_FILES = Luodaan varmuuskopio tietokannan tiedostoista... DB_BACKUP = Tietokannan varmuuskopio +DB_MAINTENANCE = Database Maintenance + DB_CHECKPOINT = Tietokannan varmistuspiste EXIT = Pois @@ -33,8 +35,10 @@ OPEN_UI = Avaa UI PERFORMING_DB_CHECKPOINT = Tallentaa kommittoidut tietokantamuutokset... +PERFORMING_DB_MAINTENANCE = Performing scheduled maintenance... + SYNCHRONIZE_CLOCK = Synkronisoi kello SYNCHRONIZING_BLOCKCHAIN = Synkronisoi -SYNCHRONIZING_CLOCK = Synkronisoi kelloa \ No newline at end of file +SYNCHRONIZING_CLOCK = Synkronisoi kelloa diff --git a/src/main/resources/i18n/SysTray_hu.properties b/src/main/resources/i18n/SysTray_hu.properties index 63bec91f..be4bef25 100644 --- a/src/main/resources/i18n/SysTray_hu.properties +++ b/src/main/resources/i18n/SysTray_hu.properties @@ -23,6 +23,8 @@ CREATING_BACKUP_OF_DB_FILES = Adatbázis fájlok biztonsági mentésének létre DB_BACKUP = Adatbázis biztonsági mentése +DB_MAINTENANCE = Database Maintenance + DB_CHECKPOINT = Adatbázis-ellenőrzőpont EXIT = Kilépés @@ -35,8 +37,10 @@ OPEN_UI = Felhasználói eszköz megnyitása PERFORMING_DB_CHECKPOINT = Mentetlen adatbázis-módosítások mentése... +PERFORMING_DB_MAINTENANCE = Performing scheduled maintenance... + SYNCHRONIZE_CLOCK = Óra-szinkronizálás megkezdése SYNCHRONIZING_BLOCKCHAIN = Szinkronizálás -SYNCHRONIZING_CLOCK = Óra-szinkronizálás folyamatban \ No newline at end of file +SYNCHRONIZING_CLOCK = Óra-szinkronizálás folyamatban diff --git a/src/main/resources/i18n/SysTray_it.properties b/src/main/resources/i18n/SysTray_it.properties index a2d2dac8..326c71c2 100644 --- a/src/main/resources/i18n/SysTray_it.properties +++ b/src/main/resources/i18n/SysTray_it.properties @@ -22,6 +22,8 @@ CREATING_BACKUP_OF_DB_FILES = Creazione di backup dei file di database... DB_BACKUP = Backup del database +DB_MAINTENANCE = Database Maintenance + DB_CHECKPOINT = Punto di controllo del database EXIT = Uscita @@ -34,8 +36,10 @@ OPEN_UI = Apri UI PERFORMING_DB_CHECKPOINT = Salvataggio delle modifiche al database non salvate... +PERFORMING_DB_MAINTENANCE = Performing scheduled maintenance... + SYNCHRONIZE_CLOCK = Sincronizza orologio SYNCHRONIZING_BLOCKCHAIN = Sincronizzando -SYNCHRONIZING_CLOCK = Sincronizzando orologio \ No newline at end of file +SYNCHRONIZING_CLOCK = Sincronizzando orologio diff --git a/src/main/resources/i18n/SysTray_nl.properties b/src/main/resources/i18n/SysTray_nl.properties index 8b7c85eb..ddf1527f 100644 --- a/src/main/resources/i18n/SysTray_nl.properties +++ b/src/main/resources/i18n/SysTray_nl.properties @@ -33,8 +33,10 @@ OPEN_UI = Open UI PERFORMING_DB_CHECKPOINT = Nieuwe veranderingen aan database worden opgeslagen... +PERFORMING_DB_MAINTENANCE = Performing scheduled maintenance... + SYNCHRONIZE_CLOCK = Synchronizeer klok SYNCHRONIZING_BLOCKCHAIN = Aan het synchronizeren -SYNCHRONIZING_CLOCK = Klok wordt gesynchronizeerd \ No newline at end of file +SYNCHRONIZING_CLOCK = Klok wordt gesynchronizeerd diff --git a/src/main/resources/i18n/SysTray_ru.properties b/src/main/resources/i18n/SysTray_ru.properties index 1a719164..c124b500 100644 --- a/src/main/resources/i18n/SysTray_ru.properties +++ b/src/main/resources/i18n/SysTray_ru.properties @@ -21,6 +21,8 @@ CREATING_BACKUP_OF_DB_FILES = Создание резервной копии ф DB_BACKUP = Резервное копирование базы данных +DB_MAINTENANCE = Database Maintenance + EXIT = Выход MINTING_DISABLED = Чеканка отключена @@ -31,8 +33,10 @@ OPEN_UI = Открыть пользовательский интерфейс PERFORMING_DB_CHECKPOINT = Saving uncommitted database changes... +PERFORMING_DB_MAINTENANCE = Performing scheduled maintenance... + SYNCHRONIZE_CLOCK = Синхронизировать время SYNCHRONIZING_BLOCKCHAIN = Синхронизация цепи -SYNCHRONIZING_CLOCK = Проверка времени \ No newline at end of file +SYNCHRONIZING_CLOCK = Проверка времени diff --git a/src/main/resources/i18n/SysTray_zh_CN.properties b/src/main/resources/i18n/SysTray_zh_CN.properties index eaea452b..6d8318e2 100644 --- a/src/main/resources/i18n/SysTray_zh_CN.properties +++ b/src/main/resources/i18n/SysTray_zh_CN.properties @@ -33,8 +33,10 @@ OPEN_UI = 开启Qortal界面 PERFORMING_DB_CHECKPOINT = Saving uncommitted database changes... +PERFORMING_DB_MAINTENANCE = Performing scheduled maintenance... + SYNCHRONIZE_CLOCK = 同步时钟 SYNCHRONIZING_BLOCKCHAIN = 正在同步区块链 -SYNCHRONIZING_CLOCK = 正在同步时钟 \ No newline at end of file +SYNCHRONIZING_CLOCK = 正在同步时钟