48 lines
1.0 KiB
Ruby
Executable File
48 lines
1.0 KiB
Ruby
Executable File
#!/usr/bin/env ruby
|
|
|
|
# A sample pre-connect check
|
|
#
|
|
# Warms DNS before connecting to hosts in parallel
|
|
#
|
|
# These environment variables are available:
|
|
# KAMAL_RECORDED_AT
|
|
# KAMAL_PERFORMER
|
|
# KAMAL_VERSION
|
|
# KAMAL_HOSTS
|
|
# KAMAL_ROLE (if set)
|
|
# KAMAL_DESTINATION (if set)
|
|
# KAMAL_RUNTIME
|
|
|
|
hosts = ENV["KAMAL_HOSTS"].split(",")
|
|
results = nil
|
|
max = 3
|
|
|
|
elapsed = Benchmark.realtime do
|
|
results = hosts.map do |host|
|
|
Thread.new do
|
|
tries = 1
|
|
|
|
begin
|
|
Socket.getaddrinfo(host, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME)
|
|
rescue SocketError
|
|
if tries < max
|
|
puts "Retrying DNS warmup: #{host}"
|
|
tries += 1
|
|
sleep rand
|
|
retry
|
|
else
|
|
puts "DNS warmup failed: #{host}"
|
|
host
|
|
end
|
|
end
|
|
|
|
tries
|
|
end
|
|
end.map(&:value)
|
|
end
|
|
|
|
retries = results.sum - hosts.size
|
|
nopes = results.count { |r| r == max }
|
|
|
|
puts "Prewarmed %d DNS lookups in %.2f sec: %d retries, %d failures" % [ hosts.size, elapsed, retries, nopes ]
|