Skip to content

Commit

Permalink
Fix tootctl upgrade storage-schema misbehaving
Browse files Browse the repository at this point in the history
- Fix not moving original files of custom emojis
- Fix command failing to move any files with S3 storage
- Fix command marking records as upgraded when move failed

Fix #13594
  • Loading branch information
Gargron committed May 15, 2020
1 parent 328c5a2 commit fb6f7a5
Showing 1 changed file with 28 additions and 13 deletions.
41 changes: 28 additions & 13 deletions lib/mastodon/upgrade_cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -41,23 +41,32 @@ def storage_schema
klass.find_each do |record|
attachment_names.each do |attachment_name|
attachment = record.public_send(attachment_name)
upgraded = false

next if attachment.blank? || attachment.storage_schema_version >= CURRENT_STORAGE_SCHEMA_VERSION

attachment.styles.each_key do |style|
case Paperclip::Attachment.default_options[:storage]
when :s3
upgrade_storage_s3(progress, attachment, style)
when :fog
upgrade_storage_fog(progress, attachment, style)
when :filesystem
upgrade_storage_filesystem(progress, attachment, style)
styles = attachment.styles.keys

styles << :original unless styles.include?(:original)

styles.each do |style|
success = begin
case Paperclip::Attachment.default_options[:storage]
when :s3
upgrade_storage_s3(progress, attachment, style)
when :fog
upgrade_storage_fog(progress, attachment, style)
when :filesystem
upgrade_storage_filesystem(progress, attachment, style)
end
end

upgraded = true if style == :original && success

progress.increment
end

attachment.instance_write(:storage_schema_version, CURRENT_STORAGE_SCHEMA_VERSION)
attachment.instance_write(:storage_schema_version, CURRENT_STORAGE_SCHEMA_VERSION) if upgraded
end

if record.changed?
Expand All @@ -78,25 +87,28 @@ def storage_schema
def upgrade_storage_s3(progress, attachment, style)
previous_storage_schema_version = attachment.storage_schema_version
object = attachment.s3_object(style)
success = true

attachment.instance_write(:storage_schema_version, CURRENT_STORAGE_SCHEMA_VERSION)

upgraded_path = attachment.path(style)
new_object = attachment.s3_object(style)

if upgraded_path != object.key && object.exists?
progress.log("Moving #{object.key} to #{upgraded_path}") if options[:verbose]
if new_object.key != object.key && object.exists?
progress.log("Moving #{object.key} to #{new_object.key}") if options[:verbose]

begin
object.move_to(upgraded_path) unless dry_run?
object.move_to(new_object) unless dry_run?
rescue => e
progress.log(pastel.red("Error processing #{object.key}: #{e}"))
success = false
end
end

# Because we move files style-by-style, it's important to restore
# previous version at the end. The upgrade will be recorded after
# all styles are updated
attachment.instance_write(:storage_schema_version, previous_storage_schema_version)
success
end

def upgrade_storage_fog(_progress, _attachment, _style)
Expand All @@ -107,6 +119,7 @@ def upgrade_storage_fog(_progress, _attachment, _style)
def upgrade_storage_filesystem(progress, attachment, style)
previous_storage_schema_version = attachment.storage_schema_version
previous_path = attachment.path(style)
success = true

attachment.instance_write(:storage_schema_version, CURRENT_STORAGE_SCHEMA_VERSION)

Expand All @@ -128,6 +141,7 @@ def upgrade_storage_filesystem(progress, attachment, style)
end
rescue => e
progress.log(pastel.red("Error processing #{previous_path}: #{e}"))
success = false

unless dry_run?
begin
Expand All @@ -143,6 +157,7 @@ def upgrade_storage_filesystem(progress, attachment, style)
# previous version at the end. The upgrade will be recorded after
# all styles are updated
attachment.instance_write(:storage_schema_version, previous_storage_schema_version)
success
end
end
end

0 comments on commit fb6f7a5

Please sign in to comment.