"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