|
- #!/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 ]
|