From 6932fb9935d51c71781f02c82dcdd07277cd5e07 Mon Sep 17 00:00:00 2001 From: CalDescent Date: Fri, 11 Feb 2022 15:08:12 +0000 Subject: [PATCH] Added "priority" property to build queue items. /render APIs use priority 10, whereas /arbitrary use priority 0, to prevent thumbnail downloads from holding up website loading. The priorities can be adjusted later, with maybe some service types being given higher priority than others. --- .../java/org/qortal/api/resource/ArbitraryResource.java | 2 +- .../qortal/arbitrary/ArbitraryDataBuildQueueItem.java | 9 +++++++++ .../java/org/qortal/arbitrary/ArbitraryDataReader.java | 6 ++++-- .../java/org/qortal/arbitrary/ArbitraryDataRenderer.java | 2 +- .../controller/arbitrary/ArbitraryDataBuilderThread.java | 6 ++++-- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/ArbitraryResource.java b/src/main/java/org/qortal/api/resource/ArbitraryResource.java index 84e53200..430ff83f 100644 --- a/src/main/java/org/qortal/api/resource/ArbitraryResource.java +++ b/src/main/java/org/qortal/api/resource/ArbitraryResource.java @@ -1044,7 +1044,7 @@ public class ArbitraryResource { // Loop until we have data if (async) { // Asynchronous - arbitraryDataReader.loadAsynchronously(false); + arbitraryDataReader.loadAsynchronously(false, 0); } else { // Synchronous diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataBuildQueueItem.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataBuildQueueItem.java index ddbf9f24..78f3f00a 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataBuildQueueItem.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataBuildQueueItem.java @@ -13,6 +13,7 @@ public class ArbitraryDataBuildQueueItem extends ArbitraryDataResource { private final Long creationTimestamp; private Long buildStartTimestamp = null; private Long buildEndTimestamp = null; + private Integer priority = 0; private boolean failed = false; /* The maximum amount of time to spend on a single build */ @@ -77,6 +78,14 @@ public class ArbitraryDataBuildQueueItem extends ArbitraryDataResource { return this.buildStartTimestamp; } + public Integer getPriority() { + return this.priority; + } + + public void setPriority(Integer priority) { + this.priority = priority; + } + public void setFailed(boolean failed) { this.failed = failed; } diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java index 3a3f84eb..568549d8 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataReader.java @@ -126,7 +126,7 @@ public class ArbitraryDataReader { * @param overwrite - set to true to force rebuild an existing cache * @return true if added or already present in queue; false if not */ - public boolean loadAsynchronously(boolean overwrite) { + public boolean loadAsynchronously(boolean overwrite, int priority) { ArbitraryDataCache cache = new ArbitraryDataCache(this.uncompressedPath, overwrite, this.resourceId, this.resourceIdType, this.service, this.identifier); if (cache.isCachedDataAvailable()) { @@ -135,7 +135,9 @@ public class ArbitraryDataReader { return true; } - return ArbitraryDataBuildManager.getInstance().addToBuildQueue(this.createQueueItem()); + ArbitraryDataBuildQueueItem item = this.createQueueItem(); + item.setPriority(priority); + return ArbitraryDataBuildManager.getInstance().addToBuildQueue(item); } /** diff --git a/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java b/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java index e4d90b79..3bd47b26 100644 --- a/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java +++ b/src/main/java/org/qortal/arbitrary/ArbitraryDataRenderer.java @@ -76,7 +76,7 @@ public class ArbitraryDataRenderer { if (!arbitraryDataReader.isCachedDataAvailable()) { // If async is requested, show a loading screen whilst build is in progress if (async) { - arbitraryDataReader.loadAsynchronously(false); + arbitraryDataReader.loadAsynchronously(false, 10); return this.getLoadingResponse(service, resourceId); } diff --git a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataBuilderThread.java b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataBuilderThread.java index 17808daa..0f6f5ef7 100644 --- a/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataBuilderThread.java +++ b/src/main/java/org/qortal/controller/arbitrary/ArbitraryDataBuilderThread.java @@ -9,6 +9,7 @@ import org.qortal.repository.DataException; import org.qortal.utils.NTP; import java.io.IOException; +import java.util.Comparator; import java.util.Map; @@ -43,12 +44,13 @@ public class ArbitraryDataBuilderThread implements Runnable { ArbitraryDataBuildQueueItem queueItem = null; - // Find resources that are queued for building + // Find resources that are queued for building (sorted by highest priority first) synchronized (buildManager.arbitraryDataBuildQueue) { Map.Entry next = buildManager.arbitraryDataBuildQueue .entrySet().stream() .filter(e -> e.getValue().isQueued()) - .findFirst().orElse(null); + .sorted(Comparator.comparing(item -> item.getValue().getPriority())) + .reduce((first, second) -> second).orElse(null); if (next == null) { continue;