diff --git a/src/main/java/org/qortal/api/resource/ArbitraryResource.java b/src/main/java/org/qortal/api/resource/ArbitraryResource.java index 1e243c51..9a2fceaa 100644 --- a/src/main/java/org/qortal/api/resource/ArbitraryResource.java +++ b/src/main/java/org/qortal/api/resource/ArbitraryResource.java @@ -1119,6 +1119,36 @@ public class ArbitraryResource { } + @POST + @Path("/resources/cache/rebuild") + @Operation( + summary = "Rebuild arbitrary resources cache from transactions", + responses = { + @ApiResponse( + description = "true on success", + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "boolean" + ) + ) + ) + } + ) + @SecurityRequirement(name = "apiKey") + public String rebuildCache(@HeaderParam(Security.API_KEY_HEADER) String apiKey) { + Security.checkApiCallAllowed(request); + + try (final Repository repository = RepositoryManager.getRepository()) { + RepositoryManager.buildArbitraryResourcesCache(repository, true); + + return "true"; + } catch (DataException e) { + throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.REPOSITORY_ISSUE, e.getMessage()); + } + } + + // Shared methods private String preview(String directoryPath, Service service) { diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index e4944a66..1de6f776 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -403,7 +403,7 @@ public class Controller extends Thread { RepositoryManager.setRequestedCheckpoint(Boolean.TRUE); try (final Repository repository = RepositoryManager.getRepository()) { - RepositoryManager.buildInitialArbitraryResourcesCache(repository); + RepositoryManager.buildArbitraryResourcesCache(repository, false); } } catch (DataException e) { diff --git a/src/main/java/org/qortal/repository/RepositoryManager.java b/src/main/java/org/qortal/repository/RepositoryManager.java index 404b6b34..e4a287c0 100644 --- a/src/main/java/org/qortal/repository/RepositoryManager.java +++ b/src/main/java/org/qortal/repository/RepositoryManager.java @@ -64,7 +64,7 @@ public abstract class RepositoryManager { } } - public static boolean buildInitialArbitraryResourcesCache(Repository repository) throws DataException { + public static boolean buildArbitraryResourcesCache(Repository repository, boolean forceRebuild) throws DataException { if (Settings.getInstance().isLite()) { // Lite nodes have no blockchain return false; @@ -73,7 +73,7 @@ public abstract class RepositoryManager { try { // Check if QDNResources table is empty List resources = repository.getArbitraryRepository().getArbitraryResources(10, 0, false); - if (!resources.isEmpty()) { + if (!resources.isEmpty() && !forceRebuild) { // Resources exist in the cache, so assume complete. // We avoid checkpointing and prevent the node from starting up in the case of a rebuild failure, so // we shouldn't ever be left in a partially rebuilt state.