thin 1.3.1 → 1.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. data/CHANGELOG +8 -0
  2. data/README.md +83 -0
  3. data/Rakefile +9 -32
  4. data/example/vlad.rake +1 -1
  5. data/lib/rack/adapter/loader.rb +0 -16
  6. data/lib/thin.rb +22 -24
  7. data/lib/thin/backends/base.rb +3 -1
  8. data/lib/thin/connection.rb +9 -8
  9. data/lib/thin/daemonizing.rb +3 -1
  10. data/lib/thin/logging.rb +1 -1
  11. data/lib/thin/runner.rb +36 -36
  12. data/lib/thin/server.rb +13 -0
  13. data/lib/thin/version.rb +3 -3
  14. metadata +5 -91
  15. data/README +0 -69
  16. data/benchmark/abc +0 -51
  17. data/benchmark/benchmarker.rb +0 -80
  18. data/benchmark/runner +0 -82
  19. data/spec/backends/swiftiply_client_spec.rb +0 -66
  20. data/spec/backends/tcp_server_spec.rb +0 -33
  21. data/spec/backends/unix_server_spec.rb +0 -37
  22. data/spec/command_spec.rb +0 -25
  23. data/spec/configs/cluster.yml +0 -9
  24. data/spec/configs/single.yml +0 -9
  25. data/spec/connection_spec.rb +0 -107
  26. data/spec/controllers/cluster_spec.rb +0 -267
  27. data/spec/controllers/controller_spec.rb +0 -129
  28. data/spec/controllers/service_spec.rb +0 -50
  29. data/spec/daemonizing_spec.rb +0 -200
  30. data/spec/headers_spec.rb +0 -40
  31. data/spec/logging_spec.rb +0 -52
  32. data/spec/perf/request_perf_spec.rb +0 -50
  33. data/spec/perf/response_perf_spec.rb +0 -19
  34. data/spec/perf/server_perf_spec.rb +0 -39
  35. data/spec/rack/loader_spec.rb +0 -42
  36. data/spec/rack/rails_adapter_spec.rb +0 -173
  37. data/spec/rails_app/app/controllers/application.rb +0 -10
  38. data/spec/rails_app/app/controllers/simple_controller.rb +0 -19
  39. data/spec/rails_app/app/helpers/application_helper.rb +0 -3
  40. data/spec/rails_app/app/views/simple/index.html.erb +0 -15
  41. data/spec/rails_app/config/boot.rb +0 -109
  42. data/spec/rails_app/config/environment.rb +0 -64
  43. data/spec/rails_app/config/environments/development.rb +0 -18
  44. data/spec/rails_app/config/environments/production.rb +0 -19
  45. data/spec/rails_app/config/environments/test.rb +0 -22
  46. data/spec/rails_app/config/initializers/inflections.rb +0 -10
  47. data/spec/rails_app/config/initializers/mime_types.rb +0 -5
  48. data/spec/rails_app/config/routes.rb +0 -35
  49. data/spec/rails_app/public/404.html +0 -30
  50. data/spec/rails_app/public/422.html +0 -30
  51. data/spec/rails_app/public/500.html +0 -30
  52. data/spec/rails_app/public/dispatch.cgi +0 -10
  53. data/spec/rails_app/public/dispatch.fcgi +0 -24
  54. data/spec/rails_app/public/dispatch.rb +0 -10
  55. data/spec/rails_app/public/favicon.ico +0 -0
  56. data/spec/rails_app/public/images/rails.png +0 -0
  57. data/spec/rails_app/public/index.html +0 -277
  58. data/spec/rails_app/public/javascripts/application.js +0 -2
  59. data/spec/rails_app/public/javascripts/controls.js +0 -963
  60. data/spec/rails_app/public/javascripts/dragdrop.js +0 -972
  61. data/spec/rails_app/public/javascripts/effects.js +0 -1120
  62. data/spec/rails_app/public/javascripts/prototype.js +0 -4225
  63. data/spec/rails_app/public/robots.txt +0 -5
  64. data/spec/rails_app/script/about +0 -3
  65. data/spec/rails_app/script/console +0 -3
  66. data/spec/rails_app/script/destroy +0 -3
  67. data/spec/rails_app/script/generate +0 -3
  68. data/spec/rails_app/script/performance/benchmarker +0 -3
  69. data/spec/rails_app/script/performance/profiler +0 -3
  70. data/spec/rails_app/script/performance/request +0 -3
  71. data/spec/rails_app/script/plugin +0 -3
  72. data/spec/rails_app/script/process/inspector +0 -3
  73. data/spec/rails_app/script/process/reaper +0 -3
  74. data/spec/rails_app/script/process/spawner +0 -3
  75. data/spec/rails_app/script/runner +0 -3
  76. data/spec/rails_app/script/server +0 -3
  77. data/spec/request/mongrel_spec.rb +0 -39
  78. data/spec/request/parser_spec.rb +0 -254
  79. data/spec/request/persistent_spec.rb +0 -35
  80. data/spec/request/processing_spec.rb +0 -50
  81. data/spec/response_spec.rb +0 -102
  82. data/spec/runner_spec.rb +0 -168
  83. data/spec/server/builder_spec.rb +0 -44
  84. data/spec/server/pipelining_spec.rb +0 -110
  85. data/spec/server/robustness_spec.rb +0 -34
  86. data/spec/server/stopping_spec.rb +0 -55
  87. data/spec/server/swiftiply.yml +0 -6
  88. data/spec/server/swiftiply_spec.rb +0 -32
  89. data/spec/server/tcp_spec.rb +0 -47
  90. data/spec/server/threaded_spec.rb +0 -27
  91. data/spec/server/unix_socket_spec.rb +0 -26
  92. data/spec/server_spec.rb +0 -100
  93. data/spec/spec_helper.rb +0 -234
  94. data/tasks/announce.rake +0 -22
  95. data/tasks/deploy.rake +0 -13
  96. data/tasks/email.erb +0 -27
  97. data/tasks/gem.rake +0 -65
  98. data/tasks/rdoc.rake +0 -25
  99. data/tasks/site.rake +0 -15
  100. data/tasks/spec.rake +0 -43
  101. data/tasks/stats.rake +0 -28
@@ -187,6 +187,12 @@ module Thin
187
187
  @backend.stop!
188
188
  end
189
189
 
190
+ def reopen_log
191
+ file = File.expand_path(log_file)
192
+ log ">> Reopening log file: #{file}"
193
+ Daemonize.redirect_io(file)
194
+ end
195
+
190
196
  # == Configure the server
191
197
  # The process might need to have superuser privilege to configure
192
198
  # server with optimal options.
@@ -208,17 +214,24 @@ module Thin
208
214
  @backend.running?
209
215
  end
210
216
 
217
+ # deamonizing kills our HUP signal, so we set them again
218
+ def after_daemonize
219
+ setup_signals
220
+ end
221
+
211
222
  protected
212
223
  # Register signals:
213
224
  # * TERM & QUIT calls +stop+ to shutdown gracefully.
214
225
  # * INT calls <tt>stop!</tt> to force shutdown.
215
226
  # * HUP calls <tt>restart</tt> to ... surprise, restart!
227
+ # * USR1 reopen log files.
216
228
  def setup_signals
217
229
  trap('INT') { stop! }
218
230
  trap('TERM') { stop }
219
231
  unless Thin.win?
220
232
  trap('QUIT') { stop }
221
233
  trap('HUP') { restart }
234
+ trap('USR1') { reopen_log }
222
235
  end
223
236
  end
224
237
 
@@ -5,12 +5,12 @@ module Thin
5
5
 
6
6
  module VERSION #:nodoc:
7
7
  MAJOR = 1
8
- MINOR = 3
9
- TINY = 1
8
+ MINOR = 4
9
+ TINY = 0
10
10
 
11
11
  STRING = [MAJOR, MINOR, TINY].join('.')
12
12
 
13
- CODENAME = "Triple Espresso".freeze
13
+ CODENAME = "Chromeo".freeze
14
14
 
15
15
  RACK = [1, 0].freeze # Rack protocol version
16
16
  end
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: thin
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 1.3.1
5
+ version: 1.4.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - Marc-Andre Cournoyer
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2011-11-14 00:00:00 -05:00
13
+ date: 2012-07-03 00:00:00 -04:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -56,11 +56,8 @@ extra_rdoc_files: []
56
56
 
57
57
  files:
58
58
  - CHANGELOG
59
- - README
59
+ - README.md
60
60
  - Rakefile
61
- - benchmark/abc
62
- - benchmark/benchmarker.rb
63
- - benchmark/runner
64
61
  - bin/thin
65
62
  - example/adapter.rb
66
63
  - example/async_app.ru
@@ -99,89 +96,6 @@ files:
99
96
  - lib/thin/statuses.rb
100
97
  - lib/thin/version.rb
101
98
  - lib/thin.rb
102
- - spec/backends/swiftiply_client_spec.rb
103
- - spec/backends/tcp_server_spec.rb
104
- - spec/backends/unix_server_spec.rb
105
- - spec/command_spec.rb
106
- - spec/configs/cluster.yml
107
- - spec/configs/single.yml
108
- - spec/connection_spec.rb
109
- - spec/controllers/cluster_spec.rb
110
- - spec/controllers/controller_spec.rb
111
- - spec/controllers/service_spec.rb
112
- - spec/daemonizing_spec.rb
113
- - spec/headers_spec.rb
114
- - spec/logging_spec.rb
115
- - spec/perf/request_perf_spec.rb
116
- - spec/perf/response_perf_spec.rb
117
- - spec/perf/server_perf_spec.rb
118
- - spec/rack/loader_spec.rb
119
- - spec/rack/rails_adapter_spec.rb
120
- - spec/rails_app/app/controllers/application.rb
121
- - spec/rails_app/app/controllers/simple_controller.rb
122
- - spec/rails_app/app/helpers/application_helper.rb
123
- - spec/rails_app/app/views/simple/index.html.erb
124
- - spec/rails_app/config/boot.rb
125
- - spec/rails_app/config/environment.rb
126
- - spec/rails_app/config/environments/development.rb
127
- - spec/rails_app/config/environments/production.rb
128
- - spec/rails_app/config/environments/test.rb
129
- - spec/rails_app/config/initializers/inflections.rb
130
- - spec/rails_app/config/initializers/mime_types.rb
131
- - spec/rails_app/config/routes.rb
132
- - spec/rails_app/public/404.html
133
- - spec/rails_app/public/422.html
134
- - spec/rails_app/public/500.html
135
- - spec/rails_app/public/dispatch.cgi
136
- - spec/rails_app/public/dispatch.fcgi
137
- - spec/rails_app/public/dispatch.rb
138
- - spec/rails_app/public/favicon.ico
139
- - spec/rails_app/public/images/rails.png
140
- - spec/rails_app/public/index.html
141
- - spec/rails_app/public/javascripts/application.js
142
- - spec/rails_app/public/javascripts/controls.js
143
- - spec/rails_app/public/javascripts/dragdrop.js
144
- - spec/rails_app/public/javascripts/effects.js
145
- - spec/rails_app/public/javascripts/prototype.js
146
- - spec/rails_app/public/robots.txt
147
- - spec/rails_app/script/about
148
- - spec/rails_app/script/console
149
- - spec/rails_app/script/destroy
150
- - spec/rails_app/script/generate
151
- - spec/rails_app/script/performance/benchmarker
152
- - spec/rails_app/script/performance/profiler
153
- - spec/rails_app/script/performance/request
154
- - spec/rails_app/script/plugin
155
- - spec/rails_app/script/process/inspector
156
- - spec/rails_app/script/process/reaper
157
- - spec/rails_app/script/process/spawner
158
- - spec/rails_app/script/runner
159
- - spec/rails_app/script/server
160
- - spec/request/mongrel_spec.rb
161
- - spec/request/parser_spec.rb
162
- - spec/request/persistent_spec.rb
163
- - spec/request/processing_spec.rb
164
- - spec/response_spec.rb
165
- - spec/runner_spec.rb
166
- - spec/server/builder_spec.rb
167
- - spec/server/pipelining_spec.rb
168
- - spec/server/robustness_spec.rb
169
- - spec/server/stopping_spec.rb
170
- - spec/server/swiftiply.yml
171
- - spec/server/swiftiply_spec.rb
172
- - spec/server/tcp_spec.rb
173
- - spec/server/threaded_spec.rb
174
- - spec/server/unix_socket_spec.rb
175
- - spec/server_spec.rb
176
- - spec/spec_helper.rb
177
- - tasks/announce.rake
178
- - tasks/deploy.rake
179
- - tasks/email.erb
180
- - tasks/gem.rake
181
- - tasks/rdoc.rake
182
- - tasks/site.rake
183
- - tasks/spec.rake
184
- - tasks/stats.rake
185
99
  - ext/thin_parser/ext_help.h
186
100
  - ext/thin_parser/parser.h
187
101
  - ext/thin_parser/parser.c
@@ -191,8 +105,8 @@ files:
191
105
  - ext/thin_parser/parser.rl
192
106
  has_rdoc: true
193
107
  homepage: http://code.macournoyer.com/thin/
194
- licenses: []
195
-
108
+ licenses:
109
+ - Ruby
196
110
  post_install_message:
197
111
  rdoc_options: []
198
112
 
data/README DELETED
@@ -1,69 +0,0 @@
1
- == Thin
2
- Tiny, fast & funny HTTP server
3
-
4
- Thin is a Ruby web server that glues together 3 of the best Ruby libraries in web history:
5
- * the Mongrel parser: the root of Mongrel speed and security
6
- * Event Machine: a network I/O library with extremely high scalability, performance and stability
7
- * Rack: a minimal interface between webservers and Ruby frameworks
8
-
9
- Which makes it, with all humility, the most secure, stable, fast and extensible Ruby web server
10
- bundled in an easy to use gem for your own pleasure.
11
-
12
- Site: http://code.macournoyer.com/thin/
13
- Group: http://groups.google.com/group/thin-ruby/topics
14
- Bugs: http://thin.lighthouseapp.com/projects/7212-thin
15
- Code: http://github.com/macournoyer/thin
16
- IRC: #thin on freenode
17
-
18
- === Installation
19
- For the latest stable version:
20
-
21
- sudo gem install thin
22
-
23
- Or from source:
24
-
25
- git clone git://github.com/macournoyer/thin.git
26
- cd thin
27
- rake install
28
-
29
- === Usage
30
- A +thin+ script offers an easy way to start your Rails application:
31
-
32
- cd to/your/rails/app
33
- thin start
34
-
35
- But Thin is also usable with a Rack config file.
36
- You need to setup a config.ru file and pass it to the thin script:
37
-
38
- cat config.ru
39
- app = proc do |env|
40
- [
41
- 200,
42
- {
43
- 'Content-Type' => 'text/html',
44
- 'Content-Length' => '2'
45
- },
46
- ['hi']
47
- ]
48
- end
49
-
50
- run app
51
-
52
- thin start -R config.ru
53
-
54
- See example directory for more samples and run 'thin -h' for usage.
55
-
56
- === License
57
- Ruby License, http://www.ruby-lang.org/en/LICENSE.txt.
58
-
59
- === Credits
60
- The parser was stolen from Mongrel http://mongrel.rubyforge.org by Zed Shaw.
61
- Mongrel Web Server (Mongrel) is copyrighted free software by Zed A. Shaw
62
- <zedshaw at zedshaw dot com> You can redistribute it and/or modify it under
63
- either the terms of the GPL.
64
-
65
- Thin is copyright Marc-Andre Cournoyer <macournoyer@gmail.com>
66
-
67
- Get help at http://groups.google.com/group/thin-ruby/
68
- Report bugs at http://thin.lighthouseapp.com/projects/7212-thin
69
- and major security issues directly to a team member (see COMMITTERS)
@@ -1,51 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # Automate benchmarking with ab with various concurrency levels.
3
- require 'optparse'
4
-
5
- options = {
6
- :address => '0.0.0.0',
7
- :port => 3000,
8
- :requests => 1000,
9
- :start => 1,
10
- :end => 100,
11
- :step => 10
12
- }
13
-
14
- OptionParser.new do |opts|
15
- opts.banner = "Usage: #{$PROGRAM_NAME} [options]"
16
-
17
- opts.on("-n", "--requests NUM", "Number of requests") { |num| options[:requests] = num }
18
- opts.on("-a", "--address HOST", "Address (default: 0.0.0.0)") { |host| options[:address] = host }
19
- opts.on("-p", "--port PORT", "use PORT (default: 3000)") { |port| options[:port] = port.to_i }
20
- opts.on("-s", "--start N", "First concurrency level") { |n| options[:start] = n.to_i }
21
- opts.on("-e", "--end N", "Last concurrency level") { |n| options[:end] = n.to_i }
22
- opts.on("-S", "--step N", "Concurrency level step") { |n| options[:step] = n.to_i }
23
- opts.on("-u", "--uri PATH", "Path to send to") { |u| options[:uri] = u }
24
- opts.on("-k", "--keep-alive", "Use Keep-Alive") { options[:keep_alive] = true }
25
-
26
- opts.on_tail("-h", "--help", "Show this message") { puts opts; exit }
27
- end.parse!(ARGV)
28
-
29
- puts 'request concurrency req/s failures'
30
- puts '=' * 42
31
-
32
- c = options[:start]
33
- until c >= options[:end]
34
- sleep 0.5
35
- out = `nice -n20 ab #{'-k' if options[:keep_alive]} -c #{c} -n #{options[:requests]} #{options[:address]}:#{options[:port]}/#{options[:uri]} 2> /dev/null`
36
-
37
- r = if requests = out.match(/^Requests.+?(\d+\.\d+)/)
38
- requests[1].to_i
39
- else
40
- 0
41
- end
42
- f = if requests = out.match(/^Failed requests.+?(\d+)/)
43
- requests[1].to_i
44
- else
45
- 0
46
- end
47
-
48
- puts "#{options[:requests].to_s.ljust(9)} #{c.to_s.ljust(13)} #{r.to_s.ljust(8)} #{f}"
49
-
50
- c += options[:step]
51
- end
@@ -1,80 +0,0 @@
1
- require 'rack/lobster'
2
-
3
- class Benchmarker
4
- PORT = 7000
5
- ADDRESS = '0.0.0.0'
6
-
7
- attr_accessor :requests, :concurrencies, :servers, :keep_alive
8
-
9
- def initialize
10
- @servers = %w(Mongrel EMongrel Thin)
11
- @requests = 1000
12
- @concurrencies = [1, 10, 100]
13
- end
14
-
15
- def writer(&block)
16
- @writer = block
17
- end
18
-
19
- def run!
20
- @concurrencies.each do |concurrency|
21
- @servers.each do |server|
22
- req_sec, failed = run_one(server, concurrency)
23
- @writer.call(server, @requests, concurrency, req_sec, failed)
24
- end
25
- end
26
- end
27
-
28
- private
29
- def start_server(handler_name)
30
- @server = fork do
31
- [STDOUT, STDERR].each { |o| o.reopen "/dev/null" }
32
-
33
- case handler_name
34
- when 'EMongrel'
35
- require 'swiftcore/evented_mongrel'
36
- handler_name = 'Mongrel'
37
- end
38
-
39
- app = proc do |env|
40
- [200, {'Content-Type' => 'text/html', 'Content-Length' => '11'}, ['hello world']]
41
- end
42
-
43
- handler = Rack::Handler.const_get(handler_name)
44
- handler.run app, :Host => ADDRESS, :Port => PORT
45
- end
46
-
47
- sleep 2
48
- end
49
-
50
- def stop_server
51
- Process.kill('SIGKILL', @server)
52
- Process.wait
53
- end
54
-
55
- def run_ab(concurrency)
56
- `nice -n20 ab -c #{concurrency} -n #{@requests} #{@keep_alive ? '-k' : ''} #{ADDRESS}:#{PORT}/ 2> /dev/null`
57
- end
58
-
59
- def run_one(handler_name, concurrency)
60
- start_server(handler_name)
61
-
62
- out = run_ab(concurrency)
63
-
64
- stop_server
65
-
66
- req_sec = if matches = out.match(/^Requests.+?(\d+\.\d+)/)
67
- matches[1].to_i
68
- else
69
- 0
70
- end
71
-
72
- failed = if matches = out.match(/^Failed requests.+?(\d+)/)
73
- matches[1].to_i
74
- else
75
- 0
76
- end
77
-
78
- [req_sec, failed]
79
- end
80
- end
@@ -1,82 +0,0 @@
1
- #!/usr/bin/env ruby
2
- # Simple benchmark to compare Thin performance against
3
- # other webservers supported by Rack.
4
- #
5
- # Run with:
6
- #
7
- # ruby simple.rb [num of request] [print|graph] [concurrency levels]
8
- #
9
-
10
- $: << File.join(File.dirname(__FILE__), '..', 'lib')
11
- require 'thin'
12
-
13
- require File.dirname(__FILE__) + '/benchmarker'
14
- require 'optparse'
15
-
16
- options = {
17
- :requests => 1000,
18
- :concurrencies => [1, 10, 100],
19
- :keep_alive => false,
20
- :output => :table
21
- }
22
-
23
- OptionParser.new do |opts|
24
- opts.banner = "Usage: #{$PROGRAM_NAME} [options]"
25
-
26
- opts.on("-n", "--requests NUM", "Number of requests") { |num| options[:requests] = num.to_i }
27
- opts.on("-c", "--concurrencies EXP", "Concurrency levels") { |exp| options[:concurrencies] = eval(exp).to_a }
28
- opts.on("-k", "--keep-alive", "Use persistent connections") { options[:keep_alive] = true }
29
- opts.on("-t", "--table", "Output as text table") { options[:output] = :table }
30
- opts.on("-g", "--graph", "Output as graph") { options[:output] = :graph }
31
-
32
- opts.on_tail("-h", "--help", "Show this message") { puts opts; exit }
33
- end.parse!(ARGV)
34
-
35
- # benchmark output_type, %w(WEBrick Mongrel EMongrel Thin), request, levels
36
- b = Benchmarker.new
37
- b.requests = options[:requests]
38
- b.concurrencies = options[:concurrencies]
39
- b.keep_alive = options[:keep_alive]
40
-
41
- case options[:output]
42
- when :table
43
- puts 'server request concurrency req/s failures'
44
- puts '=' * 52
45
-
46
- b.writer do |server, requests, concurrency, req_sec, failed|
47
- puts "#{server.ljust(8)} #{requests} #{concurrency.to_s.ljust(4)} #{req_sec.to_s.ljust(8)} #{failed}"
48
- end
49
-
50
- b.run!
51
-
52
- when :graph
53
- require '/usr/local/lib/ruby/gems/1.8/gems/gruff-0.2.9/lib/gruff'
54
- g = Gruff::Area.new
55
- g.title = "#{options[:requests]} requests"
56
- g.title << ' w/ Keep-Alive' if options[:keep_alive]
57
-
58
- g.x_axis_label = 'Concurrency'
59
- g.y_axis_label = 'Requests / sec'
60
- g.maximum_value = 0
61
- g.minimum_value = 0
62
- g.labels = {}
63
- b.concurrencies.each_with_index { |c, i| g.labels[i] = c.to_s }
64
-
65
- results = {}
66
-
67
- b.writer do |server, requests, concurrency, req_sec, failed|
68
- print '.'
69
- results[server] ||= []
70
- results[server] << req_sec
71
- end
72
-
73
- b.run!
74
- puts
75
-
76
- results.each do |server, concurrencies|
77
- g.data(server, concurrencies)
78
- end
79
-
80
- g.write('bench.png')
81
- `open bench.png`
82
- end