From 4ea8218e3050e9a8f47a6f4dbade6cb3898390f0 Mon Sep 17 00:00:00 2001 From: Shivam Mishra Date: Wed, 15 Oct 2025 15:15:19 +0530 Subject: [PATCH] fix: expiry delay --- app/services/messages/send_email_notification_service.rb | 8 ++++---- .../messages/send_email_notification_service_spec.rb | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/services/messages/send_email_notification_service.rb b/app/services/messages/send_email_notification_service.rb index f1db920d0..87ba1a797 100644 --- a/app/services/messages/send_email_notification_service.rb +++ b/app/services/messages/send_email_notification_service.rb @@ -7,10 +7,10 @@ class Messages::SendEmailNotificationService conversation = message.conversation conversation_mail_key = format(::Redis::Alfred::CONVERSATION_MAILER_KEY, conversation_id: conversation.id) - # Atomically set redis key to prevent duplicate email workers - # Only the first message in a 2-minute window will successfully set the key and enqueue the worker - # Subsequent messages will fail to set the key (returns false) and skip enqueueing - return unless Redis::Alfred.set(conversation_mail_key, message.id, nx: true, ex: 2.minutes.to_i) + # Atomically set redis key to prevent duplicate email workers. Keep the key alive longer than + # the worker delay (1 hour) so slow queues don't enqueue duplicate jobs, but let it expire if + # the worker never manages to clean up. + return unless Redis::Alfred.set(conversation_mail_key, message.id, nx: true, ex: 1.hour.to_i) ConversationReplyEmailWorker.perform_in(2.minutes, conversation.id, message.id) end diff --git a/spec/services/messages/send_email_notification_service_spec.rb b/spec/services/messages/send_email_notification_service_spec.rb index 0f092c14d..cda728f21 100644 --- a/spec/services/messages/send_email_notification_service_spec.rb +++ b/spec/services/messages/send_email_notification_service_spec.rb @@ -32,7 +32,7 @@ describe Messages::SendEmailNotificationService do service.perform - expect(Redis::Alfred).to have_received(:set).with(expected_key, message.id, nx: true, ex: 2.minutes.to_i) + expect(Redis::Alfred).to have_received(:set).with(expected_key, message.id, nx: true, ex: 1.hour.to_i) end context 'when redis key already exists' do