puma 6.6.0-java → 7.1.0-java

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 (47) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +170 -5
  3. data/README.md +24 -32
  4. data/docs/fork_worker.md +5 -5
  5. data/docs/kubernetes.md +8 -6
  6. data/docs/restart.md +2 -2
  7. data/docs/signals.md +11 -11
  8. data/docs/stats.md +3 -2
  9. data/docs/systemd.md +1 -1
  10. data/ext/puma_http11/extconf.rb +2 -17
  11. data/ext/puma_http11/mini_ssl.c +18 -8
  12. data/ext/puma_http11/org/jruby/puma/Http11.java +10 -2
  13. data/ext/puma_http11/puma_http11.c +23 -11
  14. data/lib/puma/binder.rb +10 -8
  15. data/lib/puma/cli.rb +3 -5
  16. data/lib/puma/client.rb +95 -61
  17. data/lib/puma/cluster/worker.rb +9 -10
  18. data/lib/puma/cluster/worker_handle.rb +38 -7
  19. data/lib/puma/cluster.rb +41 -26
  20. data/lib/puma/cluster_accept_loop_delay.rb +91 -0
  21. data/lib/puma/commonlogger.rb +3 -3
  22. data/lib/puma/configuration.rb +89 -43
  23. data/lib/puma/const.rb +9 -10
  24. data/lib/puma/control_cli.rb +6 -2
  25. data/lib/puma/detect.rb +2 -0
  26. data/lib/puma/dsl.rb +135 -94
  27. data/lib/puma/error_logger.rb +3 -1
  28. data/lib/puma/events.rb +25 -10
  29. data/lib/puma/io_buffer.rb +8 -4
  30. data/lib/puma/launcher/bundle_pruner.rb +1 -1
  31. data/lib/puma/launcher.rb +52 -48
  32. data/lib/puma/minissl.rb +0 -1
  33. data/lib/puma/plugin/systemd.rb +3 -3
  34. data/lib/puma/puma_http11.jar +0 -0
  35. data/lib/puma/rack/urlmap.rb +1 -1
  36. data/lib/puma/reactor.rb +19 -4
  37. data/lib/puma/request.rb +45 -32
  38. data/lib/puma/runner.rb +8 -17
  39. data/lib/puma/server.rb +111 -61
  40. data/lib/puma/single.rb +5 -2
  41. data/lib/puma/state_file.rb +3 -2
  42. data/lib/puma/thread_pool.rb +47 -82
  43. data/lib/puma/util.rb +0 -7
  44. data/lib/puma.rb +10 -0
  45. data/lib/rack/handler/puma.rb +2 -2
  46. data/tools/Dockerfile +3 -1
  47. metadata +6 -7
data/lib/puma/detect.rb CHANGED
@@ -18,6 +18,8 @@ module Puma
18
18
 
19
19
  IS_LINUX = !(IS_OSX || IS_WINDOWS)
20
20
 
21
+ IS_ARM = RUBY_PLATFORM.include? 'aarch64'
22
+
21
23
  # @version 5.2.0
22
24
  IS_MRI = RUBY_ENGINE == 'ruby'
23
25
 
data/lib/puma/dsl.rb CHANGED
@@ -13,7 +13,7 @@ module Puma
13
13
  # config = Configuration.new({}) do |user_config|
14
14
  # user_config.port 3001
15
15
  # end
16
- # config.load
16
+ # config.clamp
17
17
  #
18
18
  # puts config.options[:binds] # => "tcp://127.0.0.1:3001"
19
19
  #
@@ -25,7 +25,7 @@ module Puma
25
25
  # Resulting configuration:
26
26
  #
27
27
  # config = Configuration.new(config_file: "puma_config.rb")
28
- # config.load
28
+ # config.clamp
29
29
  #
30
30
  # puts config.options[:binds] # => "tcp://127.0.0.1:3002"
31
31
  #
@@ -43,11 +43,11 @@ module Puma
43
43
  #
44
44
  # The following hooks have been updated:
45
45
  #
46
- # | DSL Method | Options Key | Fork Block Location |
47
- # | on_worker_boot | :before_worker_boot | inside, before |
48
- # | on_worker_shutdown | :before_worker_shutdown | inside, after |
49
- # | on_refork | :before_refork | inside |
50
- # | after_refork | :after_refork | inside |
46
+ # | DSL Method | Options Key | Fork Block Location |
47
+ # | before_worker_boot | :before_worker_boot | inside, before |
48
+ # | before_worker_shutdown | :before_worker_shutdown | inside, after |
49
+ # | before_refork | :before_refork | inside |
50
+ # | after_refork | :after_refork | inside |
51
51
  #
52
52
  class DSL
53
53
  ON_WORKER_KEY = [String, Symbol].freeze
@@ -370,18 +370,21 @@ module Puma
370
370
  @options[:idle_timeout] = Integer(seconds)
371
371
  end
372
372
 
373
- # Work around leaky apps that leave garbage in Thread locals
374
- # across requests.
373
+ # Use a clean fiber per request which ensures a clean slate for fiber
374
+ # locals and fiber storage. Also provides a cleaner backtrace with less
375
+ # Puma internal stack frames.
375
376
  #
376
377
  # The default is +false+.
377
378
  #
378
379
  # @example
379
- # clean_thread_locals
380
+ # fiber_per_request
380
381
  #
381
- def clean_thread_locals(which=true)
382
- @options[:clean_thread_locals] = which
382
+ def fiber_per_request(which=true)
383
+ @options[:fiber_per_request] = which
383
384
  end
384
385
 
386
+ alias clean_thread_locals fiber_per_request
387
+
385
388
  # When shutting down, drain the accept socket of pending connections and
386
389
  # process them. This loops over the accept socket until there are no more
387
390
  # read events and then stops looking and waits for the requests to finish.
@@ -434,14 +437,18 @@ module Puma
434
437
  # This can be called multiple times to add code each time.
435
438
  #
436
439
  # @example
437
- # on_restart do
440
+ # before_restart do
438
441
  # puts 'On restart...'
439
442
  # end
440
443
  #
441
- def on_restart(&block)
442
- process_hook :on_restart, nil, block, 'on_restart'
444
+ def before_restart(&block)
445
+ Puma.deprecate_method_change :on_restart, __callee__, __method__
446
+
447
+ process_hook :before_restart, nil, block
443
448
  end
444
449
 
450
+ alias_method :on_restart, :before_restart
451
+
445
452
  # Command to use to restart Puma. This should be just how to
446
453
  # load Puma itself (ie. 'ruby -Ilib bin/puma'), not the arguments
447
454
  # to Puma, as those are the same as the original process.
@@ -649,13 +656,12 @@ module Puma
649
656
  @options[:state] = path.to_s
650
657
  end
651
658
 
652
- # Use +permission+ to restrict permissions for the state file.
659
+ # Use +permission+ to restrict permissions for the state file. By convention,
660
+ # +permission+ is an octal number (e.g. `0640` or `0o640`).
653
661
  #
654
662
  # @example
655
663
  # state_permission 0600
656
664
  #
657
- # @version 5.0.0
658
- #
659
665
  def state_permission(permission)
660
666
  @options[:state_permission] = permission
661
667
  end
@@ -729,9 +735,7 @@ module Puma
729
735
  # end
730
736
  #
731
737
  def before_fork(&block)
732
- warn_if_in_single_mode('before_fork')
733
-
734
- process_hook :before_fork, nil, block, 'before_fork'
738
+ process_hook :before_fork, nil, block, cluster_only: true
735
739
  end
736
740
 
737
741
  # Code to run in a worker when it boots to setup
@@ -742,16 +746,18 @@ module Puma
742
746
  # @note Cluster mode only.
743
747
  #
744
748
  # @example
745
- # on_worker_boot do
749
+ # before_worker_boot do
746
750
  # puts 'Before worker boot...'
747
751
  # end
748
752
  #
749
- def on_worker_boot(key = nil, &block)
750
- warn_if_in_single_mode('on_worker_boot')
753
+ def before_worker_boot(key = nil, &block)
754
+ Puma.deprecate_method_change :on_worker_boot, __callee__, __method__
751
755
 
752
- process_hook :before_worker_boot, key, block, 'on_worker_boot'
756
+ process_hook :before_worker_boot, key, block, cluster_only: true
753
757
  end
754
758
 
759
+ alias_method :on_worker_boot, :before_worker_boot
760
+
755
761
  # Code to run immediately before a worker shuts
756
762
  # down (after it has finished processing HTTP requests). The worker's
757
763
  # index is passed as an argument. These hooks
@@ -763,16 +769,18 @@ module Puma
763
769
  # @note Cluster mode only.
764
770
  #
765
771
  # @example
766
- # on_worker_shutdown do
772
+ # before_worker_shutdown do
767
773
  # puts 'On worker shutdown...'
768
774
  # end
769
775
  #
770
- def on_worker_shutdown(key = nil, &block)
771
- warn_if_in_single_mode('on_worker_shutdown')
776
+ def before_worker_shutdown(key = nil, &block)
777
+ Puma.deprecate_method_change :on_worker_shutdown, __callee__, __method__
772
778
 
773
- process_hook :before_worker_shutdown, key, block, 'on_worker_shutdown'
779
+ process_hook :before_worker_shutdown, key, block, cluster_only: true
774
780
  end
775
781
 
782
+ alias_method :on_worker_shutdown, :before_worker_shutdown
783
+
776
784
  # Code to run in the master right before a worker is started. The worker's
777
785
  # index is passed as an argument.
778
786
  #
@@ -781,16 +789,18 @@ module Puma
781
789
  # @note Cluster mode only.
782
790
  #
783
791
  # @example
784
- # on_worker_fork do
792
+ # before_worker_fork do
785
793
  # puts 'Before worker fork...'
786
794
  # end
787
795
  #
788
- def on_worker_fork(&block)
789
- warn_if_in_single_mode('on_worker_fork')
796
+ def before_worker_fork(&block)
797
+ Puma.deprecate_method_change :on_worker_fork, __callee__, __method__
790
798
 
791
- process_hook :before_worker_fork, nil, block, 'on_worker_fork'
799
+ process_hook :before_worker_fork, nil, block, cluster_only: true
792
800
  end
793
801
 
802
+ alias_method :on_worker_fork, :before_worker_fork
803
+
794
804
  # Code to run in the master after a worker has been started. The worker's
795
805
  # index is passed as an argument.
796
806
  #
@@ -804,34 +814,53 @@ module Puma
804
814
  # end
805
815
  #
806
816
  def after_worker_fork(&block)
807
- warn_if_in_single_mode('after_worker_fork')
808
-
809
- process_hook :after_worker_fork, nil, block, 'after_worker_fork'
817
+ process_hook :after_worker_fork, nil, block, cluster_only: true
810
818
  end
811
819
 
812
820
  alias_method :after_worker_boot, :after_worker_fork
813
821
 
814
- # Code to run after puma is booted (works for both: single and clustered)
822
+ # Code to run in the master right after a worker has stopped. The worker's
823
+ # index and Process::Status are passed as arguments.
824
+ #
825
+ # @note Cluster mode only.
815
826
  #
816
827
  # @example
817
- # on_booted do
828
+ # after_worker_shutdown do |worker_handle|
829
+ # puts 'Worker crashed' unless worker_handle.process_status.success?
830
+ # end
831
+ #
832
+ def after_worker_shutdown(&block)
833
+ process_hook :after_worker_shutdown, nil, block, cluster_only: true
834
+ end
835
+
836
+ # Code to run after puma is booted (works for both single and cluster modes).
837
+ #
838
+ # @example
839
+ # after_booted do
818
840
  # puts 'After booting...'
819
841
  # end
820
842
  #
821
- def on_booted(&block)
822
- @config.options[:events].on_booted(&block)
843
+ def after_booted(&block)
844
+ Puma.deprecate_method_change :on_booted, __callee__, __method__
845
+
846
+ @config.events.after_booted(&block)
823
847
  end
824
848
 
849
+ alias_method :on_booted, :after_booted
850
+
825
851
  # Code to run after puma is stopped (works for both: single and clustered)
826
852
  #
827
853
  # @example
828
- # on_stopped do
854
+ # after_stopped do
829
855
  # puts 'After stopping...'
830
856
  # end
831
857
  #
832
- def on_stopped(&block)
833
- @config.options[:events].on_stopped(&block)
858
+ def after_stopped(&block)
859
+ Puma.deprecate_method_change :on_stopped, __callee__, __method__
860
+
861
+ @config.events.after_stopped(&block)
834
862
  end
863
+ alias_method :on_stopped, :after_stopped
835
864
 
836
865
  # When `fork_worker` is enabled, code to run in Worker 0
837
866
  # before all other workers are re-forked from this process,
@@ -847,25 +876,27 @@ module Puma
847
876
  # @note Cluster mode with `fork_worker` enabled only.
848
877
  #
849
878
  # @example
850
- # on_refork do
879
+ # before_refork do
851
880
  # 3.times {GC.start}
852
881
  # end
853
882
  #
854
883
  # @version 5.0.0
855
884
  #
856
- def on_refork(key = nil, &block)
857
- warn_if_in_single_mode('on_refork')
885
+ def before_refork(key = nil, &block)
886
+ Puma.deprecate_method_change :on_refork, __callee__, __method__
858
887
 
859
- process_hook :before_refork, key, block, 'on_refork'
888
+ process_hook :before_refork, key, block, cluster_only: true
860
889
  end
861
890
 
891
+ alias_method :on_refork, :before_refork
892
+
862
893
  # When `fork_worker` is enabled, code to run in Worker 0
863
894
  # after all other workers are re-forked from this process,
864
895
  # after the server has temporarily stopped serving requests
865
896
  # (once per complete refork cycle).
866
897
  #
867
898
  # This can be used to re-open any connections to remote servers
868
- # (database, Redis, ...) that were closed via on_refork.
899
+ # (database, Redis, ...) that were closed via before_refork.
869
900
  #
870
901
  # This can be called multiple times to add several hooks.
871
902
  #
@@ -877,7 +908,7 @@ module Puma
877
908
  # end
878
909
  #
879
910
  def after_refork(key = nil, &block)
880
- process_hook :after_refork, key, block, 'after_refork'
911
+ process_hook :after_refork, key, block
881
912
  end
882
913
 
883
914
  # Provide a block to be executed just before a thread is added to the thread
@@ -893,14 +924,18 @@ module Puma
893
924
  # This can be called multiple times to add several hooks.
894
925
  #
895
926
  # @example
896
- # on_thread_start do
927
+ # before_thread_start do
897
928
  # puts 'On thread start...'
898
929
  # end
899
930
  #
900
- def on_thread_start(&block)
901
- process_hook :before_thread_start, nil, block, 'on_thread_start'
931
+ def before_thread_start(&block)
932
+ Puma.deprecate_method_change :on_thread_start, __callee__, __method__
933
+
934
+ process_hook :before_thread_start, nil, block
902
935
  end
903
936
 
937
+ alias_method :on_thread_start, :before_thread_start
938
+
904
939
  # Provide a block to be executed after a thread is trimmed from the thread
905
940
  # pool. Be careful: while this block executes, Puma's main loop is
906
941
  # blocked, so no new requests will be picked up.
@@ -917,14 +952,18 @@ module Puma
917
952
  # This can be called multiple times to add several hooks.
918
953
  #
919
954
  # @example
920
- # on_thread_exit do
955
+ # before_thread_exit do
921
956
  # puts 'On thread exit...'
922
957
  # end
923
958
  #
924
- def on_thread_exit(&block)
925
- process_hook :before_thread_exit, nil, block, 'on_thread_exit'
959
+ def before_thread_exit(&block)
960
+ Puma.deprecate_method_change :on_thread_exit, __callee__, __method__
961
+
962
+ process_hook :before_thread_exit, nil, block
926
963
  end
927
964
 
965
+ alias_method :on_thread_exit, :before_thread_exit
966
+
928
967
  # Code to run out-of-band when the worker is idle.
929
968
  # These hooks run immediately after a request has finished
930
969
  # processing and there are no busy threads on the worker.
@@ -936,7 +975,7 @@ module Puma
936
975
  # This can be called multiple times to add several hooks.
937
976
  #
938
977
  def out_of_band(&block)
939
- process_hook :out_of_band, nil, block, 'out_of_band'
978
+ process_hook :out_of_band, nil, block
940
979
  end
941
980
 
942
981
  # The directory to operate out of.
@@ -950,8 +989,8 @@ module Puma
950
989
  @options[:directory] = dir.to_s
951
990
  end
952
991
 
953
- # Preload the application before starting the workers; this conflicts with
954
- # phased restart feature.
992
+ # Preload the application before forking the workers; this conflicts with
993
+ # the phased restart feature.
955
994
  #
956
995
  # The default is +true+ if your app uses more than 1 worker.
957
996
  #
@@ -1111,7 +1150,7 @@ module Puma
1111
1150
 
1112
1151
  # Set the timeout for worker shutdown.
1113
1152
  #
1114
- # The default is 60 seconds.
1153
+ # The default is 30 seconds.
1115
1154
  #
1116
1155
  # @note Cluster mode only.
1117
1156
  #
@@ -1143,10 +1182,10 @@ module Puma
1143
1182
  # @see Puma::Cluster#cull_workers
1144
1183
  #
1145
1184
  def worker_culling_strategy(strategy)
1146
- stategy = strategy.to_sym
1185
+ strategy = strategy.to_sym
1147
1186
 
1148
1187
  if ![:youngest, :oldest].include?(strategy)
1149
- raise "Invalid value for worker_culling_strategy - #{stategy}"
1188
+ raise "Invalid value for worker_culling_strategy - #{strategy}"
1150
1189
  end
1151
1190
 
1152
1191
  @options[:worker_culling_strategy] = strategy
@@ -1183,19 +1222,23 @@ module Puma
1183
1222
  end
1184
1223
 
1185
1224
 
1186
- # Attempts to route traffic to less-busy workers by causing them to delay
1187
- # listening on the socket, allowing workers which are not processing any
1225
+ # Maximum delay of worker accept loop.
1226
+ #
1227
+ # Attempts to route traffic to less-busy workers by causing a busy worker to delay
1228
+ # listening on the socket, allowing workers which are not processing as many
1188
1229
  # requests to pick up new requests first.
1189
1230
  #
1190
1231
  # The default is 0.005 seconds.
1191
1232
  #
1192
- # Only works on MRI. For all other interpreters, this setting does nothing.
1233
+ # To turn off this feature, set the value to 0.
1234
+ #
1235
+ # @note Cluster mode with >= 2 workers only.
1236
+ #
1237
+ # @note Interpreters with forking support only.
1193
1238
  #
1194
1239
  # @see Puma::Server#handle_servers
1195
1240
  # @see Puma::ThreadPool#wait_for_less_busy_worker
1196
1241
  #
1197
- # @version 5.0.0
1198
- #
1199
1242
  def wait_for_less_busy_worker(val=0.005)
1200
1243
  @options[:wait_for_less_busy_worker] = val.to_f
1201
1244
  end
@@ -1269,24 +1312,31 @@ module Puma
1269
1312
  # A refork will automatically trigger once after the specified number of requests
1270
1313
  # (default 1000), or pass 0 to disable auto refork.
1271
1314
  #
1315
+ # @note This is experimental.
1272
1316
  # @note Cluster mode only.
1273
1317
  #
1274
- # @version 5.0.0
1275
- #
1276
1318
  def fork_worker(after_requests=1000)
1277
1319
  @options[:fork_worker] = Integer(after_requests)
1278
1320
  end
1279
1321
 
1280
- # The number of requests to attempt inline before sending a client back to
1281
- # the reactor to be subject to normal ordering.
1322
+ # @deprecated Use {#max_keep_alive} instead.
1282
1323
  #
1283
- # The default is 10.
1324
+ def max_fast_inline(num_of_requests)
1325
+ Puma.deprecate_method_change :max_fast_inline, __method__, :max_keep_alive
1326
+ @options[:max_keep_alive] ||= Float(num_of_requests) unless num_of_requests.nil?
1327
+ end
1328
+
1329
+ # The number of requests a keep-alive client can submit before being closed.
1330
+ # Note that some applications (server to server) may benefit from a very high
1331
+ # number or Float::INFINITY.
1332
+ #
1333
+ # The default is 999.
1284
1334
  #
1285
1335
  # @example
1286
- # max_fast_inline 20
1336
+ # max_keep_alive 20
1287
1337
  #
1288
- def max_fast_inline(num_of_requests)
1289
- @options[:max_fast_inline] = Float(num_of_requests)
1338
+ def max_keep_alive(num_of_requests)
1339
+ @options[:max_keep_alive] = Float(num_of_requests) unless num_of_requests.nil?
1290
1340
  end
1291
1341
 
1292
1342
  # When `true`, keep-alive connections are maintained on inbound requests.
@@ -1416,30 +1466,21 @@ module Puma
1416
1466
  end
1417
1467
  end
1418
1468
 
1419
- def process_hook(options_key, key, block, meth)
1469
+ def process_hook(options_key, key, block, cluster_only: false)
1470
+ raise ArgumentError, "expected #{options_key} to be given a block" unless block
1471
+
1472
+ @config.hooks[options_key] = true
1473
+
1420
1474
  @options[options_key] ||= []
1421
- if ON_WORKER_KEY.include? key.class
1422
- @options[options_key] << [block, key.to_sym]
1475
+ hook_options = { block: block, cluster_only: cluster_only }
1476
+ hook_options[:id] = if ON_WORKER_KEY.include?(key.class)
1477
+ key.to_sym
1423
1478
  elsif key.nil?
1424
- @options[options_key] << block
1479
+ nil
1425
1480
  else
1426
- raise "'#{meth}' key must be String or Symbol"
1427
- end
1428
- end
1429
-
1430
- def warn_if_in_single_mode(hook_name)
1431
- return if @options[:silence_fork_callback_warning]
1432
- # user_options (CLI) have precedence over config file
1433
- workers_val = @config.options.user_options[:workers] || @options[:workers] ||
1434
- @config.puma_default_options[:workers] || 0
1435
- if workers_val == 0
1436
- log_string =
1437
- "Warning: You specified code to run in a `#{hook_name}` block, " \
1438
- "but Puma is not configured to run in cluster mode (worker count > 0), " \
1439
- "so your `#{hook_name}` block will not run."
1440
-
1441
- LogWriter.stdio.log(log_string)
1481
+ raise "'#{options_key}' key must be String or Symbol"
1442
1482
  end
1483
+ @options[options_key] << hook_options
1443
1484
  end
1444
1485
  end
1445
1486
  end
@@ -78,10 +78,12 @@ module Puma
78
78
  def request_title(req)
79
79
  env = req.env
80
80
 
81
+ query_string = env[QUERY_STRING]
82
+
81
83
  REQUEST_FORMAT % [
82
84
  env[REQUEST_METHOD],
83
85
  env[REQUEST_PATH] || env[PATH_INFO],
84
- env[QUERY_STRING] || "",
86
+ query_string.nil? || query_string.empty? ? "" : "?#{query_string}",
85
87
  env[HTTP_X_FORWARDED_FOR] || env[REMOTE_ADDR] || "-"
86
88
  ]
87
89
  end
data/lib/puma/events.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  module Puma
4
4
 
5
5
  # This is an event sink used by `Puma::Server` to handle
6
- # lifecycle events such as :on_booted, :on_restart, and :on_stopped.
6
+ # lifecycle events such as :after_booted, :before_restart, and :after_stopped.
7
7
  # Using `Puma::DSL` it is possible to register callback hooks
8
8
  # for each event type.
9
9
  class Events
@@ -30,28 +30,43 @@ module Puma
30
30
  h
31
31
  end
32
32
 
33
+ def after_booted(&block)
34
+ register(:after_booted, &block)
35
+ end
36
+
37
+ def before_restart(&block)
38
+ register(:before_restart, &block)
39
+ end
40
+
41
+ def after_stopped(&block)
42
+ register(:after_stopped, &block)
43
+ end
44
+
33
45
  def on_booted(&block)
34
- register(:on_booted, &block)
46
+ Puma.deprecate_method_change :on_booted, __callee__, :after_booted
47
+ after_booted(&block)
35
48
  end
36
49
 
37
50
  def on_restart(&block)
38
- register(:on_restart, &block)
51
+ Puma.deprecate_method_change :on_restart, __callee__, :before_restart
52
+ before_restart(&block)
39
53
  end
40
54
 
41
55
  def on_stopped(&block)
42
- register(:on_stopped, &block)
56
+ Puma.deprecate_method_change :on_stopped, __callee__, :after_stopped
57
+ after_stopped(&block)
43
58
  end
44
59
 
45
- def fire_on_booted!
46
- fire(:on_booted)
60
+ def fire_after_booted!
61
+ fire(:after_booted)
47
62
  end
48
63
 
49
- def fire_on_restart!
50
- fire(:on_restart)
64
+ def fire_before_restart!
65
+ fire(:before_restart)
51
66
  end
52
67
 
53
- def fire_on_stopped!
54
- fire(:on_stopped)
68
+ def fire_after_stopped!
69
+ fire(:after_stopped)
55
70
  end
56
71
  end
57
72
  end
@@ -34,13 +34,17 @@ module Puma
34
34
 
35
35
  alias_method :clear, :reset
36
36
 
37
- # before Ruby 2.5, `write` would only take one argument
38
- if RUBY_VERSION >= '2.5' && RUBY_ENGINE != 'truffleruby'
39
- alias_method :append, :write
40
- else
37
+ # Create an `IoBuffer#append` method that accepts multiple strings and writes them
38
+ if RUBY_ENGINE == 'truffleruby'
39
+ # truffleruby (24.2.1, like ruby 3.3.7)
40
+ # StringIO.new.write("a", "b") # => `write': wrong number of arguments (given 2, expected 1) (ArgumentError)
41
41
  def append(*strs)
42
42
  strs.each { |str| write str }
43
43
  end
44
+ else
45
+ # Ruby 3+
46
+ # StringIO.new.write("a", "b") # => 2
47
+ alias_method :append, :write
44
48
  end
45
49
  end
46
50
  end
@@ -37,7 +37,7 @@ module Puma
37
37
  ENV['PUMA_BUNDLER_PRUNED'] = '1'
38
38
  ENV["BUNDLE_APP_CONFIG"] = bundle_app_config
39
39
  args = [Gem.ruby, puma_wild_path, '-I', dirs.join(':')] + @original_argv
40
- # Ruby 2.0+ defaults to true which breaks socket activation
40
+ # Defaults to true which breaks socket activation
41
41
  args += [{:close_others => false}]
42
42
  Kernel.exec(*args)
43
43
  end