Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Provaznik <jprovaznik@gitlab.com>2018-12-04 22:48:21 +0300
committerJan Provaznik <jprovaznik@gitlab.com>2018-12-07 00:00:19 +0300
commit9ccf8d032ff82841cdfe96e2abe4b1d317058244 (patch)
tree979a29a1ed7bc6cab4efb578d2b34daafe70f38e /app/models/concerns/with_uploads.rb
parent239fdc78b1ced1861cdcf00b8927963e30ef2095 (diff)
Enabled feature flag for fast deletions
Fast destroy is used only if the feature flag is enabled, otherwise uploads are still deleted using carrier wave. It's disabled by default.
Diffstat (limited to 'app/models/concerns/with_uploads.rb')
-rw-r--r--app/models/concerns/with_uploads.rb35
1 files changed, 34 insertions, 1 deletions
diff --git a/app/models/concerns/with_uploads.rb b/app/models/concerns/with_uploads.rb
index 50a9b19299a..761b40893b4 100644
--- a/app/models/concerns/with_uploads.rb
+++ b/app/models/concerns/with_uploads.rb
@@ -18,6 +18,7 @@
module WithUploads
extend ActiveSupport::Concern
include FastDestroyAll::Helpers
+ include FeatureGate
# Currently there is no simple way how to select only not-mounted
# uploads, it should be all FileUploaders so we select them by
@@ -26,12 +27,44 @@ module WithUploads
included do
has_many :uploads, as: :model
- has_many :file_uploads, -> { where(uploader: FILE_UPLOADERS) }, class_name: 'Upload', as: :model, dependent: :delete_all # rubocop:disable Cop/ActiveRecordDependent
+ has_many :file_uploads, -> { where(uploader: FILE_UPLOADERS) }, class_name: 'Upload', as: :model
+
+ # TODO: when feature flag is removed, we can use just dependent: destroy
+ # option on :file_uploads
+ before_destroy :remove_file_uploads
use_fast_destroy :file_uploads
end
+ def perform_fast_destroy(subject)
+ super if fast_destroy_enabled?
+ end
+
def retrieve_upload(_identifier, paths)
uploads.find_by(path: paths)
end
+
+ private
+
+ # mounted uploads are deleted in carrierwave's after_commit hook,
+ # but FileUploaders which are not mounted must be deleted explicitly and
+ # it can not be done in after_commit because FileUploader requires loads
+ # associated model on destroy (which is already deleted in after_commit)
+ def remove_file_uploads
+ fast_destroy_enabled? ? delete_uploads : destroy_uploads
+ end
+
+ def delete_uploads
+ file_uploads.delete_all(:delete_all)
+ end
+
+ def destroy_uploads
+ file_uploads.find_each do |upload|
+ upload.destroy
+ end
+ end
+
+ def fast_destroy_enabled?
+ Feature.enabled?(:fast_destroy_uploads, self)
+ end
end