lib/caddy.rb in caddy-1.5.5 vs lib/caddy.rb in caddy-1.6.0

- old
+ new

@@ -3,54 +3,82 @@ require "caddy/version" require "caddy/task_observer" require "caddy/cache" +# Caddy gives you a auto-updating global cache to speed up requests module Caddy class << self + # @!attribute error_handler + # @return [Proc] called when any cache refresher throws an exception (or times out) attr_accessor :error_handler + + # see {#logger} + attr_writer :logger end @started_pid = nil @caches = Hash.new { |h, k| h[k] = Caddy::Cache.new(k) } + @needs_fork_check = !Concurrent::TimerSet.private_method_defined?(:ns_reset_if_forked) - ## - # Returns the cache object for key +k+. + # Returns the cache object at a key. # # If the cache at +k+ does not exist yet, Caddy will initialize an empty one. + # + # @param k [Symbol] the cache key. + # @return [Caddy::Cache] the cache object at key +k+. def self.[](k) @caches[k] end - ## # Starts the Caddy refresh processes for all caches. # # If the refresh process was started pre-fork, Caddy will error out, as this means # the refresh process would have been killed by the fork. # # Caddy freezes the hash of caches at this point, so no more further caches can be # added after start. def self.start - if !@started_pid - @started_pid = $$ - elsif @started_pid && $$ != @started_pid - raise "Please run `Caddy.start` *after* forking, as the refresh thread will get killed after fork" - end + raise_if_forked if @needs_fork_check + logger.info "Starting Caddy with refreshers: #{@caches.keys.join(', ')}" - @caches.freeze - @caches.values.each(&:start).all? end - ## # Cleanly shut down all currently running refreshers. def self.stop + logger.info "Stopping Caddy refreshers" + @caches.values.each(&:stop).all? end - ## - # Start and then stop again all refreshers. Useful for triggering an immediate refresh of all caches. + # Start and then stop all refreshers. Useful for triggering an immediate refresh of all caches. def self.restart stop start + end + + # @!attribute logger + # @return [Logger] logger used for all non-fatals; defaults to the Rails logger if it exists + def self.logger + @logger ||= begin + if defined?(Rails.logger) + Rails.logger + else + @logger ||= Logger.new(STDOUT).tap do |logger| + logger.formatter = -> (_, datetime, _, msg) { "#{datetime}: #{msg}\n" } + end + end + end + end + + # TODO: when https://github.com/ruby-concurrency/concurrent-ruby/pull/573 is merged, remove this whole block + # or add a warning + # @private + def self.raise_if_forked + if !@started_pid + @started_pid = $$ + elsif @started_pid && $$ != @started_pid + raise "Please run `Caddy.start` *after* forking, as the refresh thread will get killed after fork" + end end end