From 98cd4dfc0da182c6e2ac069f5760f26f8adce300 Mon Sep 17 00:00:00 2001 From: wukko Date: Mon, 19 May 2025 22:49:54 +0600 Subject: [PATCH] web/queue: in-place queue task retrying no more duplicate tasks --- web/src/components/queue/ProcessingQueueItem.svelte | 1 + web/src/lib/api/saving-handler.ts | 10 ++++++++-- web/src/lib/task-manager/queue.ts | 8 ++++++-- web/src/lib/task-manager/scheduler.ts | 10 +++++++++- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/web/src/components/queue/ProcessingQueueItem.svelte b/web/src/components/queue/ProcessingQueueItem.svelte index 5a73c138..f1cae700 100644 --- a/web/src/components/queue/ProcessingQueueItem.svelte +++ b/web/src/components/queue/ProcessingQueueItem.svelte @@ -45,6 +45,7 @@ retrying = true; await savingHandler({ request: info.originalRequest, + oldTaskId: id, }); retrying = false; } diff --git a/web/src/lib/api/saving-handler.ts b/web/src/lib/api/saving-handler.ts index eb65e2de..b2dfbbb4 100644 --- a/web/src/lib/api/saving-handler.ts +++ b/web/src/lib/api/saving-handler.ts @@ -11,7 +11,13 @@ import { createSavePipeline } from "$lib/task-manager/queue"; import type { CobaltSaveRequestBody } from "$lib/types/api"; -export const savingHandler = async ({ url, request }: { url?: string, request?: CobaltSaveRequestBody }) => { +type SavingHandlerArgs = { + url?: string, + request?: CobaltSaveRequestBody, + oldTaskId?: string +} + +export const savingHandler = async ({ url, request, oldTaskId }: SavingHandlerArgs) => { downloadButtonState.set("think"); const error = (errorText: string) => { @@ -103,7 +109,7 @@ export const savingHandler = async ({ url, request }: { url?: string, request?: if (response.status === "local-processing") { downloadButtonState.set("done"); - return createSavePipeline(response, selectedRequest); + return createSavePipeline(response, selectedRequest, oldTaskId); } if (response.status === "picker") { diff --git a/web/src/lib/task-manager/queue.ts b/web/src/lib/task-manager/queue.ts index c75ff477..d4638f6f 100644 --- a/web/src/lib/task-manager/queue.ts +++ b/web/src/lib/task-manager/queue.ts @@ -127,7 +127,11 @@ const showError = (errorCode: string) => { }); } -export const createSavePipeline = (info: CobaltLocalProcessingResponse, request: CobaltSaveRequestBody) => { +export const createSavePipeline = ( + info: CobaltLocalProcessingResponse, + request: CobaltSaveRequestBody, + oldTaskId?: string +) => { // this is a pre-queue part of processing, // so errors have to be returned via a regular dialog @@ -135,7 +139,7 @@ export const createSavePipeline = (info: CobaltLocalProcessingResponse, request: return showError("pipeline.missing_response_data"); } - const parentId = crypto.randomUUID(); + const parentId = oldTaskId || crypto.randomUUID(); const pipeline: CobaltPipelineItem[] = []; // reverse is needed for audio (second item) to be downloaded first diff --git a/web/src/lib/task-manager/scheduler.ts b/web/src/lib/task-manager/scheduler.ts index bcb5cab7..b4aa3e28 100644 --- a/web/src/lib/task-manager/scheduler.ts +++ b/web/src/lib/task-manager/scheduler.ts @@ -15,6 +15,8 @@ const startPipeline = (pipelineItem: CobaltPipelineItem) => { startWorker(pipelineItem); } +// this is really messy, sorry to whoever +// reads this in the future (probably myself) export const schedule = () => { const queueItems = get(queue); const ongoingTasks = get(currentTasks); @@ -58,7 +60,13 @@ export const schedule = () => { } // start the nearest waiting task and wait to be called again - else if (task.state === "waiting" && task.pipeline.length > 0) { + else if (task.state === "waiting" && task.pipeline.length > 0 && Object.keys(ongoingTasks).length === 0) { + // this is really bad but idk how to prevent tasks from running simultaneously + // on retry if a later task is running & user restarts an old task + for (const task of Object.values(queueItems)) { + if (task.state === "running") return; + } + startPipeline(task.pipeline[0]); // break because we don't want to start next tasks before this one is done