From 342a9bd5cd923bd423e2add867b60f2ccf7be62d Mon Sep 17 00:00:00 2001 From: Tim Abbott Date: Thu, 18 Apr 2024 14:03:43 -0700 Subject: [PATCH] zulip_updates: Prevent racing with self using a lock. --- .../commands/send_zulip_update_announcements.py | 14 +++++++++++++- zproject/computed_settings.py | 3 +++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/zerver/management/commands/send_zulip_update_announcements.py b/zerver/management/commands/send_zulip_update_announcements.py index 23829b88ab..a885f46f58 100644 --- a/zerver/management/commands/send_zulip_update_announcements.py +++ b/zerver/management/commands/send_zulip_update_announcements.py @@ -1,8 +1,11 @@ from argparse import ArgumentParser from typing import Any +from django.conf import settings from typing_extensions import override +from scripts.lib.zulip_tools import ENDC, WARNING +from zerver.lib.context_managers import lockfile_nonblocking from zerver.lib.management import ZulipBaseCommand from zerver.lib.zulip_update_announcements import send_zulip_update_announcements @@ -20,4 +23,13 @@ class Command(ZulipBaseCommand): @override def handle(self, *args: Any, **options: Any) -> None: - send_zulip_update_announcements(skip_delay=options["skip_delay"]) + with lockfile_nonblocking( + settings.ZULIP_UPDATE_ANNOUNCEMENTS_LOCK_FILE, + ) as lock_acquired: + if lock_acquired: + send_zulip_update_announcements(skip_delay=options["skip_delay"]) + else: + print( + f"{WARNING}Update announcements lock {settings.ZULIP_UPDATE_ANNOUNCEMENTS_LOCK_FILE} is unavailable;" + f" exiting.{ENDC}" + ) diff --git a/zproject/computed_settings.py b/zproject/computed_settings.py index 4aba17d188..c632f7f54d 100644 --- a/zproject/computed_settings.py +++ b/zproject/computed_settings.py @@ -699,6 +699,9 @@ AUTH_LOG_PATH = zulip_path("/var/log/zulip/auth.log") SCIM_LOG_PATH = zulip_path("/var/log/zulip/scim.log") ZULIP_WORKER_TEST_FILE = zulip_path("/var/log/zulip/zulip-worker-test-file") +ZULIP_UPDATE_ANNOUNCEMENTS_LOCK_FILE = zulip_path( + "/home/zulip/deployments/zulip_update_announcements.lock" +) if IS_WORKER: