From 9ff13cee1438aa15c3b99a0c814849b516acfe70 Mon Sep 17 00:00:00 2001 From: Gerhard Schlager Date: Wed, 24 Aug 2022 01:43:42 +0200 Subject: [PATCH] FIX: Backup/Restore didn't use correct Redis namespace in multisite (#18060) In a multisite Discourse reported that no backup is running after 60 seconds because the Redis key expired. Also, the thread that listens for a shutdown signal stopped running immediately because it didn't detect a running operation. --- lib/backup_restore.rb | 14 ++++++++++---- lib/backup_restore/backuper.rb | 10 +++++++--- lib/backup_restore/system_interface.rb | 10 +++++++--- .../system_interface_multisite_spec.rb | 17 +++++++++++++++++ 4 files changed, 41 insertions(+), 10 deletions(-) diff --git a/lib/backup_restore.rb b/lib/backup_restore.rb index 8e45e1dc8a7..291567a6f0a 100644 --- a/lib/backup_restore.rb +++ b/lib/backup_restore.rb @@ -144,12 +144,18 @@ module BackupRestore end def self.keep_it_running + db = RailsMultisite::ConnectionManagement.current_db + # extend the expiry by 1 minute every 30 seconds Thread.new do - # this thread will be killed when the fork dies - while true - Discourse.redis.expire(running_key, 1.minute) - sleep 30.seconds + RailsMultisite::ConnectionManagement.with_connection(db) do + Thread.current.name = "keep_op_running" + + # this thread will be killed when the fork dies + while true + Discourse.redis.expire(running_key, 1.minute) + sleep 30.seconds + end end end end diff --git a/lib/backup_restore/backuper.rb b/lib/backup_restore/backuper.rb index 6273ff50692..83c10911b39 100644 --- a/lib/backup_restore/backuper.rb +++ b/lib/backup_restore/backuper.rb @@ -98,9 +98,13 @@ module BackupRestore BackupRestore.clear_shutdown_signal! Thread.new do - while BackupRestore.is_operation_running? - exit if BackupRestore.should_shutdown? - sleep 0.1 + Thread.current.name = "shutdown_wait" + + RailsMultisite::ConnectionManagement.with_connection(@current_db) do + while BackupRestore.is_operation_running? + exit if BackupRestore.should_shutdown? + sleep 0.1 + end end end end diff --git a/lib/backup_restore/system_interface.rb b/lib/backup_restore/system_interface.rb index 377d40ab6a6..c0d209e5380 100644 --- a/lib/backup_restore/system_interface.rb +++ b/lib/backup_restore/system_interface.rb @@ -47,9 +47,13 @@ module BackupRestore BackupRestore.clear_shutdown_signal! Thread.new do - while BackupRestore.is_operation_running? - exit if BackupRestore.should_shutdown? - sleep 0.1 + Thread.current.name = "shutdown_wait" + + RailsMultisite::ConnectionManagement.with_connection(@current_db) do + while BackupRestore.is_operation_running? + exit if BackupRestore.should_shutdown? + sleep 0.1 + end end end end diff --git a/spec/lib/backup_restore/system_interface_multisite_spec.rb b/spec/lib/backup_restore/system_interface_multisite_spec.rb index e9d93e6e3f1..dbc669ca7e8 100644 --- a/spec/lib/backup_restore/system_interface_multisite_spec.rb +++ b/spec/lib/backup_restore/system_interface_multisite_spec.rb @@ -36,4 +36,21 @@ RSpec.describe BackupRestore::SystemInterface, type: :multisite do end end end + + describe "#listen_for_shutdown_signal" do + it "uses the correct Redis namespace" do + test_multisite_connection("second") do + BackupRestore.mark_as_running! + + expect do + thread = subject.listen_for_shutdown_signal + BackupRestore.set_shutdown_signal! + thread.join + end.to raise_error(SystemExit) + + BackupRestore.clear_shutdown_signal! + BackupRestore.mark_as_not_running! + end + end + end end