From 133848ef50b7f2addff217d52bbbfb9fe669d9ba Mon Sep 17 00:00:00 2001 From: CalDescent Date: Sat, 5 Aug 2023 19:42:30 +0100 Subject: [PATCH] Speed up status rebuilding by excluding transactions that aren't hosted locally by the node. --- .../arbitrary/ArbitraryDataCacheManager.java | 48 +++++++++++++++++-- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCacheManager.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCacheManager.java index 07ae7d67..0c56769f 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCacheManager.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataCacheManager.java @@ -173,14 +173,13 @@ public class ArbitraryDataCacheManager extends Thread { arbitraryTransaction.updateArbitraryResourceCache(repository); arbitraryTransaction.updateArbitraryMetadataCache(repository); repository.saveChanges(); - - // Update status as separate commit, as this is more prone to failure - arbitraryTransaction.updateArbitraryResourceStatus(repository); - repository.saveChanges(); } offset += batchSize; } + // Now refresh all statuses + refreshArbitraryStatuses(repository); + LOGGER.info("Completed build of arbitrary resources cache."); return true; } @@ -193,4 +192,45 @@ public class ArbitraryDataCacheManager extends Thread { } } + private boolean refreshArbitraryStatuses(Repository repository) throws DataException { + try { + LOGGER.info("Refreshing arbitrary resource statuses for locally hosted transactions..."); + SplashFrame.getInstance().updateStatus("Refreshing statuses - please wait..."); + + final int batchSize = 100; + int offset = 0; + + // Loop through all ARBITRARY transactions, and determine latest state + while (!Controller.isStopping()) { + LOGGER.info("Fetching hosted transactions {} - {}", offset, offset+batchSize-1); + + List hostedTransactions = ArbitraryDataStorageManager.getInstance().listAllHostedTransactions(repository, batchSize, offset); + if (hostedTransactions.isEmpty()) { + // Complete + break; + } + + // Loop through hosted transactions + for (ArbitraryTransactionData transactionData : hostedTransactions) { + + // Determine status and update cache + ArbitraryTransaction arbitraryTransaction = new ArbitraryTransaction(repository, transactionData); + arbitraryTransaction.updateArbitraryResourceStatus(repository); + repository.saveChanges(); + } + offset += batchSize; + } + + LOGGER.info("Completed refresh of arbitrary resource statuses."); + return true; + } + catch (DataException e) { + LOGGER.info("Unable to refresh arbitrary resource statuses: {}. The database may have been left in an inconsistent state.", e.getMessage()); + + // Throw an exception so that the node startup is halted, allowing for a retry next time. + repository.discardChanges(); + throw new DataException("Refresh of arbitrary resource statuses failed."); + } + } + }