From 02025207d57728ed60c43a9d8e723fef3f96b3e1 Mon Sep 17 00:00:00 2001 From: Guo Xiang Tan Date: Wed, 23 Nov 2016 11:29:28 +0800 Subject: [PATCH] FIX: Make sure Redis fallback don't fall into a permanent readonly state. --- lib/discourse_redis.rb | 7 +++++-- spec/components/discourse_redis_spec.rb | 3 +++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/discourse_redis.rb b/lib/discourse_redis.rb index 9ed43c4e3a9..91bbd1a36c7 100644 --- a/lib/discourse_redis.rb +++ b/lib/discourse_redis.rb @@ -60,7 +60,7 @@ class DiscourseRedis end def running? - synchronize { @timer_task.running? } + @timer_task.running? end private @@ -92,7 +92,10 @@ class DiscourseRedis end def resolve - return @slave_options if !@fallback_handler.master + if !@fallback_handler.master + @fallback_handler.verify_master unless @fallback_handler.running? + return @slave_options + end begin options = @options.dup diff --git a/spec/components/discourse_redis_spec.rb b/spec/components/discourse_redis_spec.rb index 8cc8c76d47f..c0d644cc5a3 100644 --- a/spec/components/discourse_redis_spec.rb +++ b/spec/components/discourse_redis_spec.rb @@ -60,11 +60,14 @@ describe DiscourseRedis do Redis::Client.any_instance.expects(:call).raises(error).once expect { connector.resolve }.to raise_error(error) + fallback_handler.instance_variable_get(:@timer_task).shutdown + expect(fallback_handler.running?).to eq(false) config = connector.resolve expect(config[:host]).to eq(slave_host) expect(config[:port]).to eq(slave_port) + expect(fallback_handler.running?).to eq(true) ensure fallback_handler.master = true end