FIX: Sidekiq fails to start if any of the multisite has problems.

This commit is contained in:
Guo Xiang Tan 2018-12-12 11:29:48 +08:00
parent 6d353a1e47
commit e564fe1866
4 changed files with 38 additions and 25 deletions

View File

@ -0,0 +1,36 @@
# 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 => 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 do |env|
env["PATH_INFO"] == "/srv/status" ? "default" : nil
end
}
end
end
end
if Rails.configuration.multisite
Rails.configuration.middleware.swap(
RailsMultisite::Middleware,
RailsMultisite::Middleware,
RailsMultisite::DiscoursePatches.config
)
end

View File

@ -4,7 +4,7 @@
Discourse.git_version
reload_settings = lambda {
RailsMultisite::ConnectionManagement.each_connection do
RailsMultisite::ConnectionManagement.safe_each_connection do
begin
SiteSetting.refresh!
@ -13,10 +13,6 @@ reload_settings = lambda {
end
rescue ActiveRecord::StatementInvalid
# This will happen when migrating a new database
rescue => e
STDERR.puts "URGENT: Failed to initialize site #{RailsMultisite::ConnectionManagement.current_db}:"\
"#{e.message}\n#{e.backtrace.join("\n")}"
# the show must go on, don't stop startup if multisite fails
end
end
}

View File

@ -1,19 +0,0 @@
# frozen_string_literal: true
class RailsMultisite::DiscoursePatches
def self.config
{
db_lookup: lambda do |env|
env["PATH_INFO"] == "/srv/status" ? "default" : nil
end
}
end
end
if Rails.configuration.multisite
Rails.configuration.middleware.swap(
RailsMultisite::Middleware,
RailsMultisite::Middleware,
RailsMultisite::DiscoursePatches.config
)
end

View File

@ -46,7 +46,7 @@ if Sidekiq.server?
Scheduler::Defer.async = false
# warm up AR
RailsMultisite::ConnectionManagement.each_connection do
RailsMultisite::ConnectionManagement.safe_each_connection do
(ActiveRecord::Base.connection.tables - %w[schema_migrations]).each do |table|
table.classify.constantize.first rescue nil
end