2
0
Fork 0
mirror of https://github.com/discourse/discourse.git synced 2025-09-08 12:06:51 +08:00

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,19 +32,21 @@ 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
thread = Thread.new { initiate_fallback_to_master } thread = Thread.new { initiate_fallback_to_master }
thread.abort_on_exception = true thread.abort_on_exception = true
thread.join thread.join
break if synchronize { @masters_down.hash.empty? } break if synchronize { @masters_down.hash.empty? }
sleep 5 sleep 5
end
end end
end
@thread.abort_on_exception = true @thread.abort_on_exception = true
end
end end
def master_down? def master_down?

View file

@ -23,17 +23,19 @@ 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
begin begin
thread = Thread.new { initiate_fallback_to_master } thread = Thread.new { initiate_fallback_to_master }
thread.join thread.join
break if synchronize { @master } break if synchronize { @master }
sleep 5 sleep 5
ensure ensure
thread.kill thread.kill
end
end end
end end
end end