"Fossies" - the Fresh Open Source Software Archive

Member "discourse-3.1.1/config/initializers/002-rails_failover.rb" (12 Sep 2023, 2863 Bytes) of package /linux/www/discourse-3.1.1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Ruby source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. See also the last Fossies "Diffs" side-by-side code changes report for "002-rails_failover.rb": 3.0.6_vs_3.1.0.

    1 # frozen_string_literal: true
    2 
    3 if defined?(RailsFailover::Redis)
    4   message_bus_keepalive_interval = nil
    5 
    6   RailsFailover::Redis.on_failover do
    7     message_bus_keepalive_interval = MessageBus.keepalive_interval
    8     MessageBus.keepalive_interval = -1 # Disable MessageBus keepalive_interval
    9     Discourse.received_redis_readonly!
   10   end
   11 
   12   RailsFailover::Redis.on_fallback do
   13     Discourse.clear_redis_readonly!
   14     Discourse.request_refresh!
   15     MessageBus.keepalive_interval = message_bus_keepalive_interval
   16 
   17     ObjectSpace.each_object(DistributedCache) { |cache| cache.clear }
   18 
   19     SiteSetting.refresh!
   20   end
   21 
   22   RailsFailover::Redis.logger = Rails.logger.chained.first if Rails.logger.respond_to? :chained
   23 end
   24 
   25 if defined?(RailsFailover::ActiveRecord)
   26   return unless Rails.configuration.active_record_rails_failover
   27 
   28   if Rails.configuration.multisite
   29     if ActiveRecord::Base.current_role == ActiveRecord.reading_role
   30       RailsMultisite::ConnectionManagement.default_connection_handler =
   31         ActiveRecord::Base.connection_handlers[ActiveRecord.reading_role]
   32     end
   33   end
   34 
   35   RailsFailover::ActiveRecord.on_failover do |role|
   36     if role == ActiveRecord.writing_role # Multisite master
   37       RailsMultisite::ConnectionManagement.each_connection do
   38         Discourse.enable_readonly_mode(Discourse::PG_READONLY_MODE_KEY)
   39       end
   40     else
   41       ActiveRecord::Base.connected_to(role: role) do
   42         Discourse.enable_readonly_mode(Discourse::PG_READONLY_MODE_KEY)
   43       end
   44 
   45       # Test connection to the master, and trigger master failover if needed
   46       ActiveRecord::Base.connected_to(role: ActiveRecord.writing_role) do
   47         ActiveRecord::Base.connection.active?
   48       rescue PG::ConnectionBad, PG::UnableToSend, PG::ServerError
   49         RailsFailover::ActiveRecord.verify_primary(ActiveRecord.writing_role)
   50       end
   51     end
   52   end
   53 
   54   RailsFailover::ActiveRecord.on_fallback do |role|
   55     if role == ActiveRecord.writing_role # Multisite master
   56       RailsMultisite::ConnectionManagement.each_connection do
   57         Discourse.disable_readonly_mode(Discourse::PG_READONLY_MODE_KEY)
   58       end
   59     else
   60       ActiveRecord::Base.connected_to(role: role) do
   61         Discourse.disable_readonly_mode(Discourse::PG_READONLY_MODE_KEY)
   62       end
   63     end
   64 
   65     if Rails.configuration.multisite
   66       RailsMultisite::ConnectionManagement.default_connection_handler =
   67         ActiveRecord::Base.connection_handlers[ActiveRecord.writing_role]
   68     end
   69   end
   70 
   71   RailsFailover::ActiveRecord.register_force_reading_role_callback do
   72     GlobalSetting.pg_force_readonly_mode ||
   73       Discourse.redis.exists?(
   74         Discourse::PG_READONLY_MODE_KEY,
   75         Discourse::PG_FORCE_READONLY_MODE_KEY,
   76       )
   77   rescue => e
   78     if !e.is_a?(Redis::CannotConnectError)
   79       Rails.logger.warn "#{e.class} #{e.message}: #{e.backtrace.join("\n")}"
   80     end
   81 
   82     false
   83   end
   84 end