Skip to content

Commit 7f214fe

Browse files
committed
Clean storage paths when a version is inactive
1 parent 8ab13f4 commit 7f214fe

File tree

3 files changed

+41
-13
lines changed

3 files changed

+41
-13
lines changed

readthedocs/builds/models.py

+7-3
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,11 @@ def save(self, *args, **kwargs): # pylint: disable=arguments-differ
322322
task=tasks.symlink_project,
323323
args=[self.project.pk],
324324
)
325+
326+
# These resources are not used when a version is inactive
327+
if not self.active:
328+
tasks.clean_project_resources(self.project, self)
329+
325330
return obj
326331

327332
def delete(self, *args, **kwargs): # pylint: disable=arguments-differ
@@ -333,10 +338,9 @@ def delete(self, *args, **kwargs): # pylint: disable=arguments-differ
333338
args=[self.get_artifact_paths()],
334339
)
335340

336-
# Remove build artifacts from storage if the version is not external
341+
# Remove resources if the version is not external
337342
if self.type != EXTERNAL:
338-
storage_paths = self.get_storage_paths()
339-
tasks.remove_build_storage_paths.delay(storage_paths)
343+
tasks.clean_project_resources(self.project, self)
340344

341345
project_pk = self.project.pk
342346
super().delete(*args, **kwargs)

readthedocs/projects/models.py

+14-10
Original file line numberDiff line numberDiff line change
@@ -480,16 +480,7 @@ def delete(self, *args, **kwargs): # pylint: disable=arguments-differ
480480
args=[(self.doc_path,)],
481481
)
482482

483-
# Remove build artifacts from storage
484-
storage_paths = []
485-
for type_ in MEDIA_TYPES:
486-
storage_paths.append(
487-
'{}/{}'.format(
488-
type_,
489-
self.slug,
490-
)
491-
)
492-
tasks.remove_build_storage_paths.delay(storage_paths)
483+
tasks.clean_project_resources(self)
493484

494485
super().delete(*args, **kwargs)
495486

@@ -534,6 +525,19 @@ def get_subproject_urls(self):
534525
return [(proj.child.slug, proj.child.get_docs_url())
535526
for proj in self.subprojects.all()]
536527

528+
def get_storage_paths(self):
529+
"""
530+
Get the paths of all artifacts used by the project.
531+
532+
:return: the path to an item in storage
533+
(can be used with ``storage.url`` to get the URL).
534+
"""
535+
storage_paths = [
536+
f'{type_}/{self.slug}'
537+
for type_ in MEDIA_TYPES
538+
]
539+
return storage_paths
540+
537541
def get_storage_path(
538542
self,
539543
type_,

readthedocs/projects/tasks.py

+20
Original file line numberDiff line numberDiff line change
@@ -1844,6 +1844,26 @@ def remove_build_storage_paths(paths):
18441844
storage.delete_directory(storage_path)
18451845

18461846

1847+
def clean_project_resources(project, version=None):
1848+
"""
1849+
Delete all extra resources used by `version` of `project`.
1850+
1851+
It removes:
1852+
1853+
- Artifacts from storage.
1854+
- Search indexes from ES.
1855+
1856+
:param version: Version instance. if isn't given,
1857+
all resources of `project` will be deleted.
1858+
"""
1859+
storage_paths = []
1860+
if version:
1861+
version.get_storage_paths()
1862+
else:
1863+
storage_paths = project.get_storage_paths()
1864+
remove_build_storage_paths.delay(storage_paths)
1865+
1866+
18471867
@app.task(queue='web')
18481868
def sync_callback(_, version_pk, commit, build, *args, **kwargs):
18491869
"""

0 commit comments

Comments
 (0)