diff --git a/zerver/management/commands/deliver_scheduled_emails.py b/zerver/management/commands/deliver_scheduled_emails.py index 0be5607435..cb545558f2 100644 --- a/zerver/management/commands/deliver_scheduled_emails.py +++ b/zerver/management/commands/deliver_scheduled_emails.py @@ -15,6 +15,7 @@ from typing import Any from django.conf import settings from django.core.management.base import BaseCommand +from django.db import transaction from django.utils.timezone import now as timezone_now from zerver.lib.logging_util import log_to_file @@ -42,17 +43,20 @@ Usage: ./manage.py deliver_scheduled_emails sleep_forever() while True: - email_jobs_to_deliver = ScheduledEmail.objects.filter( - scheduled_timestamp__lte=timezone_now() - ) - if email_jobs_to_deliver: - for job in email_jobs_to_deliver: - try: - deliver_scheduled_emails(job) - except EmailNotDeliveredException: - logger.warning("%r not delivered", job) + found_rows = False + with transaction.atomic(): + email_jobs_to_deliver = ScheduledEmail.objects.filter( + scheduled_timestamp__lte=timezone_now() + ).select_for_update() + if email_jobs_to_deliver: + for job in email_jobs_to_deliver: + try: + deliver_scheduled_emails(job) + except EmailNotDeliveredException: + logger.warning("%r not delivered", job) + # Less load on the db during times of activity, + # and more responsiveness when the load is low + if found_rows: time.sleep(10) else: - # Less load on the db during times of activity, - # and more responsiveness when the load is low time.sleep(2) diff --git a/zerver/management/commands/deliver_scheduled_messages.py b/zerver/management/commands/deliver_scheduled_messages.py index 91ba8bd277..f338f22430 100644 --- a/zerver/management/commands/deliver_scheduled_messages.py +++ b/zerver/management/commands/deliver_scheduled_messages.py @@ -5,6 +5,7 @@ from typing import Any from django.conf import settings from django.core.management.base import BaseCommand +from django.db import transaction from django.utils.timezone import now as timezone_now from zerver.lib.actions import build_message_send_dict, do_send_messages @@ -65,13 +66,14 @@ Usage: ./manage.py deliver_scheduled_messages sleep_forever() while True: - messages_to_deliver = ScheduledMessage.objects.filter( - scheduled_timestamp__lte=timezone_now(), delivered=False - ) - for message in messages_to_deliver: - do_send_messages([self.construct_message(message)]) - message.delivered = True - message.save(update_fields=["delivered"]) + with transaction.atomic(): + messages_to_deliver = ScheduledMessage.objects.filter( + scheduled_timestamp__lte=timezone_now(), delivered=False + ).select_for_update() + for message in messages_to_deliver: + do_send_messages([self.construct_message(message)]) + message.delivered = True + message.save(update_fields=["delivered"]) cur_time = timezone_now() time_next_min = (cur_time + timedelta(minutes=1)).replace(second=0, microsecond=0)