Skip to content

Commit

Permalink
FIX: Killing a Unicorn worker shouldn't kill a running backup or rest…
Browse files Browse the repository at this point in the history
…ore process

By spawning and forking the backup and restore, the process owner changes from 🦄 to the init process.
  • Loading branch information
gschlager committed Oct 13, 2020
1 parent 1febf11 commit 57095f0
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 30 deletions.
4 changes: 2 additions & 2 deletions lib/backup_restore.rb
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,9 @@ def self.start_logs_message_id_key

def self.spawn_process!(type, user_id, opts)
script = File.join(Rails.root, "script", "spawn_backup_restore.rb")
command = ["bundle", "exec", "ruby", script, type, user_id, opts.to_json].shelljoin
command = ["bundle", "exec", "ruby", script, type, user_id, opts.to_json].map(&:to_s)

pid = spawn({ "RAILS_DB" => RailsMultisite::ConnectionManagement.current_db }, command)
pid = spawn({ "RAILS_DB" => RailsMultisite::ConnectionManagement.current_db }, *command)
Process.detach(pid)
end

Expand Down
58 changes: 30 additions & 28 deletions script/spawn_backup_restore.rb
Original file line number Diff line number Diff line change
@@ -1,38 +1,40 @@
# frozen_string_literal: true
# This script is used by BackupRestore.backup! and BackupRestore.restore!

require File.expand_path("../../config/environment", __FILE__)
fork do
require File.expand_path("../../config/environment", __FILE__)

def backup
user_id, opts = parse_params
BackupRestore::Backuper.new(user_id, opts).run
end
def backup
user_id, opts = parse_params
BackupRestore::Backuper.new(user_id, opts).run
end

def restore
user_id, opts = parse_params
def restore
user_id, opts = parse_params

BackupRestore::Restorer.new(
user_id: user_id,
filename: opts[:filename],
factory: BackupRestore::Factory.new(
BackupRestore::Restorer.new(
user_id: user_id,
client_id: opts[:client_id]
),
disable_emails: opts.fetch(:disable_emails, true)
).run
end
filename: opts[:filename],
factory: BackupRestore::Factory.new(
user_id: user_id,
client_id: opts[:client_id]
),
disable_emails: opts.fetch(:disable_emails, true)
).run
end

def parse_params
user_id = ARGV[1].to_i
opts = JSON.parse(ARGV[2], symbolize_names: true)
[user_id, opts]
end
def parse_params
user_id = ARGV[1].to_i
opts = JSON.parse(ARGV[2], symbolize_names: true)
[user_id, opts]
end

case ARGV[0]
when "backup"
backup
when "restore"
restore
else
raise "Unknown argument: #{ARGV[0]}"
case ARGV[0]
when "backup"
backup
when "restore"
restore
else
raise "Unknown argument: #{ARGV[0]}"
end
end

0 comments on commit 57095f0

Please sign in to comment.