From e8f268de094efeb7a25a6c560c542db87ab505ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Berg=C3=A9?= Date: Thu, 9 Nov 2023 13:20:42 +0100 Subject: [PATCH] fix(build): fix build creation concurrency --- apps/backend/src/web/api/v2/util.ts | 63 +++++++++++++++-------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/apps/backend/src/web/api/v2/util.ts b/apps/backend/src/web/api/v2/util.ts index 4bc3b3317..02f0094e4 100644 --- a/apps/backend/src/web/api/v2/util.ts +++ b/apps/backend/src/web/api/v2/util.ts @@ -119,37 +119,40 @@ export const createBuild = async (params: { }) : null; - return transaction(async (trx) => { - const bucket = await ScreenshotBucket.query(trx).insertAndFetch({ - name: buildName, - commit: params.commit, - branch: params.branch, - projectId: params.project.id, - complete: false, - }); - - const build = await Build.query(trx).insertAndFetch({ - jobStatus: "pending" as const, - baseScreenshotBucketId: null, - externalId: params.parallel ? params.parallel.nonce : null, - batchCount: params.parallel ? 0 : null, - projectId: params.project.id, - name: buildName, - prNumber: params.prNumber ?? null, - prHeadCommit: params.prHeadCommit ?? null, - githubPullRequestId: pullRequest?.id ? String(pullRequest?.id) : null, - referenceCommit: params.referenceCommit ?? null, - referenceBranch: params.referenceBranch ?? null, - compareScreenshotBucketId: bucket.id, - }); - - await pushBuildNotification({ - buildId: build.id, - type: "queued", - trx, + const lock = await getRedisLock(); + return lock.acquire(`buildCreation-${params.project.id}`, async () => { + return transaction(async (trx) => { + const bucket = await ScreenshotBucket.query(trx).insertAndFetch({ + name: buildName, + commit: params.commit, + branch: params.branch, + projectId: params.project.id, + complete: false, + }); + + const build = await Build.query(trx).insertAndFetch({ + jobStatus: "pending" as const, + baseScreenshotBucketId: null, + externalId: params.parallel ? params.parallel.nonce : null, + batchCount: params.parallel ? 0 : null, + projectId: params.project.id, + name: buildName, + prNumber: params.prNumber ?? null, + prHeadCommit: params.prHeadCommit ?? null, + githubPullRequestId: pullRequest?.id ? String(pullRequest?.id) : null, + referenceCommit: params.referenceCommit ?? null, + referenceBranch: params.referenceBranch ?? null, + compareScreenshotBucketId: bucket.id, + }); + + await pushBuildNotification({ + buildId: build.id, + type: "queued", + trx, + }); + + return build; }); - - return build; }); };