discourse/lib/freedom_patches/rails_multisite.rb
2023-01-09 12:10:19 +00:00

39 lines
1.3 KiB
Ruby

# frozen_string_literal: true
module RailsMultisite
class ConnectionManagement
def self.safe_each_connection
self.each_connection do |db|
begin
yield(db) if block_given?
rescue PG::ConnectionBad, PG::UnableToSend, PG::ServerError
break if !defined?(RailsFailover::ActiveRecord)
break if db == RailsMultisite::ConnectionManagement::DEFAULT
reading_role = :"#{db}_#{ActiveRecord.reading_role}"
spec = RailsMultisite::ConnectionManagement.connection_spec(db: db)
ActiveRecord::Base.connection_handlers[reading_role] ||= begin
handler = ActiveRecord::ConnectionAdapters::ConnectionHandler.new
RailsFailover::ActiveRecord.establish_reading_connection(handler, spec)
handler
end
ActiveRecord::Base.connected_to(role: reading_role) { yield(db) if block_given? }
rescue => e
STDERR.puts "URGENT: Failed to initialize site #{db}: " \
"#{e.class} #{e.message}\n#{e.backtrace.join("\n")}"
# the show must go on, don't stop startup if multisite fails
end
end
end
end
class DiscoursePatches
def self.config
{ db_lookup: lambda { |env| env["PATH_INFO"] == "/srv/status" ? "default" : nil } }
end
end
end