mirror of
https://github.com/discourse/discourse.git
synced 2025-05-22 20:51:08 +08:00
PERF: Disable Sidekiq only during database restore (#10857)
It pauses Sidekiq, clears Redis (namespaced to the current site), clears Sidekiq jobs for the current site, restores the database and unpauses Sidekiq. Previously it stayed paused until the end of the restore. Redis is cleared because we don't want any old data lying around (e.g. old Sidekiq jobs). Most data in Redis is prefixed with the name of the multisite, but Sidekiq jobs in a multisite are all stored in the same keys. So, deleting those jobs requires a little bit more logic.
This commit is contained in:
@ -10,7 +10,7 @@ describe BackupRestore::SystemInterface do
|
||||
|
||||
context "readonly mode" do
|
||||
after do
|
||||
Discourse::READONLY_KEYS.each { |key| $redis.del(key) }
|
||||
Discourse::READONLY_KEYS.each { |key| Discourse.redis.del(key) }
|
||||
end
|
||||
|
||||
describe "#enable_readonly_mode" do
|
||||
@ -81,16 +81,23 @@ describe BackupRestore::SystemInterface do
|
||||
end
|
||||
|
||||
describe "#pause_sidekiq" do
|
||||
after { Sidekiq.unpause! }
|
||||
|
||||
it "calls pause!" do
|
||||
Sidekiq.expects(:pause!).once
|
||||
subject.pause_sidekiq
|
||||
expect(Sidekiq.paused?).to eq(false)
|
||||
subject.pause_sidekiq("my reason")
|
||||
expect(Sidekiq.paused?).to eq(true)
|
||||
expect(Discourse.redis.get(SidekiqPauser::PAUSED_KEY)).to eq("my reason")
|
||||
end
|
||||
end
|
||||
|
||||
describe "#unpause_sidekiq" do
|
||||
it "calls unpause!" do
|
||||
Sidekiq.expects(:unpause!).once
|
||||
Sidekiq.pause!
|
||||
expect(Sidekiq.paused?).to eq(true)
|
||||
|
||||
subject.unpause_sidekiq
|
||||
expect(Sidekiq.paused?).to eq(false)
|
||||
end
|
||||
end
|
||||
|
||||
@ -101,12 +108,16 @@ describe BackupRestore::SystemInterface do
|
||||
end
|
||||
|
||||
context "with Sidekiq workers" do
|
||||
before { $redis.flushall }
|
||||
after { $redis.flushall }
|
||||
before { flush_sidekiq_redis_namespace }
|
||||
after { flush_sidekiq_redis_namespace }
|
||||
|
||||
def flush_sidekiq_redis_namespace
|
||||
Sidekiq.redis do |redis|
|
||||
redis.scan_each { |key| Discourse.redis.del(key) }
|
||||
end
|
||||
end
|
||||
|
||||
def create_workers(site_id: nil, all_sites: false)
|
||||
$redis.flushall
|
||||
|
||||
payload = Sidekiq::Testing.fake! do
|
||||
data = { post_id: 1 }
|
||||
|
||||
@ -157,5 +168,46 @@ describe BackupRestore::SystemInterface do
|
||||
subject.wait_for_sidekiq
|
||||
end
|
||||
end
|
||||
|
||||
describe "flush_redis" do
|
||||
context "Sidekiq" do
|
||||
after { Sidekiq.unpause! }
|
||||
|
||||
it "doesn't unpause Sidekiq" do
|
||||
Sidekiq.pause!
|
||||
subject.flush_redis
|
||||
|
||||
expect(Sidekiq.paused?).to eq(true)
|
||||
end
|
||||
end
|
||||
|
||||
it "removes only keys from the current site in a multisite", type: :multisite do
|
||||
test_multisite_connection("default") do
|
||||
Discourse.redis.set("foo", "default-foo")
|
||||
Discourse.redis.set("bar", "default-bar")
|
||||
|
||||
expect(Discourse.redis.get("foo")).to eq("default-foo")
|
||||
expect(Discourse.redis.get("bar")).to eq("default-bar")
|
||||
end
|
||||
|
||||
test_multisite_connection("second") do
|
||||
Discourse.redis.set("foo", "second-foo")
|
||||
Discourse.redis.set("bar", "second-bar")
|
||||
|
||||
expect(Discourse.redis.get("foo")).to eq("second-foo")
|
||||
expect(Discourse.redis.get("bar")).to eq("second-bar")
|
||||
|
||||
subject.flush_redis
|
||||
|
||||
expect(Discourse.redis.get("foo")).to be_nil
|
||||
expect(Discourse.redis.get("bar")).to be_nil
|
||||
end
|
||||
|
||||
test_multisite_connection("default") do
|
||||
expect(Discourse.redis.get("foo")).to eq("default-foo")
|
||||
expect(Discourse.redis.get("bar")).to eq("default-bar")
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
Reference in New Issue
Block a user