DEV: Prevent race condition when keeping site in readonly mode.
This commit is contained in:
parent
615a22a579
commit
0e0daa2c91
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue