From d1b2e9db3bcb7693094511edc415a953dc8a9116 Mon Sep 17 00:00:00 2001 From: Bianca Nenciu Date: Mon, 21 Jun 2021 19:15:24 +0300 Subject: [PATCH] PERF: Update post uploads secure status in a job (#13459) When secure uploads are enabled, editing a post with many uploads can cause a timeout because the store has to be contacted for each upload. --- .../regular/update_post_uploads_secure_status.rb | 14 ++++++++++++++ app/models/post.rb | 2 +- spec/components/post_revisor_spec.rb | 1 + spec/models/post_spec.rb | 2 ++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 app/jobs/regular/update_post_uploads_secure_status.rb diff --git a/app/jobs/regular/update_post_uploads_secure_status.rb b/app/jobs/regular/update_post_uploads_secure_status.rb new file mode 100644 index 00000000000..b27b4c92b48 --- /dev/null +++ b/app/jobs/regular/update_post_uploads_secure_status.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +module Jobs + class UpdatePostUploadsSecureStatus < ::Jobs::Base + def execute(args) + post = Post.find_by(id: args[:post_id]) + return if post.blank? + + post.uploads.each do |upload| + upload.update_secure_status(source: args[:source]) + end + end + end +end diff --git a/app/models/post.rb b/app/models/post.rb index 306bf38645d..b761dee70fd 100644 --- a/app/models/post.rb +++ b/app/models/post.rb @@ -960,7 +960,7 @@ class Post < ActiveRecord::Base def update_uploads_secure_status(source:) if Discourse.store.external? - self.uploads.each { |upload| upload.update_secure_status(source: source) } + Jobs.enqueue(:update_post_uploads_secure_status, post_id: self.id, source: source) end end diff --git a/spec/components/post_revisor_spec.rb b/spec/components/post_revisor_spec.rb index 5d54fbd930a..6832e9f5d7b 100644 --- a/spec/components/post_revisor_spec.rb +++ b/spec/components/post_revisor_spec.rb @@ -1119,6 +1119,7 @@ describe PostRevisor do context "secure media uploads" do let!(:image5) { Fabricate(:secure_upload) } before do + Jobs.run_immediately! setup_s3 SiteSetting.authorized_extensions = "png|jpg|gif|mp4" SiteSetting.secure_media = true diff --git a/spec/models/post_spec.rb b/spec/models/post_spec.rb index 1e19d97556f..d9c33691399 100644 --- a/spec/models/post_spec.rb +++ b/spec/models/post_spec.rb @@ -1481,6 +1481,8 @@ describe Post do end before do + Jobs.run_immediately! + setup_s3 SiteSetting.authorized_extensions = "pdf|png|jpg|csv" SiteSetting.secure_media = true