Add a script for deleting the old temporary access tokens in small batches.
This commit is contained in:
		
							parent
							
								
									291c1c810b
								
							
						
					
					
						commit
						3bbe064291
					
				
					 1 changed files with 48 additions and 0 deletions
				
			
		
							
								
								
									
										48
									
								
								util/delete_access_tokens.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								util/delete_access_tokens.py
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,48 @@ | ||||||
|  | import logging | ||||||
|  | import time | ||||||
|  | 
 | ||||||
|  | from datetime import datetime, timedelta | ||||||
|  | 
 | ||||||
|  | from data.database import RepositoryBuild, AccessToken | ||||||
|  | from app import app | ||||||
|  | 
 | ||||||
|  | logger = logging.getLogger(__name__) | ||||||
|  | 
 | ||||||
|  | BATCH_SIZE = 5000 | ||||||
|  | 
 | ||||||
|  | def delete_temporary_access_tokens(older_than): | ||||||
|  |   # Find the higest ID up to which we should delete | ||||||
|  |   up_to_id = (AccessToken | ||||||
|  |               .select(AccessToken.id) | ||||||
|  |               .where(AccessToken.created < older_than) | ||||||
|  |               .limit(1) | ||||||
|  |               .order_by(AccessToken.id.desc()) | ||||||
|  |               .get().id) | ||||||
|  |   logger.debug('Deleting temporary access tokens with ids lower than: %s', up_to_id) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   access_tokens_in_builds = (RepositoryBuild.select(RepositoryBuild.access_token).distinct()) | ||||||
|  | 
 | ||||||
|  |   while up_to_id > 0: | ||||||
|  |     starting_at_id = max(up_to_id - BATCH_SIZE, 0) | ||||||
|  |     logger.debug('Deleting tokens with ids between %s and %s', starting_at_id, up_to_id) | ||||||
|  |     start_time = datetime.utcnow() | ||||||
|  |     (AccessToken | ||||||
|  |      .delete() | ||||||
|  |      .where(AccessToken.id > starting_at_id, | ||||||
|  |             AccessToken.id < up_to_id, | ||||||
|  |             AccessToken.temporary == 1, | ||||||
|  |             ~(AccessToken.id << access_tokens_in_builds)) | ||||||
|  |      .execute()) | ||||||
|  | 
 | ||||||
|  |     time_to_delete = datetime.utcnow() - start_time | ||||||
|  | 
 | ||||||
|  |     up_to_id -= BATCH_SIZE | ||||||
|  | 
 | ||||||
|  |     logger.debug('Sleeping for %s seconds', time_to_delete.total_seconds()) | ||||||
|  |     time.sleep(time_to_delete.total_seconds()) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | if __name__ == '__main__': | ||||||
|  |   logging.basicConfig(level=logging.DEBUG) | ||||||
|  |   delete_temporary_access_tokens(datetime.utcnow() - timedelta(days=2)) | ||||||
		Reference in a new issue