X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/ac2ea4ef187f7df369551a8cfa047fed8a1a2ba9..2f83fcd45b4b23db2bb5bb4afbe1e863ebd77ec6:/services/api/config/initializers/reload_config.rb diff --git a/services/api/config/initializers/reload_config.rb b/services/api/config/initializers/reload_config.rb index 0698f92ca0..b54e3bcf87 100644 --- a/services/api/config/initializers/reload_config.rb +++ b/services/api/config/initializers/reload_config.rb @@ -2,11 +2,10 @@ # # SPDX-License-Identifier: AGPL-3.0 -if !File.owned?(Rails.root.join('tmp')) - Rails.logger.debug("reload_config: not owner of #{Rails.root}/tmp, skipping") -elsif ENV["ARVADOS_CONFIG"] == "none" - Rails.logger.debug("reload_config: no config in use, skipping") -else +# When updating this, please make the same changes in +# apps/workbench/config/initializers/reload_config.rb as well. + +def start_reload_thread Thread.new do lockfile = Rails.root.join('tmp', 'reload_config.lock') File.open(lockfile, File::WRONLY|File::CREAT, 0600) do |f| @@ -35,19 +34,26 @@ else rescue => e Rails.logger.info("reload_config: config file updated but could not be loaded: #{e}") t_lastload = t - continue + next end if hash == hash_lastload # If we reloaded a new or updated file, but the content is # identical, keep polling instead of restarting. t_lastload = t - continue + next end restartfile = Rails.root.join('tmp', 'restart.txt') touchtime = Time.now Rails.logger.info("reload_config: mtime on #{conffile} changed to #{t}, touching #{restartfile} to #{touchtime}") - File.utime(touchtime, touchtime, restartfile) + begin + File.utime(touchtime, touchtime, restartfile) + rescue + # remove + re-create works even if the existing file is + # owned by root, provided the tempdir is writable. + File.unlink(restartfile) rescue nil + File.open(restartfile, 'w') {} + end # Even if passenger doesn't notice that we hit restart.txt # and kill our process, there's no point waiting around to # hit it again. @@ -57,3 +63,15 @@ else end end end + +if !File.owned?(Rails.root.join('tmp')) + Rails.logger.debug("reload_config: not owner of #{Rails.root}/tmp, skipping") +elsif ENV["ARVADOS_CONFIG"] == "none" + Rails.logger.debug("reload_config: no config in use, skipping") +elsif defined?(PhusionPassenger) + PhusionPassenger.on_event(:starting_worker_process) do |forked| + start_reload_thread + end +else + start_reload_thread +end