From fb0a9754bcaa43fe5cffdabb8e6e74a275d7c5bf Mon Sep 17 00:00:00 2001 From: "Armen Zambrano G." <44410+armenzg@users.noreply.github.com> Date: Thu, 6 Nov 2025 10:41:16 -0500 Subject: [PATCH 1/3] chore(deletions): Remove option This was added in #102811 and we don't need anymore. --- src/sentry/deletions/defaults/group.py | 13 +------------ src/sentry/options/defaults.py | 6 ------ 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/src/sentry/deletions/defaults/group.py b/src/sentry/deletions/defaults/group.py index 198180b9ba3642..be12ae725e963a 100644 --- a/src/sentry/deletions/defaults/group.py +++ b/src/sentry/deletions/defaults/group.py @@ -21,7 +21,6 @@ from typing import Any from sentry import models, options -from sentry.db.models.base import Model from sentry.deletions.tasks.nodestore import delete_events_for_groups_from_nodestore_and_eventstore from sentry.issues.grouptype import GroupCategory, InvalidGroupTypeError from sentry.models.group import Group, GroupStatus @@ -96,16 +95,6 @@ _GROUP_RELATED_MODELS = DIRECT_GROUP_RELATED_MODELS + ADDITIONAL_GROUP_RELATED_MODELS -def get_group_related_models() -> Sequence[type[Model]]: - """ - Returns the tuple of models related to groups that should be deleted. - Checks options at runtime to allow dynamic configuration. - """ - if options.get("deletions.activity.delete-in-bulk"): - return _GROUP_RELATED_MODELS + (models.Activity,) - return _GROUP_RELATED_MODELS - - class EventsBaseDeletionTask(BaseDeletionTask[Group]): """ Base class to delete events associated to groups and its related models. @@ -217,7 +206,7 @@ def _delete_children(self, instance_list: Sequence[Group]) -> None: group_ids = [group.id for group in instance_list] # Remove child relations for all groups first. child_relations: list[BaseRelation] = [] - for model in get_group_related_models(): + for model in _GROUP_RELATED_MODELS: child_relations.append(ModelRelation(model, {"group_id__in": group_ids})) error_groups, issue_platform_groups = separate_by_group_category(instance_list) diff --git a/src/sentry/options/defaults.py b/src/sentry/options/defaults.py index 314b707b937586..e5ce0b61780f23 100644 --- a/src/sentry/options/defaults.py +++ b/src/sentry/options/defaults.py @@ -354,12 +354,6 @@ type=Bool, flags=FLAG_AUTOMATOR_MODIFIABLE, ) -register( - "deletions.activity.delete-in-bulk", - default=False, - type=Bool, - flags=FLAG_AUTOMATOR_MODIFIABLE, -) register( "cleanup.abort_execution", From c36ad8a136a23a6cfbfe312bd2736e6b662dc3c6 Mon Sep 17 00:00:00 2001 From: "Armen Zambrano G." <44410+armenzg@users.noreply.github.com> Date: Thu, 6 Nov 2025 13:50:35 -0500 Subject: [PATCH 2/3] Move activity to the right place --- src/sentry/deletions/defaults/group.py | 1 + src/sentry/reprocessing2.py | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/sentry/deletions/defaults/group.py b/src/sentry/deletions/defaults/group.py index be12ae725e963a..fdbe78228b28a1 100644 --- a/src/sentry/deletions/defaults/group.py +++ b/src/sentry/deletions/defaults/group.py @@ -75,6 +75,7 @@ models.GroupEmailThread, models.GroupSubscription, models.GroupReaction, + models.Activity, RuleFireHistory, ) diff --git a/src/sentry/reprocessing2.py b/src/sentry/reprocessing2.py index 10956355f7685f..a6a3b8233ed2a8 100644 --- a/src/sentry/reprocessing2.py +++ b/src/sentry/reprocessing2.py @@ -114,12 +114,10 @@ # Group-related models are only a few per-group and are migrated at # once. -GROUP_MODELS_TO_MIGRATE_RAW = DIRECT_GROUP_RELATED_MODELS + (models.Activity,) - # If we were to move groupinbox to the new, empty group, inbox would show the # empty, unactionable group while it is reprocessing. Let post-process take # care of assigning GroupInbox like normally. -GROUP_MODELS_TO_MIGRATE = tuple(x for x in GROUP_MODELS_TO_MIGRATE_RAW if x != models.GroupInbox) +GROUP_MODELS_TO_MIGRATE = tuple(x for x in DIRECT_GROUP_RELATED_MODELS if x != models.GroupInbox) # Event attachments and group reports are per-event. This means that: # From 28be9dbf30e8f3ef130da188eec3202e5cd9ee48 Mon Sep 17 00:00:00 2001 From: "Armen Zambrano G." <44410+armenzg@users.noreply.github.com> Date: Thu, 6 Nov 2025 14:07:40 -0500 Subject: [PATCH 3/3] Add tests --- tests/sentry/deletions/test_group.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/sentry/deletions/test_group.py b/tests/sentry/deletions/test_group.py index 124ab819615883..b348e98983e787 100644 --- a/tests/sentry/deletions/test_group.py +++ b/tests/sentry/deletions/test_group.py @@ -12,6 +12,7 @@ from sentry.deletions.tasks.groups import delete_groups_for_project from sentry.issues.grouptype import GroupCategory from sentry.issues.issue_occurrence import IssueOccurrence +from sentry.models.activity import Activity from sentry.models.eventattachment import EventAttachment from sentry.models.group import Group from sentry.models.groupassignee import GroupAssignee @@ -26,6 +27,7 @@ from sentry.snuba.referrer import Referrer from sentry.testutils.cases import SnubaTestCase, TestCase from sentry.testutils.helpers.datetime import before_now +from sentry.types.activity import ActivityType from sentry.utils.snuba import bulk_snuba_queries from tests.sentry.issues.test_utils import OccurrenceTestMixin @@ -62,6 +64,9 @@ def _create_event_with_many_group_children(self) -> Event: GroupHash.objects.create(project=self.project, group=event.group, hash=uuid4().hex) GroupMeta.objects.create(group=event.group, key="foo", value="bar") GroupRedirect.objects.create(group_id=event.group.id, previous_group_id=1) + Activity.objects.create( + group=event.group, project=self.project, type=ActivityType.SET_RESOLVED.value + ) return event @@ -86,6 +91,7 @@ def test_delete_group_with_many_related_children(self) -> None: assert not UserReport.objects.filter(event_id=event.event_id).exists() assert not EventAttachment.objects.filter(event_id=event.event_id).exists() + assert not Activity.objects.filter(group_id=event.group.id).exists() assert not GroupRedirect.objects.filter(group_id=event.group.id).exists() assert not GroupHash.objects.filter(group_id=event.group.id).exists() assert not Group.objects.filter(id=event.group.id).exists()