From 8a778f4f5bece57dda3a94ea3d42f3810137fa32 Mon Sep 17 00:00:00 2001 From: Sony Mathew Date: Thu, 13 Aug 2026 17:03:36 +0530 Subject: [PATCH] fix: handle empty round robin queues (#15399) Round-robin queue resets now leave the Redis queue empty when an inbox has no members, avoiding an invalid sorted-set write while keeping normal queue population unchanged. ## Closes - [CW-7922](https://linear.app/chatwoot/issue/CW-7922/harden-backend-paths-causing-production-sentry-errors) - [Sentry 7663380084](https://chatwoot-p3.sentry.io/issues/7663380084/) ## How to reproduce Run round-robin assignment for an inbox with no inbox members. Resetting the queue previously attempted a Redis sorted-set write without any member/score pairs. ## What changed - Clear the existing queue as before. - Skip queue population when there are no eligible user IDs. - Add service coverage for an inbox with no members. --- .../auto_assignment/inbox_round_robin_service.rb | 3 ++- .../auto_assignment/inbox_round_robin_service_spec.rb | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/app/services/auto_assignment/inbox_round_robin_service.rb b/app/services/auto_assignment/inbox_round_robin_service.rb index 7f5a5fb6c..9cffa022f 100644 --- a/app/services/auto_assignment/inbox_round_robin_service.rb +++ b/app/services/auto_assignment/inbox_round_robin_service.rb @@ -17,8 +17,9 @@ class AutoAssignment::InboxRoundRobinService end def reset_queue + user_ids = inbox.inbox_members.map(&:user_id) clear_queue - add_agent_to_queue(inbox.inbox_members.map(&:user_id)) + add_agent_to_queue(user_ids) if user_ids.any? end # end of queue management functions diff --git a/spec/services/auto_assignment/inbox_round_robin_service_spec.rb b/spec/services/auto_assignment/inbox_round_robin_service_spec.rb index abf6e42cc..de669dfdd 100644 --- a/spec/services/auto_assignment/inbox_round_robin_service_spec.rb +++ b/spec/services/auto_assignment/inbox_round_robin_service_spec.rb @@ -27,6 +27,15 @@ describe AutoAssignment::InboxRoundRobinService do expect(inbox_round_robin_service.send(:queue).map(&:to_i)).to match_array(inbox_members.map(&:user_id)) end + it 'keeps the queue empty when the inbox has no members' do + empty_inbox = create(:inbox, account: account) + service = described_class.new(inbox: empty_inbox) + service.add_agent_to_queue(-1) + + expect(service.available_agent).to be_nil + expect(service.send(:queue)).to be_empty + end + it 'validates the queue and correct it before performing round robin' do # adding some invalid ids to queue inbox_round_robin_service.add_agent_to_queue([2, 3, 5, 9])