Skip to content

Commit 2c2d0f8

Browse files
authored
šŸ› fixed storage broken dsm cleaner was removing files when uploading to directories (#4732)
1 parent 23dad29 commit 2c2d0f8

File tree

3 files changed

+23
-6
lines changed

3 files changed

+23
-6
lines changed

ā€Žservices/storage/src/simcore_service_storage/simcore_s3_dsm.pyā€Ž

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,7 @@ async def _clean_dangling_multipart_uploads(self):
839839
)
840840
if not current_multipart_uploads:
841841
return
842+
_logger.debug("found %s", f"{current_multipart_uploads=}")
842843

843844
# there are some multipart uploads, checking if
844845
# there is a counterpart in file_meta_data
@@ -861,6 +862,8 @@ async def _clean_dangling_multipart_uploads(self):
861862
] = await db_file_meta_data.list_fmds(
862863
conn, file_ids=list(set(directory_and_file_ids))
863864
)
865+
_logger.debug("metadata entries %s", f"{list_of_known_metadata_entries=}")
866+
864867
# known uploads do have an expiry date (regardless of upload ID that we do not always know)
865868
list_of_known_uploads = [
866869
fmd for fmd in list_of_known_metadata_entries if fmd.upload_expires_at
@@ -885,6 +888,7 @@ async def _clean_dangling_multipart_uploads(self):
885888
):
886889
list_of_valid_upload_ids.append(upload_id)
887890

891+
_logger.debug("found the following %s", f"{list_of_valid_upload_ids=}")
888892
list_of_invalid_uploads = [
889893
(
890894
upload_id,

ā€Žservices/storage/src/simcore_service_storage/simcore_s3_dsm_utils.pyā€Ž

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from contextlib import suppress
2+
from pathlib import Path
23

34
from aiohttp import web
45
from aiopg.sa.connection import SAConnection
@@ -66,7 +67,7 @@ def get_simcore_directory(file_id: SimcoreS3FileID) -> str:
6667
directory_id = SimcoreS3DirectoryID.from_simcore_s3_object(file_id)
6768
except ValueError:
6869
return ""
69-
return f"{directory_id}"
70+
return f"{Path(directory_id)}"
7071

7172

7273
async def get_directory_file_id(
@@ -96,7 +97,7 @@ async def _get_fmd(
9697
# could not extract a directory name from the provided path
9798
return None
9899

99-
directory_file_id = parse_obj_as(SimcoreS3FileID, directory_file_id_str.rstrip("/"))
100+
directory_file_id = parse_obj_as(SimcoreS3FileID, directory_file_id_str)
100101
directory_file_id_fmd = await _get_fmd(conn, directory_file_id)
101102

102103
return directory_file_id if directory_file_id_fmd else None

ā€Žservices/storage/tests/unit/test_dsm_dsmcleaner.pyā€Ž

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ def disabled_dsm_cleaner_task(monkeypatch: pytest.MonkeyPatch):
4343

4444
@pytest.fixture
4545
def simcore_directory_id(simcore_file_id: SimcoreS3FileID) -> SimcoreS3FileID:
46-
return SimcoreS3FileID(SimcoreS3DirectoryID.from_simcore_s3_object(simcore_file_id))
46+
return SimcoreS3FileID(
47+
Path(SimcoreS3DirectoryID.from_simcore_s3_object(simcore_file_id))
48+
)
4749

4850

4951
async def test_clean_expired_uploads_aborts_dangling_multipart_uploads(
@@ -83,8 +85,15 @@ async def test_clean_expired_uploads_aborts_dangling_multipart_uploads(
8385
[ByteSize(0), parse_obj_as(ByteSize, "10Mib"), parse_obj_as(ByteSize, "100Mib")],
8486
ids=byte_size_ids,
8587
)
86-
@pytest.mark.parametrize("link_type", [LinkType.S3, LinkType.PRESIGNED])
87-
@pytest.mark.parametrize("is_directory", [True, False])
88+
@pytest.mark.parametrize(
89+
"link_type, is_directory",
90+
[
91+
# NOTE: directories are handled only as LinkType.S3
92+
(LinkType.S3, True),
93+
(LinkType.S3, False),
94+
(LinkType.PRESIGNED, False),
95+
],
96+
)
8897
async def test_clean_expired_uploads_deletes_expired_pending_uploads(
8998
disabled_dsm_cleaner_task,
9099
aiopg_engine: Engine,
@@ -281,7 +290,10 @@ async def test_clean_expired_uploads_does_not_clean_multipart_upload_on_creation
281290
FILES_IN_DIR: Final[int] = 5
282291

283292
file_ids_to_upload: set[SimcoreS3FileID] = (
284-
{SimcoreS3FileID(f"{file_or_directory_id}file{x}") for x in range(FILES_IN_DIR)}
293+
{
294+
SimcoreS3FileID(f"{file_or_directory_id}/file{x}")
295+
for x in range(FILES_IN_DIR)
296+
}
285297
if is_directory
286298
else {simcore_file_id}
287299
)

0 commit comments

Comments
Ā (0)