Controller
Control a set of servers.
Generate start and stop commands and run them.
Inject the port or socket number in the pid and log filenames.
Servers are started throught the thin command-line script.
Cluster only options that should not be passed in the command sent to the indiviual servers.
Maximum wait time for the server to be restarted
# File lib/thin/controllers/cluster.rb, line 28 def address; @options[:address] end
# File lib/thin/controllers/cluster.rb, line 27 def first_port; @options[:port] end
# File lib/thin/controllers/cluster.rb, line 31 def log_file; @options[:log] end
# File lib/thin/controllers/cluster.rb, line 123 def log_file_for(number) include_server_number log_file, number end
# File lib/thin/controllers/cluster.rb, line 34 def onebyone; @options[:onebyone] end
# File lib/thin/controllers/cluster.rb, line 33 def only; @options[:only] end
# File lib/thin/controllers/cluster.rb, line 30 def pid_file; @options[:pid] end
# File lib/thin/controllers/cluster.rb, line 127 def pid_file_for(number) include_server_number pid_file, number end
# File lib/thin/controllers/cluster.rb, line 135 def pid_for(number) File.read(pid_file_for(number)).chomp.to_i end
Stop and start the servers.
# File lib/thin/controllers/cluster.rb, line 66 def restart unless onebyone # Let's do a normal restart by defaults stop sleep 0.1 # Let's breath a bit shall we ? start else with_each_server do |n| stop_server(n) sleep 0.1 # Let's breath a bit shall we ? start_server(n) wait_until_server_started(n) end end end
# File lib/thin/controllers/cluster.rb, line 113 def server_id(number) if socket socket_for(number) elsif swiftiply? [address, first_port, number].join(':') else [address, number].join(':') end end
# File lib/thin/controllers/cluster.rb, line 32 def size; @options[:servers] end
# File lib/thin/controllers/cluster.rb, line 29 def socket; @options[:socket] end
# File lib/thin/controllers/cluster.rb, line 131 def socket_for(number) include_server_number socket, number end
Start the servers
# File lib/thin/controllers/cluster.rb, line 42 def start with_each_server { |n| start_server n } end
Start a single server
# File lib/thin/controllers/cluster.rb, line 47 def start_server(number) log_info "Starting server on #{server_id(number)} ... " run :start, number end
Stop the servers
# File lib/thin/controllers/cluster.rb, line 54 def stop with_each_server { |n| stop_server n } end
Stop a single server
# File lib/thin/controllers/cluster.rb, line 59 def stop_server(number) log_info "Stopping server on #{server_id(number)} ... " run :stop, number end
# File lib/thin/controllers/cluster.rb, line 37 def swiftiply? @options.has_key?(:swiftiply) end
# File lib/thin/controllers/cluster.rb, line 82 def test_socket(number) if socket UNIXSocket.new(socket_for(number)) else TCPSocket.new(address, number) end rescue nil end
# File lib/thin/controllers/cluster.rb, line 35 def wait; @options[:wait] end
Make sure the server is running before moving on to the next one.
# File lib/thin/controllers/cluster.rb, line 93 def wait_until_server_started(number) log_info "Waiting for server to start ..." STDOUT.flush # Need this to make sure user got the message tries = 0 loop do if test_socket = test_socket(number) test_socket.close break elsif tries < wait sleep 1 tries += 1 else raise RestartTimeout, "The server didn't start in time. Please look at server's log file " + "for more information, or set the value of 'wait' in your config " + "file to be higher (defaults: 30)." end end end
Generated with the Darkfish Rdoc Generator 2.