Files
sentinel/bin/invalidate-project-configs
2024-02-15 17:01:50 +00:00

46 lines
1.6 KiB
Python
Executable File

#!/usr/bin/env python
import click
from sentry.runner import configure
def validate_percentage(ctx, param, value):
if 1 <= value <= 100:
return value
raise click.BadParameter("percentage must be integer between 1 and 100")
@click.command()
@click.option(
"--percentage",
callback=validate_percentage,
default=100,
help="Percentage of orgs to invalidate. Only useful for testing this command.",
)
def invalidate_project_configs(percentage):
"""Gradually evict existing project configs from redis and recompute them.
This can be used to speed up incident recovery, for example when faulty project configs
that cannot be read by Relay have been written to redis.
NOTE: This will increase load on the relay_config_bulk Celery queue.
"""
configure()
from sentry.models.organization import Organization
from sentry.tasks.relay import schedule_invalidate_project_config
from sentry.utils.query import RangeQuerySetWrapperWithProgressBar
# NOTE: Instead of iterating over all projects, we could use redis.scan_iter()
# to evict only project configs that exist in redis.
queryset = Organization.objects.all().values_list("id", flat=True)
click.echo(f"Invalidating project configs for {percentage}% of orgs...")
for org_id in RangeQuerySetWrapperWithProgressBar(queryset, result_value_getter=lambda x: x):
if (org_id % 100) < percentage:
schedule_invalidate_project_config(
trigger="invalidate-all-orgs", organization_id=org_id, countdown=0
)
if __name__ == "__main__":
invalidate_project_configs()