Skip to content

Commit 4552015

Browse files
authored
feat(tasks) Simplify options for task scheduler (#97268)
Use `taskworker.enabled` in the scheduler and cron command as well. When `taskworker.enabled` is active the cron command should become inert so that we don't have two schedulers running at the same time in production and in self-hosted.
1 parent a520885 commit 4552015

File tree

1 file changed

+21
-17
lines changed
  • src/sentry/runner/commands

1 file changed

+21
-17
lines changed

src/sentry/runner/commands/run.py

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import random
66
import signal
77
import time
8+
from collections.abc import Mapping
89
from multiprocessing import cpu_count
910
from typing import Any
1011

@@ -17,6 +18,7 @@
1718
from sentry.utils.kafka import run_processor_with_signals
1819

1920
DEFAULT_BLOCK_SIZE = int(32 * 1e6)
21+
logger = logging.getLogger("sentry.runner.commands.run")
2022

2123

2224
def _address_validate(
@@ -255,30 +257,30 @@ def taskworker_scheduler(redis_cluster: str, **options: Any) -> None:
255257
"""
256258
from django.conf import settings
257259

258-
from sentry import options as featureflags
260+
from sentry import options as runtime_options
261+
from sentry.conf.types.taskworker import ScheduleConfig
259262
from sentry.taskworker.registry import taskregistry
260263
from sentry.taskworker.scheduler.runner import RunStorage, ScheduleRunner
261264
from sentry.utils.redis import redis_clusters
262265

263266
for module in settings.TASKWORKER_IMPORTS:
264267
__import__(module)
265268

266-
logger = logging.getLogger("sentry.runner.commands.run")
267-
268269
run_storage = RunStorage(redis_clusters.get(redis_cluster))
269270

270271
with managed_bgtasks(role="taskworker-scheduler"):
271272
runner = ScheduleRunner(taskregistry, run_storage)
272-
enabled_schedules = set(featureflags.get("taskworker.scheduler.rollout", []))
273-
for key, schedule_data in settings.TASKWORKER_SCHEDULES.items():
274-
if key in enabled_schedules:
275-
runner.add(key, schedule_data)
273+
schedules: Mapping[str, ScheduleConfig] = {}
274+
if runtime_options.get("taskworker.enabled"):
275+
schedules = settings.TASKWORKER_SCHEDULES
276+
277+
for key, schedule_data in schedules.items():
278+
runner.add(key, schedule_data)
276279

277280
logger.info(
278281
"taskworker.scheduler.schedule_data",
279282
extra={
280-
"enabled": enabled_schedules,
281-
"available": list(settings.TASKWORKER_SCHEDULES.keys()),
283+
"schedule_keys": list(schedules.keys()),
282284
},
283285
)
284286

@@ -487,7 +489,7 @@ def cron(**options: Any) -> None:
487489
"Run periodic task dispatcher."
488490
from django.conf import settings
489491

490-
from sentry import options as featureflags
492+
from sentry import options as runtime_options
491493

492494
if settings.CELERY_ALWAYS_EAGER:
493495
raise click.ClickException(
@@ -496,14 +498,16 @@ def cron(**options: Any) -> None:
496498

497499
from sentry.celery import app
498500

499-
old_schedule = app.conf.CELERYBEAT_SCHEDULE
500-
new_schedule = {}
501-
task_schedules = set(featureflags.get("taskworker.scheduler.rollout", []))
502-
for key, schedule_data in old_schedule.items():
503-
if key not in task_schedules:
504-
new_schedule[key] = schedule_data
501+
schedule = app.conf.CELERYBEAT_SCHEDULE
502+
if runtime_options.get("taskworker.enabled"):
503+
click.secho(
504+
"You have `taskworker.enabled` active, run `sentry run taskworker-scheduler` instead.",
505+
fg="yellow",
506+
)
507+
click.secho("Ignoring all schedules in settings.CELERYBEAT_SCHEDULE", fg="yellow")
508+
schedule = {}
505509

506-
app.conf.update(CELERYBEAT_SCHEDULE=new_schedule)
510+
app.conf.update(CELERYBEAT_SCHEDULE=schedule)
507511

508512
with managed_bgtasks(role="cron"):
509513
app.Beat(

0 commit comments

Comments
 (0)