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_ROLES (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 ]
 | 
