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.
- checksums.yaml +4 -4
- data/History.md +170 -5
- data/README.md +24 -32
- data/docs/fork_worker.md +5 -5
- data/docs/kubernetes.md +8 -6
- data/docs/restart.md +2 -2
- data/docs/signals.md +11 -11
- data/docs/stats.md +3 -2
- data/docs/systemd.md +1 -1
- data/ext/puma_http11/extconf.rb +2 -17
- data/ext/puma_http11/mini_ssl.c +18 -8
- data/ext/puma_http11/org/jruby/puma/Http11.java +10 -2
- data/ext/puma_http11/puma_http11.c +23 -11
- data/lib/puma/binder.rb +10 -8
- data/lib/puma/cli.rb +3 -5
- data/lib/puma/client.rb +95 -61
- data/lib/puma/cluster/worker.rb +9 -10
- data/lib/puma/cluster/worker_handle.rb +38 -7
- data/lib/puma/cluster.rb +41 -26
- data/lib/puma/cluster_accept_loop_delay.rb +91 -0
- data/lib/puma/commonlogger.rb +3 -3
- data/lib/puma/configuration.rb +89 -43
- data/lib/puma/const.rb +9 -10
- data/lib/puma/control_cli.rb +6 -2
- data/lib/puma/detect.rb +2 -0
- data/lib/puma/dsl.rb +135 -94
- data/lib/puma/error_logger.rb +3 -1
- data/lib/puma/events.rb +25 -10
- data/lib/puma/io_buffer.rb +8 -4
- data/lib/puma/launcher/bundle_pruner.rb +1 -1
- data/lib/puma/launcher.rb +52 -48
- data/lib/puma/minissl.rb +0 -1
- data/lib/puma/plugin/systemd.rb +3 -3
- data/lib/puma/puma_http11.jar +0 -0
- data/lib/puma/rack/urlmap.rb +1 -1
- data/lib/puma/reactor.rb +19 -4
- data/lib/puma/request.rb +45 -32
- data/lib/puma/runner.rb +8 -17
- data/lib/puma/server.rb +111 -61
- data/lib/puma/single.rb +5 -2
- data/lib/puma/state_file.rb +3 -2
- data/lib/puma/thread_pool.rb +47 -82
- data/lib/puma/util.rb +0 -7
- data/lib/puma.rb +10 -0
- data/lib/rack/handler/puma.rb +2 -2
- data/tools/Dockerfile +3 -1
- metadata +6 -7
data/lib/puma/detect.rb
CHANGED
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.
|
|
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.
|
|
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
|
|
47
|
-
# |
|
|
48
|
-
# |
|
|
49
|
-
# |
|
|
50
|
-
# | after_refork
|
|
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
|
-
#
|
|
374
|
-
#
|
|
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
|
-
#
|
|
380
|
+
# fiber_per_request
|
|
380
381
|
#
|
|
381
|
-
def
|
|
382
|
-
@options[:
|
|
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
|
-
#
|
|
440
|
+
# before_restart do
|
|
438
441
|
# puts 'On restart...'
|
|
439
442
|
# end
|
|
440
443
|
#
|
|
441
|
-
def
|
|
442
|
-
|
|
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
|
-
|
|
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
|
-
#
|
|
749
|
+
# before_worker_boot do
|
|
746
750
|
# puts 'Before worker boot...'
|
|
747
751
|
# end
|
|
748
752
|
#
|
|
749
|
-
def
|
|
750
|
-
|
|
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,
|
|
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
|
-
#
|
|
772
|
+
# before_worker_shutdown do
|
|
767
773
|
# puts 'On worker shutdown...'
|
|
768
774
|
# end
|
|
769
775
|
#
|
|
770
|
-
def
|
|
771
|
-
|
|
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,
|
|
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
|
-
#
|
|
792
|
+
# before_worker_fork do
|
|
785
793
|
# puts 'Before worker fork...'
|
|
786
794
|
# end
|
|
787
795
|
#
|
|
788
|
-
def
|
|
789
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
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
|
-
#
|
|
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
|
|
822
|
-
|
|
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
|
-
#
|
|
854
|
+
# after_stopped do
|
|
829
855
|
# puts 'After stopping...'
|
|
830
856
|
# end
|
|
831
857
|
#
|
|
832
|
-
def
|
|
833
|
-
|
|
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
|
-
#
|
|
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
|
|
857
|
-
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
#
|
|
927
|
+
# before_thread_start do
|
|
897
928
|
# puts 'On thread start...'
|
|
898
929
|
# end
|
|
899
930
|
#
|
|
900
|
-
def
|
|
901
|
-
|
|
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
|
-
#
|
|
955
|
+
# before_thread_exit do
|
|
921
956
|
# puts 'On thread exit...'
|
|
922
957
|
# end
|
|
923
958
|
#
|
|
924
|
-
def
|
|
925
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
1185
|
+
strategy = strategy.to_sym
|
|
1147
1186
|
|
|
1148
1187
|
if ![:youngest, :oldest].include?(strategy)
|
|
1149
|
-
raise "Invalid value for worker_culling_strategy - #{
|
|
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
|
-
#
|
|
1187
|
-
#
|
|
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
|
-
#
|
|
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
|
-
#
|
|
1281
|
-
# the reactor to be subject to normal ordering.
|
|
1322
|
+
# @deprecated Use {#max_keep_alive} instead.
|
|
1282
1323
|
#
|
|
1283
|
-
|
|
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
|
-
#
|
|
1336
|
+
# max_keep_alive 20
|
|
1287
1337
|
#
|
|
1288
|
-
def
|
|
1289
|
-
@options[:
|
|
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,
|
|
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
|
-
|
|
1422
|
-
|
|
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
|
-
|
|
1479
|
+
nil
|
|
1425
1480
|
else
|
|
1426
|
-
raise "'#{
|
|
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
|
data/lib/puma/error_logger.rb
CHANGED
|
@@ -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
|
-
|
|
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 :
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
56
|
+
Puma.deprecate_method_change :on_stopped, __callee__, :after_stopped
|
|
57
|
+
after_stopped(&block)
|
|
43
58
|
end
|
|
44
59
|
|
|
45
|
-
def
|
|
46
|
-
fire(:
|
|
60
|
+
def fire_after_booted!
|
|
61
|
+
fire(:after_booted)
|
|
47
62
|
end
|
|
48
63
|
|
|
49
|
-
def
|
|
50
|
-
fire(:
|
|
64
|
+
def fire_before_restart!
|
|
65
|
+
fire(:before_restart)
|
|
51
66
|
end
|
|
52
67
|
|
|
53
|
-
def
|
|
54
|
-
fire(:
|
|
68
|
+
def fire_after_stopped!
|
|
69
|
+
fire(:after_stopped)
|
|
55
70
|
end
|
|
56
71
|
end
|
|
57
72
|
end
|
data/lib/puma/io_buffer.rb
CHANGED
|
@@ -34,13 +34,17 @@ module Puma
|
|
|
34
34
|
|
|
35
35
|
alias_method :clear, :reset
|
|
36
36
|
|
|
37
|
-
#
|
|
38
|
-
if
|
|
39
|
-
|
|
40
|
-
|
|
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
|
-
#
|
|
40
|
+
# Defaults to true which breaks socket activation
|
|
41
41
|
args += [{:close_others => false}]
|
|
42
42
|
Kernel.exec(*args)
|
|
43
43
|
end
|