From 88859e4e316ea0a1349cc3a1c4f57c6028ab437b Mon Sep 17 00:00:00 2001 From: Anirban Singha <143536290+SinghaAnirban005@users.noreply.github.com> Date: Mon, 20 Apr 2026 21:57:18 +0530 Subject: [PATCH] fix: add deterministic tiebreaker to RR host selection algorithm (#28783) * fix: add deterministic tiebreaker to RR host selection algorithm * chore: cleanup comments * Update packages/features/bookings/lib/getLuckyUser.integration-test.ts Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com> --------- Co-authored-by: Sahitya Chandra Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com> --- .../bookings/lib/getLuckyUser.integration-test.ts | 8 +++++--- packages/features/bookings/lib/getLuckyUser.ts | 3 ++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/features/bookings/lib/getLuckyUser.integration-test.ts b/packages/features/bookings/lib/getLuckyUser.integration-test.ts index fcdcb03905..3571d0be00 100644 --- a/packages/features/bookings/lib/getLuckyUser.integration-test.ts +++ b/packages/features/bookings/lib/getLuckyUser.integration-test.ts @@ -441,7 +441,7 @@ describe("getOrderedListOfLuckyUsers Integration tests", () => { vi.setSystemTime("2024-11-14T00:00:13Z"); }); - it("should sort as per availableUsers if no other criteria like weight/priority/calibration (TODO: make it independent of availableUsers order)", async () => { + it("should sort by user id if no other criteria like weight/priority/calibration", async () => { const [host1, host2, host3] = await Promise.all([ createHostWithBookings({ user: { email: "test-user1@example.com" }, @@ -475,7 +475,9 @@ describe("getOrderedListOfLuckyUsers Integration tests", () => { routingFormResponse: null, }); - expectLuckyUsers(luckyUsers, [user2, user1, user3]); + const expectedOrder = [user1, user2, user3].sort((a, b) => a.id - b.id) + + expectLuckyUsers(luckyUsers, expectedOrder); const { users: luckyUsers2 } = await luckyUserService.getOrderedListOfLuckyUsers({ availableUsers: [user3, user1, user2], @@ -487,7 +489,7 @@ describe("getOrderedListOfLuckyUsers Integration tests", () => { allRRHosts: [], routingFormResponse: null, }); - expectLuckyUsers(luckyUsers2, [user3, user1, user2]); + expectLuckyUsers(luckyUsers2, expectedOrder); }); describe("should sort as per weights", () => { diff --git a/packages/features/bookings/lib/getLuckyUser.ts b/packages/features/bookings/lib/getLuckyUser.ts index 93ac0baf6d..42e568c852 100644 --- a/packages/features/bookings/lib/getLuckyUser.ts +++ b/packages/features/bookings/lib/getLuckyUser.ts @@ -170,6 +170,7 @@ export class LuckyUserService implements ILuckyUserService { availableUsers, bookingsOfAvailableUsers, organizersWithLastCreated, + eventType, }: GetLuckyUserParams & { bookingsOfAvailableUsers: PartialBooking[]; organizersWithLastCreated: { id: number; bookings: { createdAt: Date }[] }[]; @@ -216,7 +217,7 @@ export class LuckyUserService implements ILuckyUserService { const leastRecentlyBookedUser = availableUsers.sort((a, b) => { if (userIdAndAtCreatedPair[a.id] > userIdAndAtCreatedPair[b.id]) return 1; else if (userIdAndAtCreatedPair[a.id] < userIdAndAtCreatedPair[b.id]) return -1; - else return 0; + else return eventType.isRRWeightsEnabled ? 0 : a.id - b.id; })[0]; return leastRecentlyBookedUser;