discourse/lib/freedom_patches/rails_multisite.rb

46 lines
1.4 KiB
Ruby

# frozen_string_literal: true
module RailsMultisite
class ConnectionManagement
def self.each_active_connection(&blk)
if ENV["RAILS_DB"]
blk.call(current_db)
else
each_connection(&blk)
end
end
def self.safe_each_connection
each_active_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)
handler = ActiveRecord::Base.connection_handler
RailsFailover::ActiveRecord.establish_reading_connection(
handler,
spec.to_hash,
role: reading_role,
)
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