mirror of
https://github.com/discourse/discourse.git
synced 2024-11-25 09:42:07 +08:00
FEATURE: Allow plugins to register demon processes (#11493)
This allows plugins to call `register_demon_process` with a Class inheriting from Demon::Base. The unicorn master process will take care of spawning, monitoring and restarting the process. This API should be used with extreme caution, but it is significantly cleaner than spawning processes/threads in an `after_initialize` block. This commit also cleans up the demon spawning logging so that it uses the same format as unicorn worker logging. It also switches to the block form of `fork` to ensure that Demons exit after running, rather than returning execution to where the fork took place.
This commit is contained in:
parent
38b6b098bc
commit
1d024f77a6
|
@ -82,7 +82,7 @@ before_fork do |server, worker|
|
|||
|
||||
sidekiqs = ENV['UNICORN_SIDEKIQS'].to_i
|
||||
if sidekiqs > 0
|
||||
puts "Starting up #{sidekiqs} supervised sidekiqs"
|
||||
server.logger.info "starting #{sidekiqs} supervised sidekiqs"
|
||||
|
||||
require 'demon/sidekiq'
|
||||
Demon::Sidekiq.after_fork do
|
||||
|
@ -105,7 +105,7 @@ before_fork do |server, worker|
|
|||
end
|
||||
|
||||
if ENV['DISCOURSE_ENABLE_EMAIL_SYNC_DEMON'] == 'true'
|
||||
puts "Starting up EmailSync demon"
|
||||
server.logger.info "starting up EmailSync demon"
|
||||
Demon::EmailSync.start
|
||||
Signal.trap("SIGTSTP") do
|
||||
STDERR.puts "#{Time.now}: Issuing stop to EmailSync"
|
||||
|
@ -113,6 +113,11 @@ before_fork do |server, worker|
|
|||
end
|
||||
end
|
||||
|
||||
DiscoursePluginRegistry.demon_processes.each do |demon_class|
|
||||
server.logger.info "starting #{demon_class.prefix} demon"
|
||||
demon_class.start
|
||||
end
|
||||
|
||||
class ::Unicorn::HttpServer
|
||||
alias :master_sleep_orig :master_sleep
|
||||
|
||||
|
@ -230,6 +235,10 @@ before_fork do |server, worker|
|
|||
check_email_sync_heartbeat
|
||||
end
|
||||
|
||||
DiscoursePluginRegistry.demon_processes.each do |demon_class|
|
||||
demon_class.ensure_running
|
||||
end
|
||||
|
||||
master_sleep_orig(sec)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -141,16 +141,14 @@ class Demon::Base
|
|||
end
|
||||
|
||||
def run
|
||||
if @pid = fork
|
||||
write_pid_file
|
||||
return
|
||||
end
|
||||
|
||||
@pid = fork do
|
||||
Process.setproctitle("discourse #{self.class.prefix}")
|
||||
monitor_parent
|
||||
establish_app
|
||||
after_fork
|
||||
end
|
||||
write_pid_file
|
||||
end
|
||||
|
||||
def already_running?
|
||||
if File.exists? pid_file
|
||||
|
|
|
@ -68,6 +68,7 @@ class DiscoursePluginRegistry
|
|||
define_register :vendored_pretty_text, Set
|
||||
define_register :vendored_core_pretty_text, Set
|
||||
define_register :seedfu_filter, Set
|
||||
define_register :demon_processes, Set
|
||||
|
||||
define_filtered_register :staff_user_custom_fields
|
||||
define_filtered_register :public_user_custom_fields
|
||||
|
|
|
@ -861,6 +861,15 @@ class Plugin::Instance
|
|||
), self)
|
||||
end
|
||||
|
||||
# Register a new demon process to be forked by the Unicorn master.
|
||||
# The demon_class should inherit from Demon::Base.
|
||||
# With great power comes great responsibility - this method should
|
||||
# be used with extreme caution. See `config/unicorn.conf.rb`.
|
||||
def register_demon_process(demon_class)
|
||||
raise "Not a demon class" if !demon_class.ancestors.include?(Demon::Base)
|
||||
DiscoursePluginRegistry.demon_processes << demon_class
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
def self.js_path
|
||||
|
|
Loading…
Reference in New Issue
Block a user