FIX: Race-condition in fallback handlers (#8005)

Calling `verify_master` in multiple threads simultaneously would cause
multiple threads to be spawned.
This commit is contained in:
Daniel Waterworth 2019-08-21 14:47:44 +01:00 committed by Régis Hanol
parent 00b75b4f4e
commit 6924f1ab15
2 changed files with 24 additions and 20 deletions

View File

@ -32,7 +32,8 @@ class PostgreSQLFallbackHandler
end end
def verify_master def verify_master
synchronize { return if @thread && @thread.alive? } synchronize do
return if @thread && @thread.alive?
@thread = Thread.new do @thread = Thread.new do
while true do while true do
@ -46,6 +47,7 @@ class PostgreSQLFallbackHandler
@thread.abort_on_exception = true @thread.abort_on_exception = true
end end
end
def master_down? def master_down?
synchronize { @masters_down[namespace] } synchronize { @masters_down[namespace] }

View File

@ -23,7 +23,8 @@ class DiscourseRedis
end end
def verify_master def verify_master
synchronize { return if @thread && @thread.alive? } synchronize do
return if @thread && @thread.alive?
@thread = Thread.new do @thread = Thread.new do
loop do loop do
@ -38,6 +39,7 @@ class DiscourseRedis
end end
end end
end end
end
def initiate_fallback_to_master def initiate_fallback_to_master
success = false success = false