From d219170be2fd436db5c110ab349d6aa5bc3396e4 Mon Sep 17 00:00:00 2001 From: Lykoi18 Date: Thu, 30 Sep 2021 16:33:46 +0300 Subject: [PATCH 1/2] Next step on long builds --- .../readmodel-postgresql/src/build.ts | 54 ++++++++++++++----- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/packages/runtime/adapters/readmodel-adapters/readmodel-postgresql/src/build.ts b/packages/runtime/adapters/readmodel-adapters/readmodel-postgresql/src/build.ts index 81bf02442..11d0af5cd 100644 --- a/packages/runtime/adapters/readmodel-adapters/readmodel-postgresql/src/build.ts +++ b/packages/runtime/adapters/readmodel-adapters/readmodel-postgresql/src/build.ts @@ -21,6 +21,9 @@ const serializeError = (error: Error & { code: number }) => } : null +const immediatelyStopError = new Error('ImmediatelyStopError') +const immediatelyStopTimeout = 45 * 1000 + const buildInit: ( currentPool: { ledgerTableNameAsId: string @@ -674,12 +677,13 @@ const build: ExternalMethods['build'] = async ( modelInterop, next, eventstoreAdapter, - getVacantTimeInMillis, + inputGetVacantTimeInMillis, buildInfo ) => { const log = getLog('build') log.debug(`Start building`) - + const getVacantTimeInMillis = () => + Math.max(inputGetVacantTimeInMillis() - immediatelyStopTimeout, 0) eventstoreAdapter.establishTimeLimit(getVacantTimeInMillis) const { eventsWithCursors, ...inputMetricData } = buildInfo const metricData = { @@ -831,17 +835,33 @@ const build: ExternalMethods['build'] = async ( buildMethod = buildEvents } - await buildMethod( - currentPool, - basePool, - readModelName, - store, - modelInterop, - next, - eventstoreAdapter, - getVacantTimeInMillis, - buildInfo - ) + let barrierTimeout: ReturnType | null = null + try { + await Promise.race([ + new Promise((_, reject) => { + barrierTimeout = setTimeout(() => { + reject(immediatelyStopError) + barrierTimeout = null + }, inputGetVacantTimeInMillis()) + }), + buildMethod( + currentPool, + basePool, + readModelName, + store, + modelInterop, + next, + eventstoreAdapter, + getVacantTimeInMillis, + buildInfo + ), + ]) + } finally { + if (barrierTimeout != null) { + clearTimeout(barrierTimeout) + barrierTimeout = null + } + } try { await inlineLedgerRunQuery(` @@ -855,6 +875,14 @@ const build: ExternalMethods['build'] = async ( } } } catch (error) { + if (error === immediatelyStopError) { + try { + await basePool.connection.end() + } catch (e) {} + await next() + return + } + if ( error == null || !( From a531a572c53f401f0fc613d50d158ad3210cf04b Mon Sep 17 00:00:00 2001 From: Lykoi18 Date: Thu, 30 Sep 2021 16:57:24 +0300 Subject: [PATCH 2/2] WIP --- .../readmodel-adapters/readmodel-postgresql/src/build.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/runtime/adapters/readmodel-adapters/readmodel-postgresql/src/build.ts b/packages/runtime/adapters/readmodel-adapters/readmodel-postgresql/src/build.ts index 11d0af5cd..da590c516 100644 --- a/packages/runtime/adapters/readmodel-adapters/readmodel-postgresql/src/build.ts +++ b/packages/runtime/adapters/readmodel-adapters/readmodel-postgresql/src/build.ts @@ -836,6 +836,7 @@ const build: ExternalMethods['build'] = async ( } let barrierTimeout: ReturnType | null = null + try { await Promise.race([ new Promise((_, reject) => {