View raw

1 #!/usr/bin/env ruby 2 3 # A sample pre-connect check 4 # 5 # Warms DNS before connecting to hosts in parallel 6 # 7 # These environment variables are available: 8 # KAMAL_RECORDED_AT 9 # KAMAL_PERFORMER 10 # KAMAL_VERSION 11 # KAMAL_HOSTS 12 # KAMAL_ROLE (if set) 13 # KAMAL_DESTINATION (if set) 14 # KAMAL_RUNTIME 15 16 hosts = ENV["KAMAL_HOSTS"].split(",") 17 results = nil 18 max = 3 19 20 elapsed = Benchmark.realtime do 21 results = hosts.map do |host| 22 Thread.new do 23 tries = 1 24 25 begin 26 Socket.getaddrinfo(host, 0, Socket::AF_UNSPEC, Socket::SOCK_STREAM, nil, Socket::AI_CANONNAME) 27 rescue SocketError 28 if tries < max 29 puts "Retrying DNS warmup: #{host}" 30 tries += 1 31 sleep rand 32 retry 33 else 34 puts "DNS warmup failed: #{host}" 35 host 36 end 37 end 38 39 tries 40 end 41 end.map(&:value) 42 end 43 44 retries = results.sum - hosts.size 45 nopes = results.count { |r| r == max } 46 47 puts "Prewarmed %d DNS lookups in %.2f sec: %d retries, %d failures" % [ hosts.size, elapsed, retries, nopes ] 48