microsoft / durabletask-mssql

Microsoft SQL storage provider for Durable Functions and the Durable Task Framework
MIT License
87 stars 32 forks source link

Frequent SQL deadlocks on high sub-orchestration fan-out #45

Closed cgillum closed 3 years ago

cgillum commented 3 years ago

It appears that fanning out to a large number of concurrent sub-orchestrations results in a high-frequency of SQL deadlocks. Here is the deadlock graph of one such example:

image

<deadlock>
 <victim-list>
  <victimProcess id="process2173a075468" />
 </victim-list>
 <process-list>
  <process id="process2173a075468" taskpriority="0" logused="7792" waitresource="KEY: 5:72057594044547072 (d49f706572c3)" waittime="5763" ownerId="1101274" transactionname="user_transaction" lasttranstarted="2021-09-27T14:42:30.693" XDES="0x2173abe8428" lockMode="S" schedulerid="5" kpid="26996" status="suspended" spid="69" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2021-09-27T14:42:30.693" lastbatchcompleted="2021-09-27T14:42:30.687" lastattention="1900-01-01T00:00:00.687" clientapp="default" hostpid="22068" loginname="testlogin_ParallelSubOrchestrations_2021092709423010" isolationlevel="read committed (2)" xactid="1101274" currentdb="5" currentdbname="DurableDB" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="DurableDB.dt._CheckpointOrchestration" line="194" stmtstart="15508" stmtend="16444" sqlhandle="0x03000500888ea41e28d30901a3ad000001000000000000000000000000000000000000000000000000000000">
INSERT INTO NewEvents (
        [TaskHub],
        [InstanceID],
        [ExecutionID],
        [EventType],
        [Name],
        [RuntimeStatus],
        [VisibleTime],
        [TaskID],
        [PayloadID]
    ) 
    SELECT 
        @TaskHub,
        [InstanceID],
        [ExecutionID],
        [EventType],
        [Name],
        [RuntimeStatus],
        [VisibleTime],
        [TaskID],
        [PayloadID]
    FROM @NewOrchestrationEvent    </frame>
   </executionStack>
   <inputbuf>
Proc [Database Id = 5 Object Id = 514100872]   </inputbuf>
  </process>
  <process id="process2172628c8c8" taskpriority="0" logused="30084" waitresource="KEY: 5:72057594044547072 (9f766baad1a1)" waittime="5762" ownerId="1101296" transactionname="user_transaction" lasttranstarted="2021-09-27T14:42:30.693" XDES="0x217261b0428" lockMode="S" schedulerid="6" kpid="11848" status="suspended" spid="65" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2021-09-27T14:42:30.693" lastbatchcompleted="2021-09-27T14:42:30.687" lastattention="1900-01-01T00:00:00.687" clientapp="default" hostpid="22068" loginname="testlogin_ParallelSubOrchestrations_2021092709423010" isolationlevel="read committed (2)" xactid="1101296" currentdb="5" currentdbname="DurableDB" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
   <executionStack>
    <frame procname="DurableDB.dt._CheckpointOrchestration" line="194" stmtstart="15508" stmtend="16444" sqlhandle="0x03000500888ea41e28d30901a3ad000001000000000000000000000000000000000000000000000000000000">
INSERT INTO NewEvents (
        [TaskHub],
        [InstanceID],
        [ExecutionID],
        [EventType],
        [Name],
        [RuntimeStatus],
        [VisibleTime],
        [TaskID],
        [PayloadID]
    ) 
    SELECT 
        @TaskHub,
        [InstanceID],
        [ExecutionID],
        [EventType],
        [Name],
        [RuntimeStatus],
        [VisibleTime],
        [TaskID],
        [PayloadID]
    FROM @NewOrchestrationEvent    </frame>
   </executionStack>
   <inputbuf>
Proc [Database Id = 5 Object Id = 514100872]   </inputbuf>
  </process>
 </process-list>
 <resource-list>
  <keylock hobtid="72057594044547072" dbid="5" objectname="DurableDB.dt.Payloads" indexname="PK_Payloads" id="lock21734a1d000" mode="X" associatedObjectId="72057594044547072">
   <owner-list>
    <owner id="process2172628c8c8" mode="X" />
   </owner-list>
   <waiter-list>
    <waiter id="process2173a075468" mode="S" requestType="wait" />
   </waiter-list>
  </keylock>
  <keylock hobtid="72057594044547072" dbid="5" objectname="DurableDB.dt.Payloads" indexname="PK_Payloads" id="lock2173a673580" mode="X" associatedObjectId="72057594044547072">
   <owner-list>
    <owner id="process2173a075468" mode="X" />
   </owner-list>
   <waiter-list>
    <waiter id="process2172628c8c8" mode="S" requestType="wait" />
   </waiter-list>
  </keylock>
 </resource-list>
</deadlock>
hsnsalhi commented 2 years ago

I want to know when the 0.10.1-beta version will be available in nuget package ? thank you.

cgillum commented 2 years ago

Apologies for the delay! The nuget packages are now published.

Release notes