73
73
74
74
ONE_HOUR = 60 * 60 * 1000
75
75
ONE_DAY = 24 * ONE_HOUR
76
+ IMAGE_CACHE_EXPIRY_MS = 2 * ONE_DAY
76
77
77
78
78
79
@attr .s (slots = True , frozen = True , auto_attribs = True )
@@ -496,6 +497,27 @@ async def _expire_url_cache_data(self) -> None:
496
497
logger .info ("Still running DB updates; skipping expiry" )
497
498
return
498
499
500
+ def try_remove_parent_dirs (dirs : Iterable [str ]) -> None :
501
+ """Attempt to remove the given chain of parent directories
502
+
503
+ Args:
504
+ dirs: The list of directory paths to delete, with children appearing
505
+ before their parents.
506
+ """
507
+ for dir in dirs :
508
+ try :
509
+ os .rmdir (dir )
510
+ except FileNotFoundError :
511
+ # Already deleted, continue with deleting the rest
512
+ pass
513
+ except OSError as e :
514
+ # Failed, skip deleting the rest of the parent dirs
515
+ if e .errno != errno .ENOTEMPTY :
516
+ logger .warning (
517
+ "Failed to remove media directory: %r: %s" , dir , e
518
+ )
519
+ break
520
+
499
521
# First we delete expired url cache entries
500
522
media_ids = await self .store .get_expired_url_cache (now )
501
523
@@ -504,20 +526,16 @@ async def _expire_url_cache_data(self) -> None:
504
526
fname = self .filepaths .url_cache_filepath (media_id )
505
527
try :
506
528
os .remove (fname )
529
+ except FileNotFoundError :
530
+ pass # If the path doesn't exist, meh
507
531
except OSError as e :
508
- # If the path doesn't exist, meh
509
- if e .errno != errno .ENOENT :
510
- logger .warning ("Failed to remove media: %r: %s" , media_id , e )
511
- continue
532
+ logger .warning ("Failed to remove media: %r: %s" , media_id , e )
533
+ continue
512
534
513
535
removed_media .append (media_id )
514
536
515
- try :
516
- dirs = self .filepaths .url_cache_filepath_dirs_to_delete (media_id )
517
- for dir in dirs :
518
- os .rmdir (dir )
519
- except Exception :
520
- pass
537
+ dirs = self .filepaths .url_cache_filepath_dirs_to_delete (media_id )
538
+ try_remove_parent_dirs (dirs )
521
539
522
540
await self .store .delete_url_cache (removed_media )
523
541
@@ -530,44 +548,38 @@ async def _expire_url_cache_data(self) -> None:
530
548
# These may be cached for a bit on the client (i.e., they
531
549
# may have a room open with a preview url thing open).
532
550
# So we wait a couple of days before deleting, just in case.
533
- expire_before = now - 2 * ONE_DAY
551
+ expire_before = now - IMAGE_CACHE_EXPIRY_MS
534
552
media_ids = await self .store .get_url_cache_media_before (expire_before )
535
553
536
554
removed_media = []
537
555
for media_id in media_ids :
538
556
fname = self .filepaths .url_cache_filepath (media_id )
539
557
try :
540
558
os .remove (fname )
559
+ except FileNotFoundError :
560
+ pass # If the path doesn't exist, meh
541
561
except OSError as e :
542
- # If the path doesn't exist, meh
543
- if e .errno != errno .ENOENT :
544
- logger .warning ("Failed to remove media: %r: %s" , media_id , e )
545
- continue
562
+ logger .warning ("Failed to remove media: %r: %s" , media_id , e )
563
+ continue
546
564
547
- try :
548
- dirs = self .filepaths .url_cache_filepath_dirs_to_delete (media_id )
549
- for dir in dirs :
550
- os .rmdir (dir )
551
- except Exception :
552
- pass
565
+ dirs = self .filepaths .url_cache_filepath_dirs_to_delete (media_id )
566
+ try_remove_parent_dirs (dirs )
553
567
554
568
thumbnail_dir = self .filepaths .url_cache_thumbnail_directory (media_id )
555
569
try :
556
570
shutil .rmtree (thumbnail_dir )
571
+ except FileNotFoundError :
572
+ pass # If the path doesn't exist, meh
557
573
except OSError as e :
558
- # If the path doesn't exist, meh
559
- if e .errno != errno .ENOENT :
560
- logger .warning ("Failed to remove media: %r: %s" , media_id , e )
561
- continue
574
+ logger .warning ("Failed to remove media: %r: %s" , media_id , e )
575
+ continue
562
576
563
577
removed_media .append (media_id )
564
578
565
- try :
566
- dirs = self .filepaths .url_cache_thumbnail_dirs_to_delete (media_id )
567
- for dir in dirs :
568
- os .rmdir (dir )
569
- except Exception :
570
- pass
579
+ dirs = self .filepaths .url_cache_thumbnail_dirs_to_delete (media_id )
580
+ # Note that one of the directories to be deleted has already been
581
+ # removed by the `rmtree` above.
582
+ try_remove_parent_dirs (dirs )
571
583
572
584
await self .store .delete_url_cache_media (removed_media )
573
585
0 commit comments