passenger 5.0.0.beta3 → 5.0.0.rc1

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

Potentially problematic release.


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

Files changed (218) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +11 -5
  5. data/CHANGELOG +38 -0
  6. data/CONTRIBUTING.md +1 -4
  7. data/Gemfile +0 -1
  8. data/Gemfile.lock +0 -2
  9. data/Rakefile +33 -33
  10. data/bin/passenger +1 -1
  11. data/bin/passenger-config +1 -1
  12. data/bin/passenger-install-apache2-module +800 -800
  13. data/bin/passenger-install-nginx-module +592 -592
  14. data/bin/passenger-memory-stats +127 -127
  15. data/bin/passenger-status +216 -216
  16. data/build/agents.rb +127 -127
  17. data/build/apache2.rb +87 -87
  18. data/build/basics.rb +60 -60
  19. data/build/common_library.rb +165 -165
  20. data/build/cplusplus_support.rb +51 -51
  21. data/build/cxx_tests.rb +268 -268
  22. data/build/debian.rb +143 -143
  23. data/build/documentation.rb +58 -58
  24. data/build/integration_tests.rb +81 -81
  25. data/build/misc.rb +132 -132
  26. data/build/nginx.rb +20 -20
  27. data/build/node_tests.rb +7 -7
  28. data/build/oxt_tests.rb +14 -14
  29. data/build/packaging.rb +570 -570
  30. data/build/preprocessor.rb +260 -260
  31. data/build/rake_extensions.rb +71 -71
  32. data/build/ruby_extension.rb +29 -29
  33. data/build/ruby_tests.rb +6 -6
  34. data/build/test_basics.rb +37 -37
  35. data/debian.template/control.template +3 -5
  36. data/dev/copy_boost_headers +134 -134
  37. data/dev/install_scripts_bootstrap_code.rb +25 -25
  38. data/dev/list_tests +20 -20
  39. data/dev/ruby_server.rb +223 -223
  40. data/dev/runner +18 -18
  41. data/doc/ServerOptimizationGuide.txt.md +55 -2
  42. data/doc/Users guide Nginx.txt +0 -26
  43. data/doc/Users guide Standalone.txt +5 -1
  44. data/doc/users_guide_snippets/tips.txt +9 -0
  45. data/ext/common/ApplicationPool2/Group.h +23 -11
  46. data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
  47. data/ext/common/ApplicationPool2/Pool.h +22 -17
  48. data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
  49. data/ext/common/ApplicationPool2/Spawner.h +1 -1
  50. data/ext/common/Constants.h +1 -1
  51. data/ext/common/agents/Base.cpp +35 -20
  52. data/ext/common/agents/HelperAgent/Main.cpp +8 -1
  53. data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
  54. data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
  55. data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
  56. data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
  57. data/ext/common/agents/Main.cpp +1 -1
  58. data/ext/common/agents/Watchdog/Main.cpp +54 -19
  59. data/ext/nginx/Configuration.c +7 -0
  60. data/ext/nginx/ContentHandler.c +9 -1
  61. data/helper-scripts/backtrace-sanitizer.rb +106 -87
  62. data/helper-scripts/crash-watch.rb +32 -0
  63. data/helper-scripts/download_binaries/extconf.rb +38 -38
  64. data/helper-scripts/meteor-loader.rb +107 -107
  65. data/helper-scripts/prespawn +101 -101
  66. data/helper-scripts/rack-loader.rb +96 -96
  67. data/helper-scripts/rack-preloader.rb +137 -137
  68. data/lib/phusion_passenger.rb +292 -292
  69. data/lib/phusion_passenger/abstract_installer.rb +438 -438
  70. data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
  71. data/lib/phusion_passenger/admin_tools.rb +20 -20
  72. data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
  73. data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
  74. data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
  75. data/lib/phusion_passenger/apache2/config_options.rb +182 -182
  76. data/lib/phusion_passenger/common_library.rb +479 -485
  77. data/lib/phusion_passenger/config/about_command.rb +161 -161
  78. data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
  79. data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
  80. data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
  81. data/lib/phusion_passenger/config/command.rb +25 -25
  82. data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
  83. data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
  84. data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
  85. data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
  86. data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
  87. data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
  88. data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
  89. data/lib/phusion_passenger/config/installation_utils.rb +204 -204
  90. data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
  91. data/lib/phusion_passenger/config/main.rb +152 -152
  92. data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
  93. data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
  94. data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
  95. data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
  96. data/lib/phusion_passenger/config/utils.rb +95 -95
  97. data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
  98. data/lib/phusion_passenger/console_text_template.rb +25 -25
  99. data/lib/phusion_passenger/constants.rb +90 -90
  100. data/lib/phusion_passenger/debug_logging.rb +106 -106
  101. data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
  102. data/lib/phusion_passenger/message_channel.rb +312 -312
  103. data/lib/phusion_passenger/message_client.rb +176 -176
  104. data/lib/phusion_passenger/native_support.rb +369 -369
  105. data/lib/phusion_passenger/nginx/config_options.rb +297 -297
  106. data/lib/phusion_passenger/packaging.rb +131 -131
  107. data/lib/phusion_passenger/platform_info.rb +360 -360
  108. data/lib/phusion_passenger/platform_info/apache.rb +767 -767
  109. data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
  110. data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
  111. data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
  112. data/lib/phusion_passenger/platform_info/curl.rb +32 -32
  113. data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
  114. data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
  115. data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
  116. data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
  117. data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
  118. data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
  119. data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
  120. data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
  121. data/lib/phusion_passenger/platform_info/linux.rb +55 -55
  122. data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
  123. data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
  124. data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
  125. data/lib/phusion_passenger/plugin.rb +66 -66
  126. data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
  127. data/lib/phusion_passenger/public_api.rb +191 -191
  128. data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
  129. data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
  130. data/lib/phusion_passenger/request_handler.rb +567 -577
  131. data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
  132. data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
  133. data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
  134. data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
  135. data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
  136. data/lib/phusion_passenger/standalone/command.rb +44 -40
  137. data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
  138. data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
  139. data/lib/phusion_passenger/standalone/main.rb +73 -73
  140. data/lib/phusion_passenger/standalone/start_command.rb +697 -685
  141. data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
  142. data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
  143. data/lib/phusion_passenger/standalone/status_command.rb +64 -64
  144. data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
  145. data/lib/phusion_passenger/standalone/version_command.rb +9 -9
  146. data/lib/phusion_passenger/union_station/connection.rb +32 -32
  147. data/lib/phusion_passenger/union_station/core.rb +251 -251
  148. data/lib/phusion_passenger/union_station/transaction.rb +126 -126
  149. data/lib/phusion_passenger/utils.rb +199 -167
  150. data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
  151. data/lib/phusion_passenger/utils/download.rb +196 -196
  152. data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
  153. data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
  154. data/lib/phusion_passenger/utils/lock.rb +31 -31
  155. data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
  156. data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
  157. data/lib/phusion_passenger/utils/shellwords.rb +20 -20
  158. data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
  159. data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
  160. data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
  161. data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
  162. data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
  163. data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
  164. data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
  165. data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
  166. data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
  167. data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
  168. data/passenger.gemspec +0 -1
  169. data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
  170. data/resources/templates/standalone/config.erb +19 -15
  171. data/test/integration_tests/apache2_tests.rb +566 -566
  172. data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
  173. data/test/integration_tests/native_packaging_spec.rb +296 -296
  174. data/test/integration_tests/nginx_tests.rb +393 -393
  175. data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
  176. data/test/integration_tests/source_packaging_test.rb +138 -138
  177. data/test/integration_tests/spec_helper.rb +5 -5
  178. data/test/integration_tests/standalone_tests.rb +367 -367
  179. data/test/ruby/debug_logging_spec.rb +133 -133
  180. data/test/ruby/message_channel_spec.rb +186 -186
  181. data/test/ruby/rack/loader_spec.rb +28 -28
  182. data/test/ruby/rack/preloader_spec.rb +34 -34
  183. data/test/ruby/rails3.0/loader_spec.rb +12 -12
  184. data/test/ruby/rails3.0/preloader_spec.rb +18 -18
  185. data/test/ruby/rails3.1/loader_spec.rb +12 -12
  186. data/test/ruby/rails3.1/preloader_spec.rb +18 -18
  187. data/test/ruby/rails3.2/loader_spec.rb +12 -12
  188. data/test/ruby/rails3.2/preloader_spec.rb +18 -18
  189. data/test/ruby/rails4.0/loader_spec.rb +12 -12
  190. data/test/ruby/rails4.0/preloader_spec.rb +18 -18
  191. data/test/ruby/rails4.1/loader_spec.rb +12 -12
  192. data/test/ruby/rails4.1/preloader_spec.rb +18 -18
  193. data/test/ruby/request_handler_spec.rb +730 -730
  194. data/test/ruby/shared/loader_sharedspec.rb +224 -224
  195. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
  196. data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
  197. data/test/ruby/spec_helper.rb +65 -65
  198. data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
  199. data/test/ruby/union_station_spec.rb +276 -276
  200. data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
  201. data/test/ruby/utils/hosts_file_parser.rb +248 -248
  202. data/test/ruby/utils/tee_input_spec.rb +215 -215
  203. data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
  204. data/test/ruby/utils_spec.rb +21 -21
  205. data/test/stub/rack/config.ru +87 -87
  206. data/test/stub/rack/library.rb +8 -8
  207. data/test/stub/rack/start.rb +30 -30
  208. data/test/support/apache2_controller.rb +191 -191
  209. data/test/support/nginx_controller.rb +90 -99
  210. data/test/support/placebo-preloader.rb +57 -57
  211. data/test/support/test_helper.rb +435 -435
  212. metadata +11 -21
  213. metadata.gz.asc +7 -7
  214. data/lib/phusion_passenger/standalone/command2.rb +0 -292
  215. data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
  216. data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
  217. data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
  218. data/resources/templates/standalone/run_installer_as_root.txt.erb +0 -8
@@ -25,14 +25,14 @@ PhusionPassenger.require_passenger_lib 'platform_info'
25
25
 
26
26
  module PhusionPassenger
27
27
 
28
- module PlatformInfo
29
- def self.zlib_flags
30
- return nil
31
- end
32
-
33
- def self.zlib_libs
34
- return '-lz'
35
- end
36
- end
28
+ module PlatformInfo
29
+ def self.zlib_flags
30
+ return nil
31
+ end
32
+
33
+ def self.zlib_libs
34
+ return '-lz'
35
+ end
36
+ end
37
37
 
38
38
  end # module PhusionPassenger
@@ -25,71 +25,71 @@ require 'etc'
25
25
 
26
26
  module PhusionPassenger
27
27
 
28
- class Plugin
29
- @@hooks = {}
30
- @@classes = {}
31
-
32
- def self.load(name, load_once = true)
33
- PLUGIN_DIRS.each do |plugin_dir|
34
- if plugin_dir =~ /\A~/
35
- # File.expand_path uses ENV['HOME'] which we don't want.
36
- home = Etc.getpwuid(Process.uid).dir
37
- plugin_dir = plugin_dir.sub(/\A~/, home)
38
- end
39
- plugin_dir = File.expand_path(plugin_dir)
40
- Dir["#{plugin_dir}/*/#{name}.rb"].each do |filename|
41
- if load_once
42
- require(filename)
43
- else
44
- load(filename)
45
- end
46
- end
47
- end
48
- end
49
-
50
- def self.register_hook(name, &block)
51
- hooks_list = (@@hooks[name] ||= [])
52
- hooks_list << block
53
- end
54
-
55
- def self.call_hook(name, *args, &block)
56
- last_result = nil
57
- if (hooks_list = @@hooks[name])
58
- hooks_list.each do |callback|
59
- last_result = callback.call(*args, &block)
60
- end
61
- end
62
- return last_result
63
- end
64
-
65
- def self.register(name, klass)
66
- classes = (@@classes[name] ||= [])
67
- classes << klass
68
- end
69
-
70
- def initialize(name, *args, &block)
71
- Plugin.load(name)
72
- classes = @@classes[name]
73
- if classes
74
- @instances = classes.map do |klass|
75
- klass.new(*args, &block)
76
- end
77
- else
78
- return nil
79
- end
80
- end
81
-
82
- def call_hook(name, *args, &block)
83
- last_result = nil
84
- if @instances
85
- @instances.each do |instance|
86
- if instance.respond_to?(name.to_sym)
87
- last_result = instance.__send__(name.to_sym, *args, &block)
88
- end
89
- end
90
- end
91
- return last_result
92
- end
93
- end
28
+ class Plugin
29
+ @@hooks = {}
30
+ @@classes = {}
31
+
32
+ def self.load(name, load_once = true)
33
+ PLUGIN_DIRS.each do |plugin_dir|
34
+ if plugin_dir =~ /\A~/
35
+ # File.expand_path uses ENV['HOME'] which we don't want.
36
+ home = Etc.getpwuid(Process.uid).dir
37
+ plugin_dir = plugin_dir.sub(/\A~/, home)
38
+ end
39
+ plugin_dir = File.expand_path(plugin_dir)
40
+ Dir["#{plugin_dir}/*/#{name}.rb"].each do |filename|
41
+ if load_once
42
+ require(filename)
43
+ else
44
+ load(filename)
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ def self.register_hook(name, &block)
51
+ hooks_list = (@@hooks[name] ||= [])
52
+ hooks_list << block
53
+ end
54
+
55
+ def self.call_hook(name, *args, &block)
56
+ last_result = nil
57
+ if (hooks_list = @@hooks[name])
58
+ hooks_list.each do |callback|
59
+ last_result = callback.call(*args, &block)
60
+ end
61
+ end
62
+ return last_result
63
+ end
64
+
65
+ def self.register(name, klass)
66
+ classes = (@@classes[name] ||= [])
67
+ classes << klass
68
+ end
69
+
70
+ def initialize(name, *args, &block)
71
+ Plugin.load(name)
72
+ classes = @@classes[name]
73
+ if classes
74
+ @instances = classes.map do |klass|
75
+ klass.new(*args, &block)
76
+ end
77
+ else
78
+ return nil
79
+ end
80
+ end
81
+
82
+ def call_hook(name, *args, &block)
83
+ last_result = nil
84
+ if @instances
85
+ @instances.each do |instance|
86
+ if instance.respond_to?(name.to_sym)
87
+ last_result = instance.__send__(name.to_sym, *args, &block)
88
+ end
89
+ end
90
+ end
91
+ return last_result
92
+ end
93
+ end
94
94
 
95
95
  end # module PhusionPassenger
@@ -29,141 +29,141 @@ PhusionPassenger.require_passenger_lib 'native_support'
29
29
 
30
30
  module PhusionPassenger
31
31
 
32
- # Provides shared functions for preloader apps.
33
- module PreloaderSharedHelpers
34
- extend self
32
+ # Provides shared functions for preloader apps.
33
+ module PreloaderSharedHelpers
34
+ extend self
35
35
 
36
- def init(options)
37
- if !Kernel.respond_to?(:fork)
38
- message = "Smart spawning is not available on this Ruby " +
39
- "implementation because it does not support `Kernel.fork`. "
40
- if ENV['SERVER_SOFTWARE'].to_s =~ /nginx/i
41
- message << "Please set `passenger_spawn_method` to `direct`."
42
- else
43
- message << "Please set `PassengerSpawnMethod` to `direct`."
44
- end
45
- raise(message)
46
- end
47
- return options
48
- end
36
+ def init(options)
37
+ if !Kernel.respond_to?(:fork)
38
+ message = "Smart spawning is not available on this Ruby " +
39
+ "implementation because it does not support `Kernel.fork`. "
40
+ if ENV['SERVER_SOFTWARE'].to_s =~ /nginx/i
41
+ message << "Please set `passenger_spawn_method` to `direct`."
42
+ else
43
+ message << "Please set `PassengerSpawnMethod` to `direct`."
44
+ end
45
+ raise(message)
46
+ end
47
+ return options
48
+ end
49
49
 
50
- def accept_and_process_next_client(server_socket)
51
- original_pid = Process.pid
52
- client = server_socket.accept
53
- client.binmode
54
- begin
55
- command = client.readline
56
- rescue EOFError
57
- return nil
58
- end
59
- if command !~ /\n\Z/
60
- STDERR.puts "Command must end with a newline"
61
- elsif command == "spawn\n"
62
- while client.readline != "\n"
63
- # Do nothing.
64
- end
50
+ def accept_and_process_next_client(server_socket)
51
+ original_pid = Process.pid
52
+ client = server_socket.accept
53
+ client.binmode
54
+ begin
55
+ command = client.readline
56
+ rescue EOFError
57
+ return nil
58
+ end
59
+ if command !~ /\n\Z/
60
+ STDERR.puts "Command must end with a newline"
61
+ elsif command == "spawn\n"
62
+ while client.readline != "\n"
63
+ # Do nothing.
64
+ end
65
65
 
66
- # Improve copy-on-write friendliness.
67
- GC.start
66
+ # Improve copy-on-write friendliness.
67
+ GC.start
68
68
 
69
- pid = fork
70
- if pid.nil?
71
- $0 = "#{$0} (forking...)"
72
- client.puts "OK"
73
- client.puts Process.pid
74
- client.flush
75
- client.sync = true
76
- return [:forked, client]
77
- elsif defined?(NativeSupport)
78
- NativeSupport.detach_process(pid)
79
- else
80
- Process.detach(pid)
81
- end
82
- else
83
- STDERR.puts "Unknown command '#{command.inspect}'"
84
- end
85
- return nil
86
- ensure
87
- if client && Process.pid == original_pid
88
- begin
89
- client.close
90
- rescue Errno::EINVAL
91
- # Work around OS X bug.
92
- # https://code.google.com/p/phusion-passenger/issues/detail?id=854
93
- end
94
- end
95
- end
69
+ pid = fork
70
+ if pid.nil?
71
+ $0 = "#{$0} (forking...)"
72
+ client.puts "OK"
73
+ client.puts Process.pid
74
+ client.flush
75
+ client.sync = true
76
+ return [:forked, client]
77
+ elsif defined?(NativeSupport)
78
+ NativeSupport.detach_process(pid)
79
+ else
80
+ Process.detach(pid)
81
+ end
82
+ else
83
+ STDERR.puts "Unknown command '#{command.inspect}'"
84
+ end
85
+ return nil
86
+ ensure
87
+ if client && Process.pid == original_pid
88
+ begin
89
+ client.close
90
+ rescue Errno::EINVAL
91
+ # Work around OS X bug.
92
+ # https://code.google.com/p/phusion-passenger/issues/detail?id=854
93
+ end
94
+ end
95
+ end
96
96
 
97
- def run_main_loop(options)
98
- $0 = "Passenger AppPreloader: #{options['app_root']}"
99
- client = nil
100
- original_pid = Process.pid
97
+ def run_main_loop(options)
98
+ $0 = "Passenger AppPreloader: #{options['app_root']}"
99
+ client = nil
100
+ original_pid = Process.pid
101
101
 
102
- if defined?(NativeSupport)
103
- unix_path_max = NativeSupport::UNIX_PATH_MAX
104
- else
105
- unix_path_max = options.fetch('UNIX_PATH_MAX', 100).to_i
106
- end
107
- if options['socket_dir']
108
- socket_dir = options['socket_dir']
109
- socket_prefix = "preloader"
110
- else
111
- socket_dir = Dir.tmpdir
112
- socket_prefix = "PsgPreloader"
113
- end
102
+ if defined?(NativeSupport)
103
+ unix_path_max = NativeSupport::UNIX_PATH_MAX
104
+ else
105
+ unix_path_max = options.fetch('UNIX_PATH_MAX', 100).to_i
106
+ end
107
+ if options['socket_dir']
108
+ socket_dir = options['socket_dir']
109
+ socket_prefix = "preloader"
110
+ else
111
+ socket_dir = Dir.tmpdir
112
+ socket_prefix = "PsgPreloader"
113
+ end
114
114
 
115
- socket_filename = nil
116
- server = nil
117
- Utils.retry_at_most(128, Errno::EADDRINUSE) do
118
- socket_filename = "#{socket_dir}/#{socket_prefix}.#{rand(0xFFFFFFFF).to_s(36)}"
119
- socket_filename = socket_filename.slice(0, unix_path_max - 10)
120
- server = UNIXServer.new(socket_filename)
121
- end
122
- server.close_on_exec!
123
- File.chmod(0600, socket_filename)
115
+ socket_filename = nil
116
+ server = nil
117
+ Utils.retry_at_most(128, Errno::EADDRINUSE) do
118
+ socket_filename = "#{socket_dir}/#{socket_prefix}.#{rand(0xFFFFFFFF).to_s(36)}"
119
+ socket_filename = socket_filename.slice(0, unix_path_max - 10)
120
+ server = UNIXServer.new(socket_filename)
121
+ end
122
+ server.close_on_exec!
123
+ File.chmod(0600, socket_filename)
124
124
 
125
- # Update the dump information just before telling the preloader that we're
126
- # ready because the HelperAgent will read and memorize this information.
127
- LoaderSharedHelpers.dump_all_information
125
+ # Update the dump information just before telling the preloader that we're
126
+ # ready because the HelperAgent will read and memorize this information.
127
+ LoaderSharedHelpers.dump_all_information(options)
128
128
 
129
- puts "!> Ready"
130
- puts "!> socket: unix:#{socket_filename}"
131
- puts "!> "
129
+ puts "!> Ready"
130
+ puts "!> socket: unix:#{socket_filename}"
131
+ puts "!> "
132
132
 
133
- while true
134
- # We call ::select just in case someone overwrites the global select()
135
- # function by including ActionView::Helpers in the wrong place.
136
- # https://code.google.com/p/phusion-passenger/issues/detail?id=915
137
- ios = Kernel.select([server, STDIN])[0]
138
- if ios.include?(server)
139
- result, client = accept_and_process_next_client(server)
140
- if result == :forked
141
- STDIN.reopen(client)
142
- STDOUT.reopen(client)
143
- STDOUT.sync = true
144
- client.close
145
- return :forked
146
- end
147
- end
148
- if ios.include?(STDIN)
149
- if STDIN.tty?
150
- begin
151
- # Prevent bash from exiting when we press Ctrl-D.
152
- STDIN.read_nonblock(1)
153
- rescue Errno::EAGAIN
154
- # Do nothing.
155
- end
156
- end
157
- break
158
- end
159
- end
160
- return nil
161
- ensure
162
- server.close if server
163
- if original_pid == Process.pid
164
- File.unlink(socket_filename) rescue nil
165
- end
166
- end
167
- end
133
+ while true
134
+ # We call ::select just in case someone overwrites the global select()
135
+ # function by including ActionView::Helpers in the wrong place.
136
+ # https://code.google.com/p/phusion-passenger/issues/detail?id=915
137
+ ios = Kernel.select([server, STDIN])[0]
138
+ if ios.include?(server)
139
+ result, client = accept_and_process_next_client(server)
140
+ if result == :forked
141
+ STDIN.reopen(client)
142
+ STDOUT.reopen(client)
143
+ STDOUT.sync = true
144
+ client.close
145
+ return :forked
146
+ end
147
+ end
148
+ if ios.include?(STDIN)
149
+ if STDIN.tty?
150
+ begin
151
+ # Prevent bash from exiting when we press Ctrl-D.
152
+ STDIN.read_nonblock(1)
153
+ rescue Errno::EAGAIN
154
+ # Do nothing.
155
+ end
156
+ end
157
+ break
158
+ end
159
+ end
160
+ return nil
161
+ ensure
162
+ server.close if server
163
+ if original_pid == Process.pid
164
+ File.unlink(socket_filename) rescue nil
165
+ end
166
+ end
167
+ end
168
168
 
169
169
  end # module PhusionPassenger
@@ -22,195 +22,195 @@
22
22
  # THE SOFTWARE.
23
23
 
24
24
  module PhusionPassenger
25
- class << self
26
- @@event_starting_worker_process = []
27
- @@event_stopping_worker_process = []
28
- @@event_starting_request_handler_thread = []
29
- @@event_credentials = []
30
- @@event_after_installing_signal_handlers = []
31
- @@event_oob_work = []
32
- @@advertised_concurrency_level = nil
33
-
34
- def on_event(name, &block)
35
- callback_list_for_event(name) << block
36
- end
37
-
38
- def call_event(name, *args)
39
- callback_list_for_event(name).each do |callback|
40
- callback.call(*args)
41
- end
42
- end
43
-
44
- def install_framework_extensions!(*args)
45
- require 'active_support/version' if defined?(::ActiveSupport) && !defined?(::ActiveSupport::VERSION)
46
- if defined?(::ActiveSupport) && ::ActiveSupport::VERSION::MAJOR >= 3
47
- PhusionPassenger.require_passenger_lib 'active_support3_extensions/init'
48
- ActiveSupport3Extensions.init!(PhusionPassenger::App.options, *args)
49
- end
50
- end
51
-
52
- def advertised_concurrency_level
53
- @@advertised_concurrency_level
54
- end
55
-
56
- def advertised_concurrency_level=(value)
57
- @@advertised_concurrency_level = value
58
- end
59
-
60
- def measure_and_log_event(env, name)
61
- transaction = lookup_union_station_web_transaction(env)
62
- if transaction
63
- transaction.measure(name) do
64
- yield
65
- end
66
- else
67
- yield
68
- end
69
- end
70
-
71
- def benchmark(env = nil, title = "Benchmarking", &block)
72
- measure_and_log_event(env, "BENCHMARK: #{title}", &block)
73
- end
74
-
75
- # Log an exception that occurred during a request.
76
- def log_request_exception(env, exception, options = nil)
77
- return if !env[PASSENGER_TXN_ID]
78
- core = lookup_union_station_core(env)
79
- if core
80
- transaction = core.new_transaction(
81
- env[PASSENGER_APP_GROUP_NAME],
82
- :exceptions,
83
- env[PASSENGER_UNION_STATION_KEY])
84
- begin
85
- request_txn_id = env[PASSENGER_TXN_ID]
86
- message = exception.message
87
- message = exception.to_s if message.empty?
88
- message = [message].pack('m')
89
- message.gsub!("\n", "")
90
- backtrace_string = [exception.backtrace.join("\n")].pack('m')
91
- backtrace_string.gsub!("\n", "")
92
-
93
- transaction.message("Request transaction ID: #{request_txn_id}")
94
- transaction.message("Message: #{message}")
95
- transaction.message("Class: #{exception.class.name}")
96
- transaction.message("Backtrace: #{backtrace_string}")
97
-
98
- if options && options[:controller_name]
99
- if options[:action_name]
100
- controller_action = "#{options[:controller_name]}##{options[:action_name]}"
101
- else
102
- controller_action = controller_name
103
- end
104
- transaction.message("Controller action: #{controller_action}")
105
- end
106
- ensure
107
- transaction.close
108
- end
109
- end
110
- end
111
-
112
- # Log a controller action invocation.
113
- def log_controller_action(env, options)
114
- transaction = lookup_union_station_web_transaction(env)
115
- if transaction
116
- if options[:controller_name]
117
- if !options[:action_name]
118
- raise ArgumentError, "The :action_name option must be set"
119
- end
120
- transaction.message("Controller action: #{options[:controller_name]}##{options[:action_name]}")
121
- end
122
- if options[:method]
123
- transaction.message("Request method: #{options[:method]}")
124
- end
125
- transaction.measure("framework request processing") do
126
- yield
127
- end
128
- else
129
- yield
130
- end
131
- end
132
-
133
- # Log the total view rendering time of a request.
134
- def log_total_view_rendering_time(env, runtime)
135
- transaction = lookup_union_station_web_transaction(env)
136
- if transaction
137
- transaction.message("View rendering time: #{(runtime).to_i}")
138
- end
139
- end
140
-
141
- # Log a single view rendering.
142
- def log_view_rendering(env = nil, &block)
143
- measure_and_log_event(env, "view rendering", &block)
144
- end
145
-
146
- # Log a database query.
147
- def log_database_query(env, name, begin_time, end_time, sql)
148
- transaction = lookup_union_station_web_transaction(env)
149
- if transaction
150
- digest = Digest::MD5.hexdigest("#{name}\0#{sql}\0#{rand}")
151
- transaction.measured_time_points("DB BENCHMARK: #{digest}",
152
- begin_time,
153
- end_time,
154
- "#{name}\n#{sql}")
155
- end
156
- end
157
-
158
- def log_cache_hit(env, name)
159
- transaction = lookup_union_station_web_transaction(env)
160
- if transaction
161
- transaction.message("Cache hit: #{name}")
162
- return true
163
- else
164
- return false
165
- end
166
- end
167
-
168
- def log_cache_miss(env, name, generation_time = nil)
169
- transaction = lookup_union_station_web_transaction(env)
170
- if transaction
171
- if generation_time
172
- transaction.message("Cache miss (#{generation_time.to_i}): #{name}")
173
- else
174
- transaction.message("Cache miss: #{name}")
175
- end
176
- return true
177
- else
178
- return false
179
- end
180
- end
181
-
182
- private
183
- def callback_list_for_event(name)
184
- return case name
185
- when :starting_worker_process
186
- @@event_starting_worker_process
187
- when :stopping_worker_process
188
- @@event_stopping_worker_process
189
- when :starting_request_handler_thread
190
- @@event_starting_request_handler_thread
191
- when :credentials
192
- @@event_credentials
193
- when :after_installing_signal_handlers
194
- @@event_after_installing_signal_handlers
195
- when :oob_work
196
- @@event_oob_work
197
- else
198
- raise ArgumentError, "Unknown event name '#{name}'"
199
- end
200
- end
201
-
202
- def lookup_union_station_core(env = nil)
203
- if env
204
- result = env[UNION_STATION_CORE]
205
- end
206
- return result || Thread.current[UNION_STATION_CORE]
207
- end
208
-
209
- def lookup_union_station_web_transaction(env = nil)
210
- if env
211
- result = env[UNION_STATION_REQUEST_TRANSACTION]
212
- end
213
- return result || Thread.current[UNION_STATION_REQUEST_TRANSACTION]
214
- end
215
- end
25
+ class << self
26
+ @@event_starting_worker_process = []
27
+ @@event_stopping_worker_process = []
28
+ @@event_starting_request_handler_thread = []
29
+ @@event_credentials = []
30
+ @@event_after_installing_signal_handlers = []
31
+ @@event_oob_work = []
32
+ @@advertised_concurrency_level = nil
33
+
34
+ def on_event(name, &block)
35
+ callback_list_for_event(name) << block
36
+ end
37
+
38
+ def call_event(name, *args)
39
+ callback_list_for_event(name).each do |callback|
40
+ callback.call(*args)
41
+ end
42
+ end
43
+
44
+ def install_framework_extensions!(*args)
45
+ require 'active_support/version' if defined?(::ActiveSupport) && !defined?(::ActiveSupport::VERSION)
46
+ if defined?(::ActiveSupport) && ::ActiveSupport::VERSION::MAJOR >= 3
47
+ PhusionPassenger.require_passenger_lib 'active_support3_extensions/init'
48
+ ActiveSupport3Extensions.init!(PhusionPassenger::App.options, *args)
49
+ end
50
+ end
51
+
52
+ def advertised_concurrency_level
53
+ @@advertised_concurrency_level
54
+ end
55
+
56
+ def advertised_concurrency_level=(value)
57
+ @@advertised_concurrency_level = value
58
+ end
59
+
60
+ def measure_and_log_event(env, name)
61
+ transaction = lookup_union_station_web_transaction(env)
62
+ if transaction
63
+ transaction.measure(name) do
64
+ yield
65
+ end
66
+ else
67
+ yield
68
+ end
69
+ end
70
+
71
+ def benchmark(env = nil, title = "Benchmarking", &block)
72
+ measure_and_log_event(env, "BENCHMARK: #{title}", &block)
73
+ end
74
+
75
+ # Log an exception that occurred during a request.
76
+ def log_request_exception(env, exception, options = nil)
77
+ return if !env[PASSENGER_TXN_ID]
78
+ core = lookup_union_station_core(env)
79
+ if core
80
+ transaction = core.new_transaction(
81
+ env[PASSENGER_APP_GROUP_NAME],
82
+ :exceptions,
83
+ env[PASSENGER_UNION_STATION_KEY])
84
+ begin
85
+ request_txn_id = env[PASSENGER_TXN_ID]
86
+ message = exception.message
87
+ message = exception.to_s if message.empty?
88
+ message = [message].pack('m')
89
+ message.gsub!("\n", "")
90
+ backtrace_string = [exception.backtrace.join("\n")].pack('m')
91
+ backtrace_string.gsub!("\n", "")
92
+
93
+ transaction.message("Request transaction ID: #{request_txn_id}")
94
+ transaction.message("Message: #{message}")
95
+ transaction.message("Class: #{exception.class.name}")
96
+ transaction.message("Backtrace: #{backtrace_string}")
97
+
98
+ if options && options[:controller_name]
99
+ if options[:action_name]
100
+ controller_action = "#{options[:controller_name]}##{options[:action_name]}"
101
+ else
102
+ controller_action = controller_name
103
+ end
104
+ transaction.message("Controller action: #{controller_action}")
105
+ end
106
+ ensure
107
+ transaction.close
108
+ end
109
+ end
110
+ end
111
+
112
+ # Log a controller action invocation.
113
+ def log_controller_action(env, options)
114
+ transaction = lookup_union_station_web_transaction(env)
115
+ if transaction
116
+ if options[:controller_name]
117
+ if !options[:action_name]
118
+ raise ArgumentError, "The :action_name option must be set"
119
+ end
120
+ transaction.message("Controller action: #{options[:controller_name]}##{options[:action_name]}")
121
+ end
122
+ if options[:method]
123
+ transaction.message("Request method: #{options[:method]}")
124
+ end
125
+ transaction.measure("framework request processing") do
126
+ yield
127
+ end
128
+ else
129
+ yield
130
+ end
131
+ end
132
+
133
+ # Log the total view rendering time of a request.
134
+ def log_total_view_rendering_time(env, runtime)
135
+ transaction = lookup_union_station_web_transaction(env)
136
+ if transaction
137
+ transaction.message("View rendering time: #{(runtime).to_i}")
138
+ end
139
+ end
140
+
141
+ # Log a single view rendering.
142
+ def log_view_rendering(env = nil, &block)
143
+ measure_and_log_event(env, "view rendering", &block)
144
+ end
145
+
146
+ # Log a database query.
147
+ def log_database_query(env, name, begin_time, end_time, sql)
148
+ transaction = lookup_union_station_web_transaction(env)
149
+ if transaction
150
+ digest = Digest::MD5.hexdigest("#{name}\0#{sql}\0#{rand}")
151
+ transaction.measured_time_points("DB BENCHMARK: #{digest}",
152
+ begin_time,
153
+ end_time,
154
+ "#{name}\n#{sql}")
155
+ end
156
+ end
157
+
158
+ def log_cache_hit(env, name)
159
+ transaction = lookup_union_station_web_transaction(env)
160
+ if transaction
161
+ transaction.message("Cache hit: #{name}")
162
+ return true
163
+ else
164
+ return false
165
+ end
166
+ end
167
+
168
+ def log_cache_miss(env, name, generation_time = nil)
169
+ transaction = lookup_union_station_web_transaction(env)
170
+ if transaction
171
+ if generation_time
172
+ transaction.message("Cache miss (#{generation_time.to_i}): #{name}")
173
+ else
174
+ transaction.message("Cache miss: #{name}")
175
+ end
176
+ return true
177
+ else
178
+ return false
179
+ end
180
+ end
181
+
182
+ private
183
+ def callback_list_for_event(name)
184
+ return case name
185
+ when :starting_worker_process
186
+ @@event_starting_worker_process
187
+ when :stopping_worker_process
188
+ @@event_stopping_worker_process
189
+ when :starting_request_handler_thread
190
+ @@event_starting_request_handler_thread
191
+ when :credentials
192
+ @@event_credentials
193
+ when :after_installing_signal_handlers
194
+ @@event_after_installing_signal_handlers
195
+ when :oob_work
196
+ @@event_oob_work
197
+ else
198
+ raise ArgumentError, "Unknown event name '#{name}'"
199
+ end
200
+ end
201
+
202
+ def lookup_union_station_core(env = nil)
203
+ if env
204
+ result = env[UNION_STATION_CORE]
205
+ end
206
+ return result || Thread.current[UNION_STATION_CORE]
207
+ end
208
+
209
+ def lookup_union_station_web_transaction(env = nil)
210
+ if env
211
+ result = env[UNION_STATION_REQUEST_TRANSACTION]
212
+ end
213
+ return result || Thread.current[UNION_STATION_REQUEST_TRANSACTION]
214
+ end
215
+ end
216
216
  end # module PhusionPassenger