diff --git a/lib/discourse.rb b/lib/discourse.rb index 780321a361b..eeb8d2a01b8 100644 --- a/lib/discourse.rb +++ b/lib/discourse.rb @@ -311,7 +311,7 @@ module Discourse $redis.set(key, 1) else $redis.setex(key, READONLY_MODE_KEY_TTL, 1) - keep_readonly_mode(key) + keep_readonly_mode(key) if !Rails.env.test? end MessageBus.publish(readonly_channel, true) @@ -321,20 +321,24 @@ module Discourse def self.keep_readonly_mode(key) # extend the expiry by 1 minute every 30 seconds - unless Rails.env.test? + @mutex ||= Mutex.new + + @mutex.synchronize do @dbs ||= Set.new @dbs << RailsMultisite::ConnectionManagement.current_db @threads ||= {} unless @threads[key]&.alive? @threads[key] = Thread.new do - while @dbs.size > 0 + while @dbs.size > 0 do sleep 30 - @dbs.each do |db| - RailsMultisite::ConnectionManagement.with_connection(db) do - if !$redis.expire(key, READONLY_MODE_KEY_TTL) - @dbs.delete(db) + @mutex.synchronize do + @dbs.each do |db| + RailsMultisite::ConnectionManagement.with_connection(db) do + if !$redis.expire(key, READONLY_MODE_KEY_TTL) + @dbs.delete(db) + end end end end