class CopyTunerClient::ProcessGuard
will not need to interact with this class directly.
processes and completing background jobs. Applications using the client
process (such as in Unicorn or Passenger). Also registers hooks for exiting
Starts the poller from a worker process, or register hooks for a spawner
def initialize(cache, poller, options)
(**options)
-
:logger
(Logger
) -- where errors should be logged
Parameters:
-
options
(Hash
) --
def initialize(cache, poller, options) @cache = cache @poller = poller @logger = options[:logger] end
def passenger_spawner?
def passenger_spawner? $0.include?("ApplicationSpawner") end
def register_exit_hooks
def register_exit_hooks at_exit do @cache.flush end end
def register_job_hooks
def register_job_hooks if defined?(Resque::Job) @logger.info("Registered Resque after_perform hook") cache = @cache Resque::Job.class_eval do alias_method :perform_without_copy_tuner, :perform define_method :perform do job_was_performed = perform_without_copy_tuner cache.flush job_was_performed end end end end
def register_passenger_hook
def register_passenger_hook @logger.info("Registered Phusion Passenger fork hook") PhusionPassenger.on_event(:starting_worker_process) do |forked| start_polling end end
def register_spawn_hooks
def register_spawn_hooks if defined?(PhusionPassenger) register_passenger_hook elsif defined?(Unicorn::HttpServer) register_unicorn_hook end end
def register_unicorn_hook
def register_unicorn_hook @logger.info("Registered Unicorn fork hook") poller = @poller Unicorn::HttpServer.class_eval do alias_method :worker_loop_without_copy_tuner, :worker_loop define_method :worker_loop do |worker| poller.start worker_loop_without_copy_tuner(worker) end end end
def spawner?
def spawner? passenger_spawner? || unicorn_spawner? end
def start
def start if spawner? register_spawn_hooks else register_exit_hooks register_job_hooks start_polling end end
def start_polling
def start_polling @poller.start end
def unicorn_spawner?
def unicorn_spawner? $0.include?("unicorn") && !caller.any? { |line| line.include?("worker_loop") } end