thin 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of thin might be problematic. Click here for more details.
- data/CHANGELOG +4 -0
- data/benchmark/simple.rb +2 -1
- data/benchmark/utils.rb +32 -8
- data/lib/thin/cluster.rb +1 -1
- data/lib/thin/server.rb +14 -7
- data/lib/thin/version.rb +2 -2
- data/lib/thin_parser.bundle +0 -0
- data/spec/server_spec.rb +10 -5
- metadata +1 -2
data/CHANGELOG
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
== 0.6.1 Cheesecake release
|
2
|
+
* Remove socket file when server stops.
|
3
|
+
* Set back cluster to use 'thin' command to launch servers.
|
4
|
+
|
1
5
|
== 0.6.0 Big Pony release
|
2
6
|
* Add support for connection through UNIX domain socket.
|
3
7
|
Use the --socket (-S) option w/ the thin script to configure the socket filename.
|
data/benchmark/simple.rb
CHANGED
@@ -9,5 +9,6 @@ require File.dirname(__FILE__) + '/../lib/thin'
|
|
9
9
|
require File.dirname(__FILE__) + '/utils'
|
10
10
|
|
11
11
|
request = (ARGV[0] || 1000).to_i # Number of request to send (ab -n option)
|
12
|
+
output_type = (ARGV[1] || 'print')
|
12
13
|
|
13
|
-
benchmark %w(WEBrick Mongrel EMongrel Thin), request
|
14
|
+
benchmark output_type, %w(WEBrick Mongrel EMongrel Thin), request, [1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
|
data/benchmark/utils.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'rack/lobster'
|
2
2
|
|
3
3
|
def run(handler_name, n=1000, c=1)
|
4
|
+
port = 7000
|
5
|
+
|
4
6
|
server = fork do
|
5
7
|
[STDOUT, STDERR].each { |o| o.reopen "/dev/null" }
|
6
8
|
|
@@ -22,27 +24,49 @@ def run(handler_name, n=1000, c=1)
|
|
22
24
|
app = Rack::Lobster.new
|
23
25
|
|
24
26
|
handler = Rack::Handler.const_get(handler_name)
|
25
|
-
handler.run app, :Host => '0.0.0.0', :Port =>
|
27
|
+
handler.run app, :Host => '0.0.0.0', :Port => port
|
26
28
|
end
|
27
29
|
|
28
30
|
sleep 2
|
29
31
|
|
30
|
-
out = `nice -n20 ab -c #{c} -n #{n} http://127.0.0.1:
|
32
|
+
out = `nice -n20 ab -c #{c} -n #{n} http://127.0.0.1:port/ 2> /dev/null`
|
31
33
|
|
32
34
|
Process.kill('SIGKILL', server)
|
33
35
|
Process.wait
|
34
36
|
|
35
37
|
if requests = out.match(/^Requests.+?(\d+\.\d+)/)
|
36
|
-
|
37
|
-
"#{requests[1].to_s.ljust(9)} #{failed}"
|
38
|
+
requests[1].to_i
|
38
39
|
else
|
39
|
-
|
40
|
+
0
|
40
41
|
end
|
41
42
|
end
|
42
43
|
|
43
|
-
def benchmark(servers, request, concurrency_levels
|
44
|
-
|
45
|
-
|
44
|
+
def benchmark(type, servers, request, concurrency_levels)
|
45
|
+
send "#{type}_benchmark", servers, request, concurrency_levels
|
46
|
+
end
|
47
|
+
|
48
|
+
def graph_benchmark(servers, request, concurrency_levels)
|
49
|
+
require '/usr/local/lib/ruby/gems/1.8/gems/gruff-0.2.9/lib/gruff'
|
50
|
+
g = Gruff::Area.new
|
51
|
+
g.title = "Server benchmark"
|
52
|
+
|
53
|
+
servers.each do |server|
|
54
|
+
g.data(server, concurrency_levels.collect { |c| print '.'; run(server, request, c) })
|
55
|
+
end
|
56
|
+
puts
|
57
|
+
|
58
|
+
g.x_axis_label = 'Concurrency'
|
59
|
+
g.y_axis_label = 'Requests / sec'
|
60
|
+
g.labels = {}
|
61
|
+
concurrency_levels.each_with_index { |c, i| g.labels[i] = c.to_s }
|
62
|
+
|
63
|
+
g.write('bench.png')
|
64
|
+
`open bench.png`
|
65
|
+
end
|
66
|
+
|
67
|
+
def print_benchmark(servers, request, concurrency_levels)
|
68
|
+
puts 'server request concurrency req/s'
|
69
|
+
puts '=' * 42
|
46
70
|
concurrency_levels.each do |c|
|
47
71
|
servers.each do |server|
|
48
72
|
puts "#{server.ljust(8)} #{request} #{c.to_s.ljust(4)} #{run(server, request, c)}"
|
data/lib/thin/cluster.rb
CHANGED
@@ -20,7 +20,7 @@ module Thin
|
|
20
20
|
def initialize(options)
|
21
21
|
@options = options.merge(:daemonize => true)
|
22
22
|
@size = @options.delete(:servers)
|
23
|
-
@script =
|
23
|
+
@script = 'thin'
|
24
24
|
|
25
25
|
if socket
|
26
26
|
@options.delete(:address)
|
data/lib/thin/server.rb
CHANGED
@@ -43,12 +43,12 @@ module Thin
|
|
43
43
|
def initialize(host_or_socket, port=3000, app=nil, &block)
|
44
44
|
if host_or_socket.include?('/')
|
45
45
|
@socket = host_or_socket
|
46
|
-
else
|
47
|
-
@host
|
48
|
-
@port
|
49
|
-
end
|
50
|
-
@app
|
51
|
-
@timeout
|
46
|
+
else
|
47
|
+
@host = host_or_socket
|
48
|
+
@port = port.to_i
|
49
|
+
end
|
50
|
+
@app = app
|
51
|
+
@timeout = 60 # sec
|
52
52
|
|
53
53
|
@app = Rack::Builder.new(&block).to_app if block
|
54
54
|
end
|
@@ -59,10 +59,12 @@ module Thin
|
|
59
59
|
|
60
60
|
# Start the server and listen for connections
|
61
61
|
def start
|
62
|
-
raise ArgumentError,
|
62
|
+
raise ArgumentError, 'app required' unless @app
|
63
63
|
|
64
64
|
trap('INT') { stop }
|
65
65
|
trap('TERM') { stop! }
|
66
|
+
|
67
|
+
at_exit { remove_socket_file } if @socket
|
66
68
|
|
67
69
|
# See http://rubyeventmachine.com/pub/rdoc/files/EPOLL.html
|
68
70
|
EventMachine.epoll
|
@@ -83,6 +85,7 @@ module Thin
|
|
83
85
|
# Stops the server by stopping the listening loop.
|
84
86
|
def stop
|
85
87
|
EventMachine.stop_event_loop
|
88
|
+
remove_socket_file
|
86
89
|
rescue
|
87
90
|
warn "Error stopping : #{$!}"
|
88
91
|
end
|
@@ -117,5 +120,9 @@ module Thin
|
|
117
120
|
connection.silent = @silent
|
118
121
|
connection.unix_socket = !@socket.nil?
|
119
122
|
end
|
123
|
+
|
124
|
+
def remove_socket_file
|
125
|
+
File.delete(@socket) if @socket && File.exist?(@socket)
|
126
|
+
end
|
120
127
|
end
|
121
128
|
end
|
data/lib/thin/version.rb
CHANGED
data/lib/thin_parser.bundle
CHANGED
Binary file
|
data/spec/server_spec.rb
CHANGED
@@ -122,11 +122,11 @@ describe Server, "on UNIX domain socket" do
|
|
122
122
|
app = proc do |env|
|
123
123
|
[200, { 'Content-Type' => 'text/html' }, [env.inspect]]
|
124
124
|
end
|
125
|
-
server = Thin::Server.new('/tmp/thin_test.sock', nil, app)
|
126
|
-
server.timeout = 3
|
127
|
-
server.silent = true
|
125
|
+
@server = Thin::Server.new('/tmp/thin_test.sock', nil, app)
|
126
|
+
@server.timeout = 3
|
127
|
+
@server.silent = true
|
128
128
|
|
129
|
-
@thread = Thread.new { server.start }
|
129
|
+
@thread = Thread.new { @server.start }
|
130
130
|
sleep 0.1 until @thread.status == 'sleep'
|
131
131
|
end
|
132
132
|
|
@@ -140,7 +140,12 @@ describe Server, "on UNIX domain socket" do
|
|
140
140
|
|
141
141
|
it "should handle GET in less then #{get_request_time = 0.002} RubySecond" do
|
142
142
|
proc { get('/') }.should be_faster_then(get_request_time)
|
143
|
-
end
|
143
|
+
end
|
144
|
+
|
145
|
+
it "should remove socket file after server stops" do
|
146
|
+
@server.stop
|
147
|
+
File.exist?('/tmp/thin_test.sock').should be_false
|
148
|
+
end
|
144
149
|
|
145
150
|
after do
|
146
151
|
@thread.kill
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: thin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc-Andre Cournoyer
|
@@ -104,7 +104,6 @@ files:
|
|
104
104
|
- spec/rails_app/config/initializers/inflections.rb
|
105
105
|
- spec/rails_app/config/initializers/mime_types.rb
|
106
106
|
- spec/rails_app/config/routes.rb
|
107
|
-
- spec/rails_app/log
|
108
107
|
- spec/rails_app/public
|
109
108
|
- spec/rails_app/public/404.html
|
110
109
|
- spec/rails_app/public/422.html
|