From 17a5b3ffdbf3ba5aa85d0fc180be430d6a5c4b21 Mon Sep 17 00:00:00 2001 From: Ruben Fiszel Date: Wed, 28 Dec 2022 17:11:58 +0100 Subject: [PATCH] fix testjobloader when running many interleaving computations --- frontend/src/lib/components/LogViewer.svelte | 3 +- .../src/lib/components/ModulePreview.svelte | 7 ++- .../src/lib/components/TestJobLoader.svelte | 63 +++++++++++-------- .../(logged)/user/(user)/login/+page.svelte | 56 +++++++++-------- 4 files changed, 72 insertions(+), 57 deletions(-) diff --git a/frontend/src/lib/components/LogViewer.svelte b/frontend/src/lib/components/LogViewer.svelte index 8d2dc0443e..2a54bce0b9 100644 --- a/frontend/src/lib/components/LogViewer.svelte +++ b/frontend/src/lib/components/LogViewer.svelte @@ -55,8 +55,7 @@ >{#if content}{content}{:else if isLoading}{:else} - No logs are available yet{/if}{:else}No logs are available yet{/if} diff --git a/frontend/src/lib/components/ModulePreview.svelte b/frontend/src/lib/components/ModulePreview.svelte index f7ace3756e..405c845254 100644 --- a/frontend/src/lib/components/ModulePreview.svelte +++ b/frontend/src/lib/components/ModulePreview.svelte @@ -30,17 +30,18 @@ export async function runTest(args: any) { const val = mod.value + let jobId: string | undefined = undefined if (val.type == 'rawscript') { - await testJobLoader?.runPreview(val.path, val.content, val.language, args) + jobId = await testJobLoader?.runPreview(val.path, val.content, val.language, args) } else if (val.type == 'script') { const script = val.hash ? await ScriptService.getScriptByHash({ workspace: $workspaceStore!, hash: val.hash }) : await getScriptByPath(val.path) - await testJobLoader?.runPreview(val.path, script.content, script.language, args) + jobId = await testJobLoader?.runPreview(val.path, script.content, script.language, args) } else { throw Error('not testable module type') } - sendUserToast(`started test ${truncateRev(testJob?.id ?? '', 10)}`) + sendUserToast(`started test ${truncateRev(jobId ?? '', 10)}`) } function jobDone() { diff --git a/frontend/src/lib/components/TestJobLoader.svelte b/frontend/src/lib/components/TestJobLoader.svelte index 62fc01c540..fb9ad68611 100644 --- a/frontend/src/lib/components/TestJobLoader.svelte +++ b/frontend/src/lib/components/TestJobLoader.svelte @@ -24,22 +24,16 @@ let ITERATIONS_BEFORE_SLOW_REFRESH = 10 let ITERATIONS_BEFORE_SUPER_SLOW_REFRESH = 100 + let stopCurrentIteration = false + export async function abstractRun(fn: () => Promise) { try { - intervalId && (await clearIntervalAsync(intervalId)) - - if (isLoading && job) { - await JobService.cancelQueuedJob({ - workspace: workspace!, - id: job.id, - requestBody: {} - }) - } + await clearCurrentJob() isLoading = true - const testId = await fn() await watchJob(testId) + return testId } catch (err) { isLoading = false throw err @@ -49,8 +43,8 @@ export async function runScriptByPath( path: string | undefined, args: Record - ): Promise { - abstractRun(() => + ): Promise { + return abstractRun(() => JobService.runScriptByPath({ workspace: $workspaceStore!, path: path ?? '', @@ -62,8 +56,8 @@ export async function runFlowByPath( path: string | undefined, args: Record - ): Promise { - abstractRun(() => + ): Promise { + return abstractRun(() => JobService.runFlowByPath({ workspace: $workspaceStore!, path: path ?? '', @@ -77,8 +71,8 @@ code: string, lang: 'deno' | 'go' | 'python3' | 'bash', args: Record - ): Promise { - abstractRun(() => + ): Promise { + return abstractRun(() => JobService.runScriptPreview({ workspace: $workspaceStore!, requestBody: { @@ -105,10 +99,26 @@ console.log('cancelled') } - export async function watchJob(testId: string) { - intervalId && (await clearIntervalAsync(intervalId)) + export async function clearCurrentJob() { + if (intervalId) { + const interval = intervalId + intervalId = undefined + stopCurrentIteration = true + if (isLoading && job) { + await JobService.cancelQueuedJob({ + workspace: workspace!, + id: job.id, + requestBody: {} + }) + } + await clearIntervalAsync(interval) + } + stopCurrentIteration = false job = undefined - syncIteration = 0 + isLoading = false + } + + export async function watchJob(testId: string) { const isCompleted = await loadTestJob(testId) if (!isCompleted) { isLoading = true @@ -143,7 +153,7 @@ if (job?.type === 'CompletedJob') { //only CompletedJob has success property isCompleted = true - intervalId && (await clearIntervalAsync(intervalId)) + intervalId && clearIntervalAsync(intervalId!) if (isLoading) { dispatch('done', job) isLoading = false @@ -151,7 +161,7 @@ } notfound = false } catch (err) { - intervalId && (await clearIntervalAsync(intervalId)) + intervalId && clearIntervalAsync(intervalId!) isLoading = false if (err.status === 404) { notfound = true @@ -162,18 +172,21 @@ } async function syncer(id: string): Promise { + syncIteration++ if (syncIteration == ITERATIONS_BEFORE_SLOW_REFRESH) { - intervalId && (await clearIntervalAsync(intervalId)) + intervalId && clearIntervalAsync(intervalId!) intervalId = setIntervalAsync(async () => await syncer(id), 500) } else if (syncIteration == ITERATIONS_BEFORE_SUPER_SLOW_REFRESH) { - intervalId && (await clearIntervalAsync(intervalId)) + intervalId && clearIntervalAsync(intervalId!) intervalId = setIntervalAsync(async () => await syncer(id), 2000) } - syncIteration++ + if (stopCurrentIteration) { + return + } await loadTestJob(id) } onDestroy(async () => { - intervalId && (await clearIntervalAsync(intervalId)) + await clearCurrentJob() }) diff --git a/frontend/src/routes/(root)/(logged)/user/(user)/login/+page.svelte b/frontend/src/routes/(root)/(logged)/user/(user)/login/+page.svelte index 2aa738a698..8cf4c7645f 100644 --- a/frontend/src/routes/(root)/(logged)/user/(user)/login/+page.svelte +++ b/frontend/src/routes/(root)/(logged)/user/(user)/login/+page.svelte @@ -41,7 +41,7 @@ const providersType = providers.map((p) => p.type as string) let showPassword = false - let logins: string[] = [] + let logins: string[] | undefined = undefined async function login(): Promise { const requestBody = { @@ -119,31 +119,36 @@
- {#each providers as { type, icon, name }} - {#if logins.includes(type)} + {#if !logins} + {#each Array(4) as _} + + {/each} + {:else} + {#each providers as { type, icon, name }} + {#if logins.includes(type)} + + {/if} + {/each} + + {#each logins.filter((x) => !providersType.includes(x)) as login} - {:else} - - {/if} - {/each} - {#each logins.filter((x) => !providersType.includes(x)) as login} - - {/each} + {/each} + {/if}
@@ -169,12 +176,7 @@