#
# 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
+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|
# precision cannot represent multiple updates per second.
if t.to_f != t_lastload.to_f || Time.now.to_f - t.to_f < 5
Open3.popen2("arvados-server", "config-dump", "-skip-legacy") do |stdin, stdout, status_thread|
- confs = YAML.load(stdout, deserialize_symbols: false)
+ confs = YAML.safe_load(stdout)
hash = confs["SourceSHA256"]
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.
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