Package files are not deleted when a project is destroyed
Summary
Package files are not deleted when a project is destroyed.
This is related to #12581 (closed), which fixes the link between package and package files. But the link between project and package files (through packages) is not.
See also #14027 which need to be handled to remove the orphaned files.
(NB: found while implementing !44746 (closed)).
Steps to reproduce
I think this bug should be reopened, because package files are not deleted when project is deleted:
[13] pry(main)> pf = Packages::PackageFile.first
Packages::PackageFile Load (1.1ms) SELECT "packages_package_files".* FROM "packages_package_files" ORDER BY "packages_package_files"."id" ASC LIMIT 1
=> #<Packages::PackageFile:0x000055b61c1cac78
id: 1,
package_id: 1,
created_at: Fri, 27 Nov 2020 13:57:36 UTC +00:00,
updated_at: Fri, 27 Nov 2020 13:57:36 UTC +00:00,
size: 8,
file_store: 1,
file_md5: nil,
file_sha1: "f572d396fae9206628714fb2ce00f72e94f2258f",
file_name: "@google/npm_package_24775855140b6e02fde0ce4eb06e61f8-1.12.0.tgz",
file: "@google/npm_package_24775855140b6e02fde0ce4eb06e61f8-1.12.0.tgz",
file_sha256: nil,
verification_retry_at: nil,
verified_at: nil,
verification_failure: nil,
verification_retry_count: nil,
verification_checksum: nil,
verification_state: 0,
verification_started_at: nil>
[20] pry(main)> pf.file.path
=> "/home/mathieu/git/gitlab.com/gitlab-org/gitlab-development-kit/gitlab/shared/packages/2c/62/2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3/packages/1/files/1/@google/npm_package_24775855140b6e02fde0ce4eb06e61f8-1.12.0.tgz"
[21] pry(main)> pf.package.project.destroy!
(0.3ms) BEGIN
(11.4ms) SELECT "ci_build_trace_chunks"."build_id", "ci_build_trace_chunks"."chunk_index" FROM "ci_build_trace_chunks" INNER JOIN "ci_builds" ON "ci_build_trace_chunks"."build_id" = "ci_builds"."id" WHERE "ci_builds"."type" = 'Ci::Build' AND "ci_builds"."project_id" = 8 AND "ci_build_trace_chunks"."data_store" = 1
Upload Load (3.6ms) SELECT "uploads".* FROM "uploads" WHERE "uploads"."model_id" = 8 AND "uploads"."model_type" = 'Project' AND "uploads"."uploader" IN ('PersonalFileUploader', 'NamespaceFileUploader', 'FileUploader') AND "uploads"."store" = 1 ORDER BY "uploads"."id" ASC LIMIT 1000
Route Destroy (1.1ms) DELETE FROM "routes" WHERE "routes"."id" = 36
RedirectRoute Load (1.7ms) SELECT "redirect_routes".* FROM "redirect_routes" WHERE "redirect_routes"."source_id" = 8 AND "redirect_routes"."source_type" = 'Project'
Upload Destroy (0.5ms) DELETE FROM "uploads" WHERE "uploads"."model_id" = 8 AND "uploads"."model_type" = 'Project' AND "uploads"."uploader" IN ('PersonalFileUploader', 'NamespaceFileUploader', 'FileUploader')
DeployKey Destroy (13.4ms) DELETE FROM "keys" WHERE "keys"."id" IN (SELECT "keys"."id" FROM "keys" INNER JOIN "deploy_keys_projects" ON "keys"."id" = "deploy_keys_projects"."deploy_key_id" WHERE "keys"."type" = 'DeployKey' AND "deploy_keys_projects"."project_id" = 8 AND "keys"."public" = FALSE AND ( NOT EXISTS (
SELECT 1
FROM deploy_keys_projects dkp2
WHERE dkp2.deploy_key_id = deploy_keys_projects.deploy_key_id
AND dkp2.project_id != deploy_keys_projects.project_id
)
))
ActsAsTaggableOn::Tagging Load (4.7ms) SELECT "taggings".* FROM "taggings" WHERE "taggings"."taggable_id" = 8 AND "taggings"."taggable_type" = 'Project'
ActsAsTaggableOn::Tagging Load (0.8ms) SELECT "taggings".* FROM "taggings" WHERE "taggings"."taggable_id" = 8 AND "taggings"."taggable_type" = 'Project' AND "taggings"."context" = 'tags' ORDER BY taggings.id
ImportExportUpload Load (4.2ms) SELECT "import_export_uploads".* FROM "import_export_uploads" WHERE "import_export_uploads"."project_id" = 8 LIMIT 1
ProjectMember Destroy (8.8ms) DELETE FROM "members" WHERE "members"."type" = 'ProjectMember' AND "members"."source_id" = 8 AND "members"."source_type" = 'Project' AND "members"."requested_at" IS NULL
ProjectMember Destroy (0.4ms) DELETE FROM "members" WHERE "members"."type" = 'ProjectMember' AND "members"."source_id" = 8 AND "members"."source_type" = 'Project' AND "members"."requested_at" IS NOT NULL
LfsObjectsProject Load (2.7ms) SELECT "lfs_objects_projects".* FROM "lfs_objects_projects" WHERE "lfs_objects_projects"."project_id" = 8
NotificationSetting Destroy (5.2ms) DELETE FROM "notification_settings" WHERE "notification_settings"."source_id" = 8 AND "notification_settings"."source_type" = 'Project'
ContainerRepository Load (2.5ms) SELECT "container_repositories".* FROM "container_repositories" WHERE "container_repositories"."project_id" = 8
Ci::Build Load (4.7ms) SELECT "ci_builds".* FROM "ci_builds" WHERE "ci_builds"."type" = 'Ci::Build' AND "ci_builds"."project_id" = 8
ProjectCiCdSetting Load (4.3ms) SELECT "project_ci_cd_settings".* FROM "project_ci_cd_settings" WHERE "project_ci_cd_settings"."project_id" = 8 LIMIT 1
ProjectCiCdSetting Destroy (0.5ms) DELETE FROM "project_ci_cd_settings" WHERE "project_ci_cd_settings"."id" = 8
PagesDeployment Load (2.6ms) SELECT "pages_deployments".* FROM "pages_deployments" WHERE "pages_deployments"."project_id" = 8
ProductAnalyticsEvent Load (106.8ms) SELECT "product_analytics_events_experimental".* FROM "product_analytics_events_experimental" WHERE "product_analytics_events_experimental"."project_id" = 8
Approver Load (2.5ms) SELECT "approvers".* FROM "approvers" WHERE "approvers"."target_id" = 8 AND "approvers"."target_type" = 'Project'
ApproverGroup Load (1.9ms) SELECT "approver_groups".* FROM "approver_groups" WHERE "approver_groups"."target_id" = 8 AND "approver_groups"."target_type" = 'Project'
Project Destroy (553.0ms) DELETE FROM "projects" WHERE "projects"."id" = 8
(18.2ms) COMMIT
ApplicationSetting Load (2.6ms) SELECT "application_settings".* FROM "application_settings" ORDER BY "application_settings"."id" DESC LIMIT 1
License Load (0.9ms) SELECT "licenses".* FROM "licenses" ORDER BY "licenses"."id" DESC LIMIT 100
Namespace Load (1.4ms) SELECT "namespaces".* FROM "namespaces" WHERE "namespaces"."id" = 28 LIMIT 1
Route Load (0.9ms) SELECT "routes".* FROM "routes" WHERE "routes"."source_id" = 28 AND "routes"."source_type" = 'Namespace' LIMIT 1
=> #<Project id:8 google/material-design-lite>>
$ md5sum /home/mathieu/git/gitlab.com/gitlab-org/gitlab-development-kit/gitlab/shared/packages/2c/62/2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3/packages/1/files/1/@google/npm_package_24775855140b6e02fde0ce4eb06e61f8-1.12.0.tgz
b1946ac92492d2347c6235b4d2611184 /home/mathieu/git/gitlab.com/gitlab-org/gitlab-development-kit/gitlab/shared/packages/2c/62/2c624232cdd221771294dfbb310aca000a0df6ac8b66b696d90ef06fdefb64a3/packages/1/files/1/@google/npm_package_24775855140b6e02fde0ce4eb06e61f8-1.12.0.tgz
See also related #14027.
Possible fixes
Use FastDestroyAll
with use_fast_destroy :packages
?