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):
8484 """Get all expired results."""
8585 return self .filter (date_done__lt = now () - maybe_timedelta (expires ))
8686
87- def delete_expired (self , expires ):
87+ def delete_expired (self , expires , batch_size = 100000 ):
8888 """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 ()
9197
9298
9399class TaskResultManager (ResultManager ):
Original file line number Diff line number Diff line change @@ -67,4 +67,4 @@ def test_taskresult_delete_expired(self):
6767 'setup time: {setup:.2f}\n '
6868 'bench time: {bench:.2f}\n '
6969 ).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):
210210 except TransactionError :
211211 pass
212212
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+
213229
214230@pytest .mark .usefixtures ('depends_on_current_app' )
215231class test_ModelsWithoutDefaultDB (TransactionTestCase ):
You can’t perform that action at this time.
0 commit comments