thin 0.6.4 → 0.7.0

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.

Files changed (45) hide show
  1. data/CHANGELOG +20 -0
  2. data/README +11 -12
  3. data/benchmark/abc +51 -0
  4. data/benchmark/benchmarker.rb +80 -0
  5. data/benchmark/runner +79 -0
  6. data/example/adapter.rb +3 -3
  7. data/example/thin.god +11 -7
  8. data/lib/thin.rb +17 -16
  9. data/lib/thin/command.rb +10 -4
  10. data/lib/thin/connection.rb +46 -13
  11. data/lib/thin/connectors/connector.rb +22 -10
  12. data/lib/thin/connectors/swiftiply_client.rb +55 -0
  13. data/lib/thin/controllers/cluster.rb +28 -22
  14. data/lib/thin/controllers/controller.rb +74 -14
  15. data/lib/thin/controllers/service.rb +1 -1
  16. data/lib/thin/daemonizing.rb +6 -4
  17. data/lib/thin/headers.rb +4 -0
  18. data/lib/thin/logging.rb +34 -9
  19. data/lib/thin/request.rb +31 -2
  20. data/lib/thin/response.rb +22 -7
  21. data/lib/thin/runner.rb +27 -14
  22. data/lib/thin/server.rb +55 -7
  23. data/lib/thin/version.rb +3 -3
  24. data/spec/command_spec.rb +2 -3
  25. data/spec/connection_spec.rb +15 -1
  26. data/spec/connectors/swiftiply_client_spec.rb +66 -0
  27. data/spec/controllers/cluster_spec.rb +43 -12
  28. data/spec/controllers/controller_spec.rb +16 -4
  29. data/spec/controllers/service_spec.rb +0 -1
  30. data/spec/logging_spec.rb +42 -0
  31. data/spec/request/persistent_spec.rb +35 -0
  32. data/spec/response_spec.rb +18 -0
  33. data/spec/server/pipelining_spec.rb +108 -0
  34. data/spec/server/swiftiply.yml +6 -0
  35. data/spec/server/swiftiply_spec.rb +27 -0
  36. data/spec/server/tcp_spec.rb +3 -3
  37. data/spec/server_spec.rb +22 -0
  38. data/spec/spec_helper.rb +3 -3
  39. data/tasks/gem.rake +1 -1
  40. data/tasks/spec.rake +9 -0
  41. metadata +13 -6
  42. data/benchmark/previous.rb +0 -14
  43. data/benchmark/simple.rb +0 -15
  44. data/benchmark/utils.rb +0 -75
  45. data/lib/thin_parser.bundle +0 -0
@@ -1,14 +0,0 @@
1
- # Benchmark to compare Thin performance against
2
- # previous Thin version (the one installed as a gem).
3
- #
4
- # Run with:
5
- #
6
- # ruby previous.rb [num of request]
7
- #
8
- require 'rubygems'
9
- require 'rack'
10
- require File.dirname(__FILE__) + '/utils'
11
-
12
- request = (ARGV[0] || 1000).to_i # Number of request to send (ab -n option)
13
-
14
- benchmark %w(current gem), request
@@ -1,15 +0,0 @@
1
- # Simple benchmark to compare Thin performance against
2
- # other webservers supported by Rack.
3
- #
4
- # Run with:
5
- #
6
- # ruby simple.rb [num of request] [print|graph] [concurrency levels]
7
- #
8
- require File.dirname(__FILE__) + '/../lib/thin'
9
- require File.dirname(__FILE__) + '/utils'
10
-
11
- request = (ARGV[0] || 1000).to_i # Number of request to send (ab -n option)
12
- output_type = (ARGV[1] || 'print')
13
- levels = eval(ARGV[2] || '[1, 10, 100]').to_a
14
-
15
- benchmark output_type, %w(WEBrick Mongrel EMongrel Thin), request, levels
@@ -1,75 +0,0 @@
1
- require 'rack/lobster'
2
-
3
- def run(handler_name, n=1000, c=1)
4
- port = 7000
5
-
6
- server = fork do
7
- [STDOUT, STDERR].each { |o| o.reopen "/dev/null" }
8
-
9
- case handler_name
10
- when 'EMongrel'
11
- require 'swiftcore/evented_mongrel'
12
- handler_name = 'Mongrel'
13
-
14
- when 'gem' # Load the current Thin gem
15
- require 'thin'
16
- handler_name = 'Thin'
17
-
18
- when 'current' # Load the current Thin version under /lib
19
- require File.dirname(__FILE__) + '/../lib/thin'
20
- handler_name = 'Thin'
21
-
22
- end
23
-
24
- app = Rack::Lobster.new
25
-
26
- handler = Rack::Handler.const_get(handler_name)
27
- handler.run app, :Host => '0.0.0.0', :Port => port
28
- end
29
-
30
- sleep 2
31
-
32
- out = `nice -n20 ab -c #{c} -n #{n} http://127.0.0.1:#{port}/ 2> /dev/null`
33
-
34
- Process.kill('SIGKILL', server)
35
- Process.wait
36
-
37
- if requests = out.match(/^Requests.+?(\d+\.\d+)/)
38
- requests[1].to_i
39
- else
40
- 0
41
- end
42
- end
43
-
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
70
- concurrency_levels.each do |c|
71
- servers.each do |server|
72
- puts "#{server.ljust(8)} #{request} #{c.to_s.ljust(4)} #{run(server, request, c)}"
73
- end
74
- end
75
- end
Binary file