FIX: Remove 'backfill_etags' keyword argument from 'uploads:missing' rake task
And etags backfilling code is optimized
This commit is contained in:
parent
e55c19d8ce
commit
0472bd4adc
|
@ -123,11 +123,11 @@ module FileStore
|
||||||
SiteSetting.Upload.s3_upload_bucket.downcase
|
SiteSetting.Upload.s3_upload_bucket.downcase
|
||||||
end
|
end
|
||||||
|
|
||||||
def list_missing_uploads(skip_optimized: false, backfill_etags: false)
|
def list_missing_uploads(skip_optimized: false)
|
||||||
if SiteSetting.enable_s3_inventory
|
if SiteSetting.enable_s3_inventory
|
||||||
require 's3_inventory'
|
require 's3_inventory'
|
||||||
S3Inventory.new(s3_helper, :upload).list_missing(backfill_etags: backfill_etags)
|
S3Inventory.new(s3_helper, :upload).list_missing
|
||||||
S3Inventory.new(s3_helper, :optimized).list_missing(backfill_etags: backfill_etags) unless skip_optimized
|
S3Inventory.new(s3_helper, :optimized).list_missing unless skip_optimized
|
||||||
else
|
else
|
||||||
list_missing(Upload, "original/")
|
list_missing(Upload, "original/")
|
||||||
list_missing(OptimizedImage, "optimized/") unless skip_optimized
|
list_missing(OptimizedImage, "optimized/") unless skip_optimized
|
||||||
|
|
|
@ -24,7 +24,7 @@ class S3Inventory
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def list_missing(backfill_etags: false)
|
def list_missing
|
||||||
if files.blank?
|
if files.blank?
|
||||||
error("Failed to list inventory from S3")
|
error("Failed to list inventory from S3")
|
||||||
return
|
return
|
||||||
|
@ -46,12 +46,12 @@ class S3Inventory
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
if backfill_etags
|
# backfilling etags
|
||||||
uploads = model.where(etag: nil).joins("INNER JOIN #{table_name} ON #{model.table_name}.url ILIKE '%' || #{table_name}.key")
|
connection.async_exec("UPDATE #{model.table_name}
|
||||||
uploads.select(:id, :"#{table_name}.etag").find_each do |upload|
|
SET etag = #{table_name}.etag
|
||||||
model.where(id: upload.id).update_all(etag: upload.etag)
|
FROM #{table_name}
|
||||||
end
|
WHERE #{model.table_name}.etag IS NULL
|
||||||
end
|
AND url ILIKE '%' || #{table_name}.key")
|
||||||
|
|
||||||
uploads = (model == Upload) ? model.where("created_at < ?", inventory_date) : model
|
uploads = (model == Upload) ? model.where("created_at < ?", inventory_date) : model
|
||||||
missing_uploads = uploads.joins("LEFT JOIN #{table_name} ON #{table_name}.etag = #{model.table_name}.etag").where("#{table_name}.etag is NULL")
|
missing_uploads = uploads.joins("LEFT JOIN #{table_name} ON #{table_name}.etag = #{model.table_name}.etag").where("#{table_name}.etag is NULL")
|
||||||
|
|
|
@ -482,16 +482,16 @@ end
|
||||||
# list all missing uploads and optimized images
|
# list all missing uploads and optimized images
|
||||||
task "uploads:missing" => :environment do
|
task "uploads:missing" => :environment do
|
||||||
if ENV["RAILS_DB"]
|
if ENV["RAILS_DB"]
|
||||||
list_missing_uploads(skip_optimized: ENV['SKIP_OPTIMIZED'], backfill_etags: ENV['BACKFILL_ETAGS'])
|
list_missing_uploads(skip_optimized: ENV['SKIP_OPTIMIZED'])
|
||||||
else
|
else
|
||||||
RailsMultisite::ConnectionManagement.each_connection do |db|
|
RailsMultisite::ConnectionManagement.each_connection do |db|
|
||||||
list_missing_uploads(skip_optimized: ENV['SKIP_OPTIMIZED'], backfill_etags: ENV['BACKFILL_ETAGS'])
|
list_missing_uploads(skip_optimized: ENV['SKIP_OPTIMIZED'])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def list_missing_uploads(skip_optimized: false, backfill_etags: false)
|
def list_missing_uploads(skip_optimized: false)
|
||||||
Discourse.store.list_missing_uploads(skip_optimized: skip_optimized, backfill_etags: backfill_etags)
|
Discourse.store.list_missing_uploads(skip_optimized: skip_optimized)
|
||||||
end
|
end
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
|
@ -77,14 +77,20 @@ describe "S3Inventory" do
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should backfill etags to uploads table correctly" do
|
it "should backfill etags to uploads table correctly" do
|
||||||
Fabricate(:upload, url: "//bucket.amazonaws.com/original/0184537a4f419224404d013414e913a4f56018f2.jpg", created_at: 2.days.ago)
|
files = [
|
||||||
|
["//bucket.amazonaws.com/original/0184537a4f419224404d013414e913a4f56018f2.jpg", "defcaac0b4aca535c284e95f30d608d0"],
|
||||||
|
["//bucket.amazonaws.com/original/0789fbf5490babc68326b9cec90eeb0d6590db05.png", "25c02eaceef4cb779fc17030d33f7f06"]
|
||||||
|
]
|
||||||
|
files.each { |file| Fabricate(:upload, url: file[0]) }
|
||||||
|
|
||||||
inventory.expects(:download_inventory_files_to_tmp_directory)
|
inventory.expects(:download_inventory_files_to_tmp_directory)
|
||||||
inventory.expects(:decompress_inventory_files)
|
inventory.expects(:decompress_inventory_files)
|
||||||
inventory.expects(:files).returns([{ key: "Key", filename: "#{csv_filename}.gz" }]).times(2)
|
inventory.expects(:files).returns([{ key: "Key", filename: "#{csv_filename}.gz" }]).times(2)
|
||||||
|
|
||||||
output = capture_stdout do
|
output = capture_stdout do
|
||||||
expect { inventory.list_missing(backfill_etags: true) }.to change { Upload.where(etag: nil).count }.by(-1)
|
expect { inventory.list_missing }.to change { Upload.where(etag: nil).count }.by(-2)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
expect(Upload.order(:url).pluck(:url, :etag)).to eq(files)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue