Browse Source

Avoid race conditions when creating backups (#10234)

Under load, multiple backups for a single user could be planned, which
is very expensive.
pull/4/head
ThibG 5 years ago
committed by Eugen Rochko
parent
commit
5506b9406d
1 changed files with 16 additions and 2 deletions
  1. +16
    -2
      app/controllers/settings/exports_controller.rb

+ 16
- 2
app/controllers/settings/exports_controller.rb View File

@ -13,11 +13,25 @@ class Settings::ExportsController < Settings::BaseController
end
def create
authorize :backup, :create?
raise Mastodon::NotPermittedError unless user_signed_in?
backup = nil
RedisLock.acquire(lock_options) do |lock|
if lock.acquired?
authorize :backup, :create?
backup = current_user.backups.create!
else
raise Mastodon::RaceConditionError
end
end
backup = current_user.backups.create!
BackupWorker.perform_async(backup.id)
redirect_to settings_export_path
end
def lock_options
{ redis: Redis.current, key: "backup:#{current_user.id}" }
end
end

Loading…
Cancel
Save