@@ -5,7 +5,13 @@ import {
5
5
packetRequiresOffloading ,
6
6
parsePacket ,
7
7
} from "@trigger.dev/core/v3" ;
8
- import { BatchTaskRun , Prisma , TaskRunAttempt } from "@trigger.dev/database" ;
8
+ import {
9
+ BatchTaskRun ,
10
+ isUniqueConstraintError ,
11
+ Prisma ,
12
+ TaskRunAttempt ,
13
+ } from "@trigger.dev/database" ;
14
+ import { z } from "zod" ;
9
15
import { $transaction , prisma , PrismaClientOrTransaction } from "~/db.server" ;
10
16
import { env } from "~/env.server" ;
11
17
import { batchTaskRunItemStatusForRunStatus } from "~/models/taskRun.server" ;
@@ -20,9 +26,8 @@ import { downloadPacketFromObjectStore, uploadPacketToObjectStore } from "../r2.
20
26
import { isFinalAttemptStatus , isFinalRunStatus } from "../taskStatus" ;
21
27
import { startActiveSpan } from "../tracer.server" ;
22
28
import { BaseService , ServiceValidationError } from "./baseService.server" ;
23
- import { OutOfEntitlementError , TriggerTaskService } from "./triggerTask.server" ;
24
- import { z } from "zod" ;
25
29
import { ResumeBatchRunService } from "./resumeBatchRun.server" ;
30
+ import { OutOfEntitlementError , TriggerTaskService } from "./triggerTask.server" ;
26
31
27
32
const PROCESSING_BATCH_SIZE = 50 ;
28
33
const ASYNC_BATCH_PROCESS_SIZE_THRESHOLD = 20 ;
@@ -819,20 +824,39 @@ export class BatchTriggerV3Service extends BaseService {
819
824
}
820
825
821
826
if ( ! result . isCached ) {
822
- await $transaction ( this . _prisma , async ( tx ) => {
823
- await tx . batchTaskRunItem . create ( {
824
- data : {
825
- batchTaskRunId : batch . id ,
826
- taskRunId : result . run . id ,
827
- status : batchTaskRunItemStatusForRunStatus ( result . run . status ) ,
828
- } ,
829
- } ) ;
827
+ try {
828
+ await $transaction ( this . _prisma , async ( tx ) => {
829
+ // [batchTaskRunId, taskRunId] is a unique index
830
+ await tx . batchTaskRunItem . create ( {
831
+ data : {
832
+ batchTaskRunId : batch . id ,
833
+ taskRunId : result . run . id ,
834
+ status : batchTaskRunItemStatusForRunStatus ( result . run . status ) ,
835
+ } ,
836
+ } ) ;
830
837
831
- await tx . batchTaskRun . update ( {
832
- where : { id : batch . id } ,
833
- data : { expectedCount : { increment : 1 } } ,
838
+ await tx . batchTaskRun . update ( {
839
+ where : { id : batch . id } ,
840
+ data : { expectedCount : { increment : 1 } } ,
841
+ } ) ;
834
842
} ) ;
835
- } ) ;
843
+ } catch ( error ) {
844
+ if ( isUniqueConstraintError ( error , [ "batchTaskRunId" , "taskRunId" ] ) ) {
845
+ // This means there is already a batchTaskRunItem for this batch and taskRun
846
+ logger . debug (
847
+ "[BatchTriggerV2][processBatchTaskRunItem] BatchTaskRunItem already exists" ,
848
+ {
849
+ batchId : batch . friendlyId ,
850
+ runId : task . runId ,
851
+ currentIndex,
852
+ }
853
+ ) ;
854
+
855
+ return ;
856
+ }
857
+
858
+ throw error ;
859
+ }
836
860
}
837
861
}
838
862
0 commit comments