From 428de17817094985f2c066cf983759391302acd9 Mon Sep 17 00:00:00 2001 From: Eliot Berriot Date: Fri, 28 Sep 2018 21:30:45 +0200 Subject: [PATCH] Ensure cache_cleaning only targets remote files --- api/funkwhale_api/federation/tasks.py | 9 ++++++--- api/tests/federation/test_tasks.py | 7 +++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/api/funkwhale_api/federation/tasks.py b/api/funkwhale_api/federation/tasks.py index e5409dd3b..5b58aaee4 100644 --- a/api/funkwhale_api/federation/tasks.py +++ b/api/funkwhale_api/federation/tasks.py @@ -29,7 +29,8 @@ def clean_music_cache(): candidates = ( music_models.Upload.objects.filter( Q(audio_file__isnull=False) - & (Q(accessed_date__lt=limit) | Q(accessed_date=None)) + & (Q(accessed_date__lt=limit) | Q(accessed_date=None)), + # library__actor__user=None, ) .local(False) .exclude(audio_file="") @@ -55,8 +56,10 @@ def get_files(storage, *parts): """ if not parts: raise ValueError("Missing path") - - dirs, files = storage.listdir(os.path.join(*parts)) + try: + dirs, files = storage.listdir(os.path.join(*parts)) + except FileNotFoundError: + return [] for dir in dirs: files += get_files(storage, *(list(parts) + [dir])) return [os.path.join(parts[-1], path) for path in files] diff --git a/api/tests/federation/test_tasks.py b/api/tests/federation/test_tasks.py index 1394b4e9b..65eb7f93f 100644 --- a/api/tests/federation/test_tasks.py +++ b/api/tests/federation/test_tasks.py @@ -19,22 +19,29 @@ def test_clean_federation_music_cache_if_no_listen(preferences, factories): accessed_date=timezone.now() - datetime.timedelta(minutes=61), ) upload3 = factories["music.Upload"](library=remote_library, accessed_date=None) + # local upload, should not be cleaned + upload4 = factories["music.Upload"](library__actor__local=True, accessed_date=None) + path1 = upload1.audio_file.path path2 = upload2.audio_file.path path3 = upload3.audio_file.path + path4 = upload4.audio_file.path tasks.clean_music_cache() upload1.refresh_from_db() upload2.refresh_from_db() upload3.refresh_from_db() + upload4.refresh_from_db() assert bool(upload1.audio_file) is True assert bool(upload2.audio_file) is False assert bool(upload3.audio_file) is False + assert bool(upload4.audio_file) is True assert os.path.exists(path1) is True assert os.path.exists(path2) is False assert os.path.exists(path3) is False + assert os.path.exists(path4) is True def test_clean_federation_music_cache_orphaned(settings, preferences, factories):