From a8f29f6455c303bbd321af248a730ca8b41f2f27 Mon Sep 17 00:00:00 2001 From: schneems Date: Mon, 6 Jun 2016 15:24:56 -0500 Subject: Listen earlier in EventedFileUpdateChecker Some files like routes.rb may be very large and vary between the initialization of the app and the first request. In these scenarios if we are using a forked process we cannot rely on the files to be unchanged between when the code is booted and the listener is started. For that reason we start a listener on the main process immediately, when we detect that a process does not have a listener started we force the updated state to be true, so we are guaranteed to catch any changes made between the code initialization and the fork. --- .../lib/active_support/evented_file_update_checker.rb | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'activesupport') diff --git a/activesupport/lib/active_support/evented_file_update_checker.rb b/activesupport/lib/active_support/evented_file_update_checker.rb index c0ad21b0df..063839f5af 100644 --- a/activesupport/lib/active_support/evented_file_update_checker.rb +++ b/activesupport/lib/active_support/evented_file_update_checker.rb @@ -13,8 +13,7 @@ module ActiveSupport # EventedFileUpdateChecker#execute is run or when EventedFileUpdateChecker#execute_if_updated # is run and there have been changes to the file system. # - # Note: To start listening to change events you must first call - # EventedFileUpdateChecker#updated? inside of each process. + # Note: Forking will cause the first call to `updated?` to return `true`. # # Example: # @@ -41,10 +40,11 @@ module ActiveSupport @dirs[@ph.xpath(dir)] = Array(exts).map { |ext| @ph.normalize_extension(ext) } end - @block = block - @updated = Concurrent::AtomicBoolean.new(false) - @lcsp = @ph.longest_common_subpath(@dirs.keys) - @pid_hash = Concurrent::Hash.new + @block = block + @updated = Concurrent::AtomicBoolean.new(false) + @lcsp = @ph.longest_common_subpath(@dirs.keys) + @pid_hash = Concurrent::Hash.new + @parent_pid = Process.pid if (@dtw = directories_to_watch).any? # Loading listen triggers warnings. These are originated by a legit @@ -58,6 +58,7 @@ module ActiveSupport end end end + boot! end def updated? @@ -82,6 +83,7 @@ module ActiveSupport def boot! Listen.to(*@dtw, &method(:changed)).start @pid_hash[Process.pid] = true + @updated.make_true if @parent_pid != Process.pid end def changed(modified, added, removed) -- cgit v1.2.3