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 <sahityajb@gmail.com>
Co-authored-by: devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
Anirban Singha
2026-04-20 21:57:18 +05:30
committed by GitHub
co-authored by devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com> Sahitya Chandra devin-ai-integration[bot] <158243242+devin-ai-integration[bot]@users.noreply.github.com>
parent 4313bd2dc5
commit 88859e4e31
2 changed files with 7 additions and 4 deletions
@@ -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", () => {
@@ -170,6 +170,7 @@ export class LuckyUserService implements ILuckyUserService {
availableUsers,
bookingsOfAvailableUsers,
organizersWithLastCreated,
eventType,
}: GetLuckyUserParams<T> & {
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;