mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
FIX: Create and consume temp table inside a transaction (#7030)
To prevent access issue in pgbouncer which runs in transaction pooling
This commit is contained in:
@@ -34,37 +34,39 @@ class S3Inventory
|
|||||||
download_inventory_files_to_tmp_directory
|
download_inventory_files_to_tmp_directory
|
||||||
decompress_inventory_files
|
decompress_inventory_files
|
||||||
|
|
||||||
begin
|
ActiveRecord::Base.transaction do
|
||||||
table_name = "#{inventory_id}_inventory"
|
begin
|
||||||
connection = ActiveRecord::Base.connection.raw_connection
|
table_name = "#{inventory_id}_inventory"
|
||||||
connection.exec("CREATE TEMP TABLE #{table_name}(key text UNIQUE, etag text, PRIMARY KEY(etag, key))")
|
connection = ActiveRecord::Base.connection.raw_connection
|
||||||
connection.copy_data("COPY #{table_name} FROM STDIN CSV") do
|
connection.exec("CREATE TEMP TABLE #{table_name}(key text UNIQUE, etag text, PRIMARY KEY(etag, key))")
|
||||||
files.each do |file|
|
connection.copy_data("COPY #{table_name} FROM STDIN CSV") do
|
||||||
CSV.foreach(file[:filename][0...-3], headers: false) do |row|
|
files.each do |file|
|
||||||
connection.put_copy_data("#{row[CSV_KEY_INDEX]},#{row[CSV_ETAG_INDEX]}\n")
|
CSV.foreach(file[:filename][0...-3], headers: false) do |row|
|
||||||
|
connection.put_copy_data("#{row[CSV_KEY_INDEX]},#{row[CSV_ETAG_INDEX]}\n")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
# backfilling etags
|
# backfilling etags
|
||||||
connection.async_exec("UPDATE #{model.table_name}
|
connection.async_exec("UPDATE #{model.table_name}
|
||||||
SET etag = #{table_name}.etag
|
SET etag = #{table_name}.etag
|
||||||
FROM #{table_name}
|
FROM #{table_name}
|
||||||
WHERE #{model.table_name}.etag IS NULL
|
WHERE #{model.table_name}.etag IS NULL
|
||||||
AND url ILIKE '%' || #{table_name}.key")
|
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")
|
||||||
|
|
||||||
if (missing_count = missing_uploads.count) > 0
|
if (missing_count = missing_uploads.count) > 0
|
||||||
missing_uploads.select(:id, :url).find_each do |upload|
|
missing_uploads.select(:id, :url).find_each do |upload|
|
||||||
log upload.url
|
log upload.url
|
||||||
|
end
|
||||||
|
|
||||||
|
log "#{missing_count} of #{uploads.count} #{model.name.underscore.pluralize} are missing"
|
||||||
end
|
end
|
||||||
|
ensure
|
||||||
log "#{missing_count} of #{uploads.count} #{model.name.underscore.pluralize} are missing"
|
connection.exec("DROP TABLE #{table_name}") unless connection.nil?
|
||||||
end
|
end
|
||||||
ensure
|
|
||||||
connection.exec("DROP TABLE #{table_name}") unless connection.nil?
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user