- Ya
- 28 Septemba 2026, 02:47 UTC
- Mwandishi
- Kamo
- Ahadi ya
- 877419c
Two overlapping requests to dial the same AI into the same meeting (a double click, two organizers, a person and the auto-join sweep) could each pass the not-live check and each place a KM2 call; the second markDialing overwrote the first call id, leaving that call untracked and never hung up. MeetParticipantWriter.claimDial now turns an INVITED participant DIALING (no call id yet) in its own short transaction before KM2 is called; only the winner dials. Two claims write the same row, so YSQL's one-snapshot transactions abort the second (40001) and its RetryOnDbConflict retry sees DIALING. A claim also writes the AI's other rows of the meeting, so duplicate rows from overlapping first invitations collide too, and a duplicate of a live AI never auto-dials. A claim with no call id ends in markFailed (refusal, or a person's runtime outage) or releaseClaim (the sweep retries); one left by a pod that died mid-dial counts as abandoned after two minutes and is taken over (M1 re-invite, or the sweep for an auto-join invitation). The sweep claims before it fails or dials an invitation, and only while it is still auto-join.
