File tree Expand file tree Collapse file tree 3 files changed +26
-4
lines changed Expand file tree Collapse file tree 3 files changed +26
-4
lines changed Original file line number Diff line number Diff line change @@ -84,10 +84,16 @@ def get_all_expired(self, expires):
84
84
"""Get all expired results."""
85
85
return self .filter (date_done__lt = now () - maybe_timedelta (expires ))
86
86
87
- def delete_expired (self , expires ):
87
+ def delete_expired (self , expires , batch_size = 100000 ):
88
88
"""Delete all expired results."""
89
- with transaction .atomic (using = self .db ):
90
- self .get_all_expired (expires ).delete ()
89
+ qs = self .get_all_expired (expires ).order_by ("id" )
90
+
91
+ while True :
92
+ ids = list (qs .values_list ("id" , flat = True )[:batch_size ])
93
+ if not ids :
94
+ break
95
+ with transaction .atomic (using = self .db ):
96
+ self .filter (id__in = ids ).delete ()
91
97
92
98
93
99
class TaskResultManager (ResultManager ):
Original file line number Diff line number Diff line change @@ -67,4 +67,4 @@ def test_taskresult_delete_expired(self):
67
67
'setup time: {setup:.2f}\n '
68
68
'bench time: {bench:.2f}\n '
69
69
).format (setup = after_setup - start , bench = done - after_setup ))
70
- assert self .benchmark .stats .stats .max < 1
70
+ assert self .benchmark .stats .stats .max < 5
Original file line number Diff line number Diff line change @@ -210,6 +210,22 @@ class TransactionError(Exception):
210
210
except TransactionError :
211
211
pass
212
212
213
+ def test_result_batch_deletion (self ):
214
+ # Create 200 expired records
215
+ TaskResult .objects .bulk_create (
216
+ [
217
+ TaskResult (task_id = uuid (), date_done = now () - timedelta (days = 1 ))
218
+ for i in range (200 )
219
+ ]
220
+ )
221
+ assert TaskResult .objects .get_all_expired (0 ).count () == 200
222
+
223
+ # Run deletion in small batches
224
+ TaskResult .objects .delete_expired (0 , batch_size = 25 )
225
+
226
+ # All expired records should be gone
227
+ assert TaskResult .objects .get_all_expired (0 ).count () == 0
228
+
213
229
214
230
@pytest .mark .usefixtures ('depends_on_current_app' )
215
231
class test_ModelsWithoutDefaultDB (TransactionTestCase ):
You can’t perform that action at this time.
0 commit comments