From a95886d842046d51998235b0cf9127dcaa8e59ed Mon Sep 17 00:00:00 2001 From: David Taylor Date: Fri, 13 Nov 2020 17:38:42 +0000 Subject: [PATCH] DEV: Tidy up method ordering and public/private status --- lib/rails_failover/active_record/handler.rb | 42 +++---- lib/rails_failover/redis/handler.rb | 126 ++++++++++---------- 2 files changed, 83 insertions(+), 85 deletions(-) diff --git a/lib/rails_failover/active_record/handler.rb b/lib/rails_failover/active_record/handler.rb index d0cc67e..9d5c6c8 100644 --- a/lib/rails_failover/active_record/handler.rb +++ b/lib/rails_failover/active_record/handler.rb @@ -25,15 +25,29 @@ def verify_primary(handler_key) logger.warn "Failover for ActiveRecord has been initiated" - @thread = Thread.new do - loop do - initiate_fallback_to_primary + @thread = Thread.new { loop_until_all_up } + end + end - if all_primaries_up - logger.warn "Fallback to primary for ActiveRecord has been completed." - break - end - end + def primary_down?(handler_key) + primaries_down[handler_key] + end + + def primaries_down_count + mon_synchronize do + primaries_down.count + end + end + + private + + def loop_until_all_up + loop do + initiate_fallback_to_primary + + if all_primaries_up + logger.warn "Fallback to primary for ActiveRecord has been completed." + break end end end @@ -71,18 +85,6 @@ def initiate_fallback_to_primary end end - def primary_down?(handler_key) - primaries_down[handler_key] - end - - def primaries_down_count - mon_synchronize do - primaries_down.count - end - end - - private - def all_primaries_up mon_synchronize do primaries_down.empty? diff --git a/lib/rails_failover/redis/handler.rb b/lib/rails_failover/redis/handler.rb index 589215d..df92dc6 100644 --- a/lib/rails_failover/redis/handler.rb +++ b/lib/rails_failover/redis/handler.rb @@ -26,31 +26,58 @@ def initialize def verify_primary(options) mon_synchronize do primary_down(options) - ensure_failover_thread_running + return if @thread&.alive? + logger&.warn "Failover for Redis has been initiated" + @thread = Thread.new { loop_until_all_up } end end - def ensure_failover_thread_running - return if @thread&.alive? + def register_client(client) + key = client.options[:id] + + mon_synchronize do + clients[key] ||= [] + clients[key] << client + end + end - logger&.warn "Failover for Redis has been initiated" + def deregister_client(client) + key = client.options[:id] - @thread = Thread.new do - loop do - ensure_primary_clients_disconnected - try_fallback_to_primary + mon_synchronize do + if clients[key] + clients[key].delete(client) - if all_primaries_up - logger&.warn "Fallback to primary for Redis has been completed." - break + if clients[key].empty? + clients.delete(key) end end end end - def ensure_primary_clients_disconnected - mon_synchronize { primaries_down.dup }.each do |key, options| - disconnect_clients(options, RailsFailover::Redis::PRIMARY) + def primary_down?(options) + mon_synchronize do + primaries_down[options[:id]] + end + end + + def primaries_down_count + mon_synchronize do + primaries_down.count + end + end + + private + + def loop_until_all_up + loop do + ensure_primary_clients_disconnected + try_fallback_to_primary + + if all_primaries_up + logger&.warn "Fallback to primary for Redis has been completed." + break + end end end @@ -87,43 +114,6 @@ def try_fallback_to_primary end end - def register_client(client) - key = client.options[:id] - - mon_synchronize do - clients[key] ||= [] - clients[key] << client - end - end - - def deregister_client(client) - key = client.options[:id] - - mon_synchronize do - if clients[key] - clients[key].delete(client) - - if clients[key].empty? - clients.delete(key) - end - end - end - end - - def primary_down?(options) - mon_synchronize do - primaries_down[options[:id]] - end - end - - def primaries_down_count - mon_synchronize do - primaries_down.count - end - end - - private - def all_primaries_up mon_synchronize { primaries_down.empty? } end @@ -144,39 +134,45 @@ def primary_down(options) RailsFailover::Redis.on_failover_callback!(options[:id]) if !already_down end - def clients + def primaries_down process_pid = Process.pid - return @clients[process_pid] if @clients[process_pid] + return @primaries_down[process_pid] if @primaries_down[process_pid] mon_synchronize do - if !@clients[process_pid] - @clients[process_pid] = {} + if !@primaries_down[process_pid] + @primaries_down[process_pid] = @primaries_down[@ancestor_pid] || {} if process_pid != @ancestor_pid - @clients.delete(@ancestor_pid) + @primaries_down.delete(@ancestor_pid)&.each do |id, options| + verify_primary(options) + end end end - @clients[process_pid] + @primaries_down[process_pid] end end - def primaries_down + def clients process_pid = Process.pid - return @primaries_down[process_pid] if @primaries_down[process_pid] + return @clients[process_pid] if @clients[process_pid] mon_synchronize do - if !@primaries_down[process_pid] - @primaries_down[process_pid] = @primaries_down[@ancestor_pid] || {} + if !@clients[process_pid] + @clients[process_pid] = {} if process_pid != @ancestor_pid - @primaries_down.delete(@ancestor_pid)&.each do |id, options| - verify_primary(options) - end + @clients.delete(@ancestor_pid) end end - @primaries_down[process_pid] + @clients[process_pid] + end + end + + def ensure_primary_clients_disconnected + mon_synchronize { primaries_down.dup }.each do |key, options| + disconnect_clients(options, RailsFailover::Redis::PRIMARY) end end