123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- #!/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()
|