11import os
2- from collections import defaultdict
32
4- from more_itertools import flatten
5-
6- from sentry import eventstore , eventstream , models , nodestore
3+ from sentry import eventstore , models , nodestore
74from sentry .eventstore .models import Event
85
96from ..base import BaseDeletionTask , BaseRelation , ModelDeletionTask , ModelRelation
@@ -47,11 +44,11 @@ class EventDataDeletionTask(BaseDeletionTask):
4744 Deletes nodestore data, EventAttachment and UserReports for group
4845 """
4946
50- # Number of events fetched from eventstore per chunk() call.
5147 DEFAULT_CHUNK_SIZE = 10000
5248
53- def __init__ (self , manager , groups , ** kwargs ):
54- self .groups = groups
49+ def __init__ (self , manager , group_id , project_id , ** kwargs ):
50+ self .group_id = group_id
51+ self .project_id = project_id
5552 self .last_event = None
5653 super ().__init__ (manager , ** kwargs )
5754
@@ -68,77 +65,58 @@ def chunk(self):
6865 ]
6966 )
7067
71- project_groups = defaultdict (list )
72- for group in self .groups :
73- project_groups [group .project_id ].append (group .id )
74-
75- project_ids = list (project_groups .keys ())
76- group_ids = list (flatten (project_groups .values ()))
77-
7868 events = eventstore .get_unfetched_events (
7969 filter = eventstore .Filter (
80- conditions = conditions , project_ids = project_ids , group_ids = group_ids
70+ conditions = conditions , project_ids = [ self . project_id ] , group_ids = [ self . group_id ]
8171 ),
8272 limit = self .DEFAULT_CHUNK_SIZE ,
8373 referrer = "deletions.group" ,
8474 orderby = ["-timestamp" , "-event_id" ],
8575 )
76+
8677 if not events :
87- # Remove all group events now that their node data has been removed.
88- for project_id , group_ids in project_groups .items ():
89- eventstream_state = eventstream .start_delete_groups (project_id , group_ids )
90- eventstream .end_delete_groups (eventstream_state )
9178 return False
9279
9380 self .last_event = events [- 1 ]
9481
9582 # Remove from nodestore
96- node_ids = [Event .generate_node_id (event .project_id , event .event_id ) for event in events ]
83+ node_ids = [Event .generate_node_id (self .project_id , event .event_id ) for event in events ]
9784 nodestore .delete_multi (node_ids )
9885
9986 # Remove EventAttachment and UserReport *again* as those may not have a
10087 # group ID, therefore there may be dangling ones after "regular" model
10188 # deletion.
10289 event_ids = [event .event_id for event in events ]
10390 models .EventAttachment .objects .filter (
104- event_id__in = event_ids , project_id__in = project_ids
91+ event_id__in = event_ids , project_id = self . project_id
10592 ).delete ()
10693 models .UserReport .objects .filter (
107- event_id__in = event_ids , project_id__in = project_ids
94+ event_id__in = event_ids , project_id = self . project_id
10895 ).delete ()
10996
11097 return True
11198
11299
113100class GroupDeletionTask (ModelDeletionTask ):
114- # Delete groups in blocks of 1000. Using 1000 aims to
115- # balance the number of snuba replacements with memory limits.
116- DEFAULT_CHUNK_SIZE = 1000
117-
118- def delete_bulk (self , instance_list ):
119- """
120- Group deletion operates as a quasi-bulk operation so that we don't flood
121- snuba replacements with deletions per group.
122- """
123- self .mark_deletion_in_progress (instance_list )
101+ def get_child_relations (self , instance ):
102+ relations = []
124103
125- group_ids = [group .id for group in instance_list ]
126-
127- # Remove child relations for all groups first.
128- child_relations = []
129- for model in _GROUP_RELATED_MODELS :
130- child_relations .append (ModelRelation (model , {"group_id__in" : group_ids }))
104+ relations .extend (
105+ [ModelRelation (m , {"group_id" : instance .id }) for m in _GROUP_RELATED_MODELS ]
106+ )
131107
132- # If this isn't a retention cleanup also remove event data.
108+ # Skip EventDataDeletionTask if this is being called from cleanup.py
133109 if not os .environ .get ("_SENTRY_CLEANUP" ):
134- child_relations .append (
135- BaseRelation (params = {"groups" : instance_list }, task = EventDataDeletionTask )
110+ relations .extend (
111+ [
112+ BaseRelation (
113+ {"group_id" : instance .id , "project_id" : instance .project_id },
114+ EventDataDeletionTask ,
115+ )
116+ ]
136117 )
137118
138- self .delete_children (child_relations )
139-
140- # Remove group objects with children removed.
141- return self .delete_instance_bulk (instance_list )
119+ return relations
142120
143121 def delete_instance (self , instance ):
144122 from sentry import similarity
0 commit comments