From ff3ceb981edbac580589737fa8e4e971bb1ae9da Mon Sep 17 00:00:00 2001 From: Viktor Lofgren Date: Tue, 28 Nov 2023 15:18:24 +0100 Subject: [PATCH] (control) Button for removing a stale 'NEW' status If a process is violently terminated, the associated file storage may get stuck in the ephemeral 'NEW' state, preventing future operations on the associated data. To remedy this without having to dig through the database, a button was added to reset the state. It's a band-aid, but the situation is rare enough that I think it's fine. --- .../control/node/model/FileStorageWithActions.java | 4 ++++ .../marginalia/control/node/svc/ControlNodeService.java | 8 ++++++++ .../templates/control/node/node-storage-details.hdb | 8 ++++++++ 3 files changed, 20 insertions(+) diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/node/model/FileStorageWithActions.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/node/model/FileStorageWithActions.java index b57bd5c0..534fe1f0 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/node/model/FileStorageWithActions.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/node/model/FileStorageWithActions.java @@ -2,6 +2,7 @@ package nu.marginalia.control.node.model; import nu.marginalia.storage.model.FileStorage; import nu.marginalia.storage.model.FileStorageBaseType; +import nu.marginalia.storage.model.FileStorageState; import nu.marginalia.storage.model.FileStorageType; import java.nio.file.Path; @@ -12,6 +13,9 @@ public record FileStorageWithActions(FileStorage storage) { public boolean isCrawlable() { return storage.type() == FileStorageType.CRAWL_SPEC; } + public boolean isStatusNew() { + return storage.state() == FileStorageState.NEW; + } public boolean isAtagsExportable() { return storage.type() == FileStorageType.CRAWL_DATA; } diff --git a/code/services-core/control-service/src/main/java/nu/marginalia/control/node/svc/ControlNodeService.java b/code/services-core/control-service/src/main/java/nu/marginalia/control/node/svc/ControlNodeService.java index fcc396d3..d848f00b 100644 --- a/code/services-core/control-service/src/main/java/nu/marginalia/control/node/svc/ControlNodeService.java +++ b/code/services-core/control-service/src/main/java/nu/marginalia/control/node/svc/ControlNodeService.java @@ -108,6 +108,9 @@ public class ControlNodeService { Spark.post("/public/nodes/:id/storage/crawl/:fid", this::triggerCrawl, redirectControl.renderRedirectAcknowledgement("Crawling", "..") ); + Spark.post("/public/nodes/:id/storage/reset-state/:fid", this::resetState, + redirectControl.renderRedirectAcknowledgement("Restoring", "..") + ); Spark.post("/public/nodes/:id/storage/backup-restore/:fid", this::triggerRestoreBackup, redirectControl.renderRedirectAcknowledgement("Restoring", "..") ); @@ -121,6 +124,11 @@ public class ControlNodeService { Spark.post("/public/nodes/:id/fsms/:fsm/stop", this::stopFsm); } + private Object resetState(Request request, Response response) throws SQLException { + fileStorageService.setFileStorageState(FileStorageId.parse(request.params("fid")), FileStorageState.UNSET); + return ""; + } + private Object exportData(Request req, Response rsp) { executorClient.exportData(Context.fromRequest(req), Integer.parseInt(req.params("id"))); return ""; diff --git a/code/services-core/control-service/src/main/resources/templates/control/node/node-storage-details.hdb b/code/services-core/control-service/src/main/resources/templates/control/node/node-storage-details.hdb index d0f34bc6..a5792256 100644 --- a/code/services-core/control-service/src/main/resources/templates/control/node/node-storage-details.hdb +++ b/code/services-core/control-service/src/main/resources/templates/control/node/node-storage-details.hdb @@ -67,6 +67,14 @@ {{/if}} + {{#if isStatusNew}} +
+ + Remove 'NEW' state (use this if the generating process stopped) + + +
+ {{/if}} {{#if isAtagsExportable}}