From e8e6abdbba64e64928dcae544a8c66020c202824 Mon Sep 17 00:00:00 2001 From: Alex Vandiver Date: Tue, 23 Apr 2024 19:30:37 +0000 Subject: [PATCH] management: Add lockfiles to all _once management jobs. These would be bad if more than once ran at once. --- zerver/management/commands/archive_messages.py | 2 ++ zerver/management/commands/delete_old_unclaimed_attachments.py | 2 ++ zerver/management/commands/enqueue_digest_emails.py | 2 ++ zerver/management/commands/promote_new_full_members.py | 3 ++- zerver/management/commands/soft_deactivate_users.py | 3 ++- .../management/commands/calculate_first_visible_message_id.py | 3 ++- .../commands/downgrade_small_realms_behind_on_payments.py | 3 ++- zilencer/management/commands/invoice_plans.py | 3 ++- 8 files changed, 16 insertions(+), 5 deletions(-) diff --git a/zerver/management/commands/archive_messages.py b/zerver/management/commands/archive_messages.py index 3d493b75ae..c7f5569db3 100644 --- a/zerver/management/commands/archive_messages.py +++ b/zerver/management/commands/archive_messages.py @@ -3,11 +3,13 @@ from typing import Any from django.core.management.base import BaseCommand from typing_extensions import override +from zerver.lib.management import abort_unless_locked from zerver.lib.retention import archive_messages, clean_archived_data class Command(BaseCommand): @override + @abort_unless_locked def handle(self, *args: Any, **options: str) -> None: clean_archived_data() archive_messages() diff --git a/zerver/management/commands/delete_old_unclaimed_attachments.py b/zerver/management/commands/delete_old_unclaimed_attachments.py index 107943953d..745cb72d55 100644 --- a/zerver/management/commands/delete_old_unclaimed_attachments.py +++ b/zerver/management/commands/delete_old_unclaimed_attachments.py @@ -8,6 +8,7 @@ from typing_extensions import override from zerver.actions.uploads import do_delete_old_unclaimed_attachments from zerver.lib.attachments import get_old_unclaimed_attachments +from zerver.lib.management import abort_unless_locked from zerver.lib.upload import all_message_attachments, delete_message_attachments from zerver.models import ArchivedAttachment, Attachment @@ -44,6 +45,7 @@ class Command(BaseCommand): ) @override + @abort_unless_locked def handle(self, *args: Any, **options: Any) -> None: delta_weeks = options["delta_weeks"] print(f"Deleting unclaimed attached files older than {delta_weeks} weeks") diff --git a/zerver/management/commands/enqueue_digest_emails.py b/zerver/management/commands/enqueue_digest_emails.py index 7629ff7ea0..68cf7e3c55 100644 --- a/zerver/management/commands/enqueue_digest_emails.py +++ b/zerver/management/commands/enqueue_digest_emails.py @@ -9,6 +9,7 @@ from typing_extensions import override from zerver.lib.digest import DIGEST_CUTOFF, enqueue_emails from zerver.lib.logging_util import log_to_file +from zerver.lib.management import abort_unless_locked ## Logging setup ## logger = logging.getLogger(__name__) @@ -21,6 +22,7 @@ in a while. """ @override + @abort_unless_locked def handle(self, *args: Any, **options: Any) -> None: cutoff = timezone_now() - timedelta(days=DIGEST_CUTOFF) enqueue_emails(cutoff) diff --git a/zerver/management/commands/promote_new_full_members.py b/zerver/management/commands/promote_new_full_members.py index 1fe116cec1..19b84814c8 100644 --- a/zerver/management/commands/promote_new_full_members.py +++ b/zerver/management/commands/promote_new_full_members.py @@ -3,12 +3,13 @@ from typing import Any from typing_extensions import override from zerver.actions.user_groups import promote_new_full_members -from zerver.lib.management import ZulipBaseCommand +from zerver.lib.management import ZulipBaseCommand, abort_unless_locked class Command(ZulipBaseCommand): help = """Add users to full members system group.""" @override + @abort_unless_locked def handle(self, *args: Any, **options: Any) -> None: promote_new_full_members() diff --git a/zerver/management/commands/soft_deactivate_users.py b/zerver/management/commands/soft_deactivate_users.py index 2d4017a23d..7bea21846c 100644 --- a/zerver/management/commands/soft_deactivate_users.py +++ b/zerver/management/commands/soft_deactivate_users.py @@ -6,7 +6,7 @@ from django.conf import settings from django.core.management.base import CommandError from typing_extensions import override -from zerver.lib.management import ZulipBaseCommand +from zerver.lib.management import ZulipBaseCommand, abort_unless_locked from zerver.lib.soft_deactivation import ( do_auto_soft_deactivate_users, do_soft_activate_users, @@ -57,6 +57,7 @@ class Command(ZulipBaseCommand): ) @override + @abort_unless_locked def handle(self, *args: Any, **options: Any) -> None: if settings.STAGING: print("This is a Staging server. Suppressing management command.") diff --git a/zilencer/management/commands/calculate_first_visible_message_id.py b/zilencer/management/commands/calculate_first_visible_message_id.py index cea5454813..70aab76fdd 100644 --- a/zilencer/management/commands/calculate_first_visible_message_id.py +++ b/zilencer/management/commands/calculate_first_visible_message_id.py @@ -3,7 +3,7 @@ from typing import Any, Iterable from django.core.management.base import CommandParser from typing_extensions import override -from zerver.lib.management import ZulipBaseCommand +from zerver.lib.management import ZulipBaseCommand, abort_unless_locked from zerver.lib.message import maybe_update_first_visible_message_id from zerver.models import Realm @@ -23,6 +23,7 @@ class Command(ZulipBaseCommand): ) @override + @abort_unless_locked def handle(self, *args: Any, **options: Any) -> None: target_realm = self.get_realm(options) diff --git a/zilencer/management/commands/downgrade_small_realms_behind_on_payments.py b/zilencer/management/commands/downgrade_small_realms_behind_on_payments.py index 560aaca025..2f79ff544e 100644 --- a/zilencer/management/commands/downgrade_small_realms_behind_on_payments.py +++ b/zilencer/management/commands/downgrade_small_realms_behind_on_payments.py @@ -3,12 +3,13 @@ from typing import Any from typing_extensions import override from corporate.lib.stripe import downgrade_small_realms_behind_on_payments_as_needed -from zerver.lib.management import ZulipBaseCommand +from zerver.lib.management import ZulipBaseCommand, abort_unless_locked class Command(ZulipBaseCommand): help = "Downgrade small realms that are running behind on payments" @override + @abort_unless_locked def handle(self, *args: Any, **options: Any) -> None: downgrade_small_realms_behind_on_payments_as_needed() diff --git a/zilencer/management/commands/invoice_plans.py b/zilencer/management/commands/invoice_plans.py index 61ba75b9a6..089b8261f2 100644 --- a/zilencer/management/commands/invoice_plans.py +++ b/zilencer/management/commands/invoice_plans.py @@ -3,7 +3,7 @@ from typing import Any from django.conf import settings from typing_extensions import override -from zerver.lib.management import ZulipBaseCommand +from zerver.lib.management import ZulipBaseCommand, abort_unless_locked if settings.BILLING_ENABLED: from corporate.lib.stripe import invoice_plans_as_needed @@ -13,6 +13,7 @@ class Command(ZulipBaseCommand): help = """Generates invoices for customers if needed.""" @override + @abort_unless_locked def handle(self, *args: Any, **options: Any) -> None: if settings.BILLING_ENABLED: # Uncomment to test with a specific date.