Skip to content

Commit 88859e4

Browse files
SinghaAnirban005sahitya-chandradevin-ai-integration[bot]
authored
fix: add deterministic tiebreaker to RR host selection algorithm (calcom#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 <sahityajb@gmail.com> Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
1 parent 4313bd2 commit 88859e4

2 files changed

Lines changed: 7 additions & 4 deletions

File tree

packages/features/bookings/lib/getLuckyUser.integration-test.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ describe("getOrderedListOfLuckyUsers Integration tests", () => {
441441
vi.setSystemTime("2024-11-14T00:00:13Z");
442442
});
443443

444-
it("should sort as per availableUsers if no other criteria like weight/priority/calibration (TODO: make it independent of availableUsers order)", async () => {
444+
it("should sort by user id if no other criteria like weight/priority/calibration", async () => {
445445
const [host1, host2, host3] = await Promise.all([
446446
createHostWithBookings({
447447
user: { email: "test-user1@example.com" },
@@ -475,7 +475,9 @@ describe("getOrderedListOfLuckyUsers Integration tests", () => {
475475
routingFormResponse: null,
476476
});
477477

478-
expectLuckyUsers(luckyUsers, [user2, user1, user3]);
478+
const expectedOrder = [user1, user2, user3].sort((a, b) => a.id - b.id)
479+
480+
expectLuckyUsers(luckyUsers, expectedOrder);
479481

480482
const { users: luckyUsers2 } = await luckyUserService.getOrderedListOfLuckyUsers({
481483
availableUsers: [user3, user1, user2],
@@ -487,7 +489,7 @@ describe("getOrderedListOfLuckyUsers Integration tests", () => {
487489
allRRHosts: [],
488490
routingFormResponse: null,
489491
});
490-
expectLuckyUsers(luckyUsers2, [user3, user1, user2]);
492+
expectLuckyUsers(luckyUsers2, expectedOrder);
491493
});
492494

493495
describe("should sort as per weights", () => {

packages/features/bookings/lib/getLuckyUser.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,7 @@ export class LuckyUserService implements ILuckyUserService {
170170
availableUsers,
171171
bookingsOfAvailableUsers,
172172
organizersWithLastCreated,
173+
eventType,
173174
}: GetLuckyUserParams<T> & {
174175
bookingsOfAvailableUsers: PartialBooking[];
175176
organizersWithLastCreated: { id: number; bookings: { createdAt: Date }[] }[];
@@ -216,7 +217,7 @@ export class LuckyUserService implements ILuckyUserService {
216217
const leastRecentlyBookedUser = availableUsers.sort((a, b) => {
217218
if (userIdAndAtCreatedPair[a.id] > userIdAndAtCreatedPair[b.id]) return 1;
218219
else if (userIdAndAtCreatedPair[a.id] < userIdAndAtCreatedPair[b.id]) return -1;
219-
else return 0;
220+
else return eventType.isRRWeightsEnabled ? 0 : a.id - b.id;
220221
})[0];
221222

222223
return leastRecentlyBookedUser;

0 commit comments

Comments
 (0)