mirror of
https://github.com/discourse/discourse.git
synced 2024-12-05 09:04:01 +08:00
DEV(cache_critical_dns): add option to run once and exit
There are situations where a container running Discourse may want to cache the critical DNS services without running the cache_critical_dns service, for example running migrations prior to running a full bore application container. Add a `--once` argument for the cache_critical_dns script that will only execute the main loop once, and return the status code for the script to use when exiting. 0 indicates no errors occured during SRV resolution, and 1 indicates a failure during the SRV lookup. Nothing is reported to prometheus in run_once mode. Generally this mode of operation would be a part of a unix pipeline, in which the exit status is a more meaningful and immediate signal than a prometheus metric. The reporting has been moved into it's own method that can be called only when the script is running as a service. See /t/69597.
This commit is contained in:
parent
7804eb44e6
commit
bc8ad2a5d2
|
@ -1,6 +1,8 @@
|
||||||
#!/usr/bin/env ruby
|
#!/usr/bin/env ruby
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'optparse'
|
||||||
|
|
||||||
# cache_critical_dns is intended to be used for performing DNS lookups against
|
# cache_critical_dns is intended to be used for performing DNS lookups against
|
||||||
# the services critical for Discourse to run - PostgreSQL and Redis. The
|
# the services critical for Discourse to run - PostgreSQL and Redis. The
|
||||||
# cache mechanism is storing the resolved host addresses in /etc/hosts. This can
|
# cache mechanism is storing the resolved host addresses in /etc/hosts. This can
|
||||||
|
@ -360,6 +362,15 @@ def env_srv_name(env_name)
|
||||||
nilempty(ENV[env_srv_var(env_name)])
|
nilempty(ENV[env_srv_var(env_name)])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def run_and_report(hostname_vars)
|
||||||
|
errors = run(hostname_vars)
|
||||||
|
if errors.empty?
|
||||||
|
report_success
|
||||||
|
else
|
||||||
|
report_failure(errors)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def run(hostname_vars)
|
def run(hostname_vars)
|
||||||
# HOSTNAME: [IP_ADDRESS, ...]
|
# HOSTNAME: [IP_ADDRESS, ...]
|
||||||
# this will usually be a single address
|
# this will usually be a single address
|
||||||
|
@ -411,11 +422,7 @@ rescue => e
|
||||||
error("DNS lookup failed: #{e}")
|
error("DNS lookup failed: #{e}")
|
||||||
errors[nil] = 1
|
errors[nil] = 1
|
||||||
ensure
|
ensure
|
||||||
if errors == {}
|
return errors
|
||||||
report_success
|
|
||||||
else
|
|
||||||
report_failure(errors)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# If any of the host variables are an explicit IP we will not attempt to cache
|
# If any of the host variables are an explicit IP we will not attempt to cache
|
||||||
|
@ -448,7 +455,21 @@ CRITICAL_HOST_ENV_VARS.each do |v|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
options = {
|
||||||
|
once: false,
|
||||||
|
}
|
||||||
|
OptionParser.new do |opts|
|
||||||
|
opts.on("--once", "run script once instead of indefinitely") do |o|
|
||||||
|
options[:once] = true
|
||||||
|
end
|
||||||
|
end.parse!
|
||||||
|
|
||||||
|
if options[:once]
|
||||||
|
errors = run(all_hostname_vars)
|
||||||
|
exit errors.empty? ? 0 : 1
|
||||||
|
end
|
||||||
|
|
||||||
while true
|
while true
|
||||||
run(all_hostname_vars)
|
run_and_report(all_hostname_vars)
|
||||||
sleep REFRESH_SECONDS
|
sleep REFRESH_SECONDS
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue
Block a user