mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
BUGFIX: Correct after_fork semantics
After fork SiteSettings was not getting a new process id, causing site settings not to refresh properly in unicorn This code also centralizes the logic
This commit is contained in:
@@ -10,10 +10,7 @@ end
|
|||||||
if defined?(PhusionPassenger)
|
if defined?(PhusionPassenger)
|
||||||
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
||||||
if forked
|
if forked
|
||||||
# We're in smart spawning mode.
|
Discourse.after_fork
|
||||||
$redis = DiscourseRedis.new
|
|
||||||
Discourse::Application.config.cache_store.reconnect
|
|
||||||
MessageBus.after_fork
|
|
||||||
else
|
else
|
||||||
# We're in conservative spawning mode. We don't need to do anything.
|
# We're in conservative spawning mode. We don't need to do anything.
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -6,8 +6,6 @@
|
|||||||
# spring binstub rake
|
# spring binstub rake
|
||||||
# spring binstub rspec
|
# spring binstub rspec
|
||||||
Spring.after_fork do
|
Spring.after_fork do
|
||||||
$redis.client.reconnect
|
Discourse.after_fork
|
||||||
Rails.cache.reconnect
|
|
||||||
MessageBus.after_fork
|
|
||||||
end
|
end
|
||||||
Spring::Commands::Rake.environment_matchers["spec"] = "test"
|
Spring::Commands::Rake.environment_matchers["spec"] = "test"
|
||||||
|
|||||||
@@ -83,8 +83,5 @@ before_fork do |server, worker|
|
|||||||
end
|
end
|
||||||
|
|
||||||
after_fork do |server, worker|
|
after_fork do |server, worker|
|
||||||
ActiveRecord::Base.establish_connection
|
Discourse.after_fork
|
||||||
$redis.client.reconnect
|
|
||||||
Rails.cache.reconnect
|
|
||||||
MessageBus.after_fork
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -174,14 +174,7 @@ module BackupRestore
|
|||||||
end
|
end
|
||||||
|
|
||||||
def self.after_fork
|
def self.after_fork
|
||||||
# reconnect to redis
|
Discourse.after_fork
|
||||||
$redis.client.reconnect
|
|
||||||
# reconnect the rails cache (uses redis)
|
|
||||||
Rails.cache.reconnect
|
|
||||||
# tells the message we've forked
|
|
||||||
MessageBus.after_fork
|
|
||||||
# /!\ HACK /!\ force sidekiq to create a new connection to redis
|
|
||||||
Sidekiq.instance_variable_set(:@redis, nil)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self.backup_tables_count
|
def self.backup_tables_count
|
||||||
|
|||||||
@@ -118,11 +118,7 @@ class Demon::Base
|
|||||||
end
|
end
|
||||||
|
|
||||||
def establish_app
|
def establish_app
|
||||||
ActiveRecord::Base.connection_handler.clear_active_connections!
|
Discourse.after_fork
|
||||||
ActiveRecord::Base.establish_connection
|
|
||||||
$redis.client.reconnect
|
|
||||||
Rails.cache.reconnect
|
|
||||||
MessageBus.after_fork
|
|
||||||
|
|
||||||
Signal.trap("HUP") do
|
Signal.trap("HUP") do
|
||||||
begin
|
begin
|
||||||
|
|||||||
@@ -234,4 +234,17 @@ module Discourse
|
|||||||
"/site/read-only"
|
"/site/read-only"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# all forking servers must call this
|
||||||
|
# after fork, otherwise Discourse will be
|
||||||
|
# in a bad state
|
||||||
|
def self.after_fork
|
||||||
|
SiteSetting.after_fork
|
||||||
|
ActiveRecord::Base.establish_connection
|
||||||
|
$redis.client.reconnect
|
||||||
|
Rails.cache.reconnect
|
||||||
|
MessageBus.after_fork
|
||||||
|
# /!\ HACK /!\ force sidekiq to create a new connection to redis
|
||||||
|
Sidekiq.instance_variable_set(:@redis, nil)
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -179,6 +179,10 @@ module SiteSettingExtension
|
|||||||
@@process_id ||= SecureRandom.uuid
|
@@process_id ||= SecureRandom.uuid
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def after_fork
|
||||||
|
@@process_id = nil
|
||||||
|
end
|
||||||
|
|
||||||
def remove_override!(name)
|
def remove_override!(name)
|
||||||
provider.destroy(name)
|
provider.destroy(name)
|
||||||
current[name] = defaults[name]
|
current[name] = defaults[name]
|
||||||
|
|||||||
@@ -98,9 +98,7 @@ end
|
|||||||
|
|
||||||
Spork.each_run do
|
Spork.each_run do
|
||||||
# This code will be run each time you run your specs.
|
# This code will be run each time you run your specs.
|
||||||
$redis.client.reconnect
|
Discourse.after_fork
|
||||||
Rails.cache.reconnect
|
|
||||||
MessageBus.after_fork
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# --- Instructions ---
|
# --- Instructions ---
|
||||||
|
|||||||
Reference in New Issue
Block a user