Skip to content

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 (closed) 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 (closed).

Possible fixes

Use FastDestroyAll with use_fast_destroy :packages?