puma 4.1.0 → 4.2.1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puma might be problematic. Click here for more details.

@@ -62,8 +62,11 @@ module Puma
62
62
  end
63
63
 
64
64
  def fire_background
65
- @background.each do |b|
66
- Thread.new(&b)
65
+ @background.each_with_index do |b, i|
66
+ Thread.new do
67
+ Puma.set_thread_name "plugin background #{i}"
68
+ b.call
69
+ end
67
70
  end
68
71
  end
69
72
  end
@@ -225,7 +225,7 @@ module Puma
225
225
  # will be flooding them with errors when persistent connections
226
226
  # are closed.
227
227
  rescue ConnectionError
228
- c.write_500
228
+ c.write_error(500)
229
229
  c.close
230
230
 
231
231
  clear_monitor mon
@@ -252,7 +252,7 @@ module Puma
252
252
  rescue HttpParserError => e
253
253
  @server.lowlevel_error(e, c.env)
254
254
 
255
- c.write_400
255
+ c.write_error(400)
256
256
  c.close
257
257
 
258
258
  clear_monitor mon
@@ -261,7 +261,7 @@ module Puma
261
261
  rescue StandardError => e
262
262
  @server.lowlevel_error(e, c.env)
263
263
 
264
- c.write_500
264
+ c.write_error(500)
265
265
  c.close
266
266
 
267
267
  clear_monitor mon
@@ -277,7 +277,7 @@ module Puma
277
277
  while @timeouts.first.value.timeout_at < now
278
278
  mon = @timeouts.shift
279
279
  c = mon.value
280
- c.write_408 if c.in_data_phase
280
+ c.write_error(408) if c.in_data_phase
281
281
  c.close
282
282
 
283
283
  clear_monitor mon
@@ -307,6 +307,7 @@ module Puma
307
307
 
308
308
  def run_in_thread
309
309
  @thread = Thread.new do
310
+ Puma.set_thread_name "reactor"
310
311
  begin
311
312
  run_internal
312
313
  rescue StandardError => e
@@ -53,12 +53,12 @@ module Puma
53
53
 
54
54
  uri = URI.parse str
55
55
 
56
- app = Puma::App::Status.new @launcher
57
-
58
56
  if token = @options[:control_auth_token]
59
- app.auth_token = token unless token.empty? || token == 'none'
57
+ token = nil if token.empty? || token == 'none'
60
58
  end
61
59
 
60
+ app = Puma::App::Status.new @launcher, token
61
+
62
62
  control = Puma::Server.new app, @launcher.events
63
63
  control.min_threads = 0
64
64
  control.max_threads = 1
@@ -9,13 +9,13 @@ require 'puma/null_io'
9
9
  require 'puma/reactor'
10
10
  require 'puma/client'
11
11
  require 'puma/binder'
12
- require 'puma/delegation'
13
12
  require 'puma/accept_nonblock'
14
13
  require 'puma/util'
15
14
 
16
15
  require 'puma/puma_http11'
17
16
 
18
17
  require 'socket'
18
+ require 'forwardable'
19
19
 
20
20
  module Puma
21
21
 
@@ -32,7 +32,7 @@ module Puma
32
32
  class Server
33
33
 
34
34
  include Puma::Const
35
- extend Puma::Delegation
35
+ extend Forwardable
36
36
 
37
37
  attr_reader :thread
38
38
  attr_reader :events
@@ -89,10 +89,7 @@ module Puma
89
89
 
90
90
  attr_accessor :binder, :leak_stack_on_error, :early_hints
91
91
 
92
- forward :add_tcp_listener, :@binder
93
- forward :add_ssl_listener, :@binder
94
- forward :add_unix_listener, :@binder
95
- forward :connected_port, :@binder
92
+ def_delegators :@binder, :add_tcp_listener, :add_ssl_listener, :add_unix_listener, :connected_port
96
93
 
97
94
  def inherit_binder(bind)
98
95
  @binder = bind
@@ -207,7 +204,10 @@ module Puma
207
204
  @events.fire :state, :running
208
205
 
209
206
  if background
210
- @thread = Thread.new { handle_servers_lopez_mode }
207
+ @thread = Thread.new do
208
+ Puma.set_thread_name "server"
209
+ handle_servers_lopez_mode
210
+ end
211
211
  return @thread
212
212
  else
213
213
  handle_servers_lopez_mode
@@ -317,7 +317,7 @@ module Puma
317
317
 
318
318
  @events.ssl_error self, addr, cert, e
319
319
  rescue HttpParserError => e
320
- client.write_400
320
+ client.write_error(400)
321
321
  client.close
322
322
 
323
323
  @events.parse_error self, client.env, e
@@ -351,7 +351,10 @@ module Puma
351
351
  @events.fire :state, :running
352
352
 
353
353
  if background
354
- @thread = Thread.new { handle_servers }
354
+ @thread = Thread.new do
355
+ Puma.set_thread_name "server"
356
+ handle_servers
357
+ end
355
358
  return @thread
356
359
  else
357
360
  handle_servers
@@ -505,7 +508,7 @@ module Puma
505
508
  rescue HttpParserError => e
506
509
  lowlevel_error(e, client.env)
507
510
 
508
- client.write_400
511
+ client.write_error(400)
509
512
 
510
513
  @events.parse_error self, client.env, e
511
514
 
@@ -513,7 +516,7 @@ module Puma
513
516
  rescue StandardError => e
514
517
  lowlevel_error(e, client.env)
515
518
 
516
- client.write_500
519
+ client.write_error(500)
517
520
 
518
521
  @events.unknown_error self, e, "Read"
519
522
 
@@ -87,8 +87,7 @@ module Puma
87
87
  @spawned += 1
88
88
 
89
89
  th = Thread.new(@spawned) do |spawned|
90
- # Thread name is new in Ruby 2.3
91
- Thread.current.name = 'puma %03i' % spawned if Thread.current.respond_to?(:name=)
90
+ Puma.set_thread_name 'threadpool %03i' % spawned
92
91
  todo = @todo
93
92
  block = @block
94
93
  mutex = @mutex
@@ -244,10 +243,12 @@ module Puma
244
243
  end
245
244
  end
246
245
 
247
- class AutoTrim
248
- def initialize(pool, timeout)
246
+ class Automaton
247
+ def initialize(pool, timeout, thread_name, message)
249
248
  @pool = pool
250
249
  @timeout = timeout
250
+ @thread_name = thread_name
251
+ @message = message
251
252
  @running = false
252
253
  end
253
254
 
@@ -255,8 +256,9 @@ module Puma
255
256
  @running = true
256
257
 
257
258
  @thread = Thread.new do
259
+ Puma.set_thread_name @thread_name
258
260
  while @running
259
- @pool.trim
261
+ @pool.public_send(@message)
260
262
  sleep @timeout
261
263
  end
262
264
  end
@@ -269,36 +271,12 @@ module Puma
269
271
  end
270
272
 
271
273
  def auto_trim!(timeout=30)
272
- @auto_trim = AutoTrim.new(self, timeout)
274
+ @auto_trim = Automaton.new(self, timeout, "threadpool trimmer", :trim)
273
275
  @auto_trim.start!
274
276
  end
275
277
 
276
- class Reaper
277
- def initialize(pool, timeout)
278
- @pool = pool
279
- @timeout = timeout
280
- @running = false
281
- end
282
-
283
- def start!
284
- @running = true
285
-
286
- @thread = Thread.new do
287
- while @running
288
- @pool.reap
289
- sleep @timeout
290
- end
291
- end
292
- end
293
-
294
- def stop
295
- @running = false
296
- @thread.wakeup
297
- end
298
- end
299
-
300
278
  def auto_reap!(timeout=5)
301
- @reaper = Reaper.new(self, timeout)
279
+ @reaper = Automaton.new(self, timeout, "threadpool reaper", :reap)
302
280
  @reaper.start!
303
281
  end
304
282
 
@@ -61,8 +61,6 @@ module Rack
61
61
  conf
62
62
  end
63
63
 
64
-
65
-
66
64
  def self.run(app, options = {})
67
65
  conf = self.config(app, options)
68
66
 
@@ -0,0 +1,16 @@
1
+ # Use this Dockerfile to create minimal reproductions of issues
2
+
3
+ FROM ruby:2.6
4
+
5
+ # throw errors if Gemfile has been modified since Gemfile.lock
6
+ RUN bundle config --global frozen 1
7
+
8
+ WORKDIR /usr/src/app
9
+
10
+ COPY . .
11
+ RUN gem install bundler
12
+ RUN bundle install
13
+ RUN bundle exec rake compile
14
+
15
+ EXPOSE 9292
16
+ CMD bundle exec bin/puma test/rackup/hello.ru
@@ -38,7 +38,6 @@ ARGV[1].to_i.times do
38
38
  do_test(st, size)
39
39
  end
40
40
 
41
- t.abort_on_exception = true
42
41
  threads << t
43
42
  end
44
43
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: puma
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.1.0
4
+ version: 4.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Evan Phoenix
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-08 00:00:00.000000000 Z
11
+ date: 2019-10-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nio4r
@@ -80,8 +80,6 @@ files:
80
80
  - lib/puma/const.rb
81
81
  - lib/puma/control_cli.rb
82
82
  - lib/puma/convenient.rb
83
- - lib/puma/daemon_ext.rb
84
- - lib/puma/delegation.rb
85
83
  - lib/puma/detect.rb
86
84
  - lib/puma/dsl.rb
87
85
  - lib/puma/events.rb
@@ -104,6 +102,7 @@ files:
104
102
  - lib/puma/thread_pool.rb
105
103
  - lib/puma/util.rb
106
104
  - lib/rack/handler/puma.rb
105
+ - tools/docker/Dockerfile
107
106
  - tools/jungle/README.md
108
107
  - tools/jungle/init.d/README.md
109
108
  - tools/jungle/init.d/puma
@@ -120,6 +119,7 @@ licenses:
120
119
  - BSD-3-Clause
121
120
  metadata:
122
121
  msys2_mingw_dependencies: openssl
122
+ changelog_uri: https://github.com/puma/puma/blob/master/History.md
123
123
  post_install_message:
124
124
  rdoc_options: []
125
125
  require_paths:
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Process
4
-
5
- # This overrides the default version because it is broken if it
6
- # exists.
7
-
8
- if respond_to? :daemon
9
- class << self
10
- remove_method :daemon
11
- end
12
- end
13
-
14
- def self.daemon(nochdir=false, noclose=false)
15
- exit if fork # Parent exits, child continues.
16
-
17
- Process.setsid # Become session leader.
18
-
19
- exit if fork # Zap session leader. See [1].
20
-
21
- Dir.chdir "/" unless nochdir # Release old working directory.
22
-
23
- if !noclose
24
- STDIN.reopen File.open("/dev/null", "r")
25
-
26
- null_out = File.open "/dev/null", "w"
27
- STDOUT.reopen null_out
28
- STDERR.reopen null_out
29
- end
30
-
31
- 0
32
- end
33
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Puma
4
- module Delegation
5
- def forward(what, who)
6
- module_eval <<-CODE
7
- def #{what}(*args, &block)
8
- #{who}.#{what}(*args, &block)
9
- end
10
- CODE
11
- end
12
- end
13
- end