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
@@ -26,175 +26,173 @@ require 'digest/md5'
26
26
 
27
27
  module PhusionPassenger
28
28
 
29
- module ActiveSupport3Extensions
30
- def self.init!(options, user_options = {})
31
- if !UnionStationExtension.install!(options, user_options)
32
- # Remove code to save memory.
33
- PhusionPassenger::ActiveSupport3Extensions.send(:remove_const, :UnionStationExtension)
34
- PhusionPassenger.send(:remove_const, :ActiveSupport3Extensions)
35
- end
36
- end
37
- end
38
-
39
- module ActiveSupport3Extensions
40
- class UnionStationExtension < ActiveSupport::LogSubscriber
41
- def self.install!(options, user_options)
42
- union_station_core = options["union_station_core"]
43
- app_group_name = options["app_group_name"]
44
- return false if !union_station_core || !options["analytics"]
45
-
46
- # If the Ruby interpreter supports GC statistics then turn it on
47
- # so that the info can be logged.
48
- GC.enable_stats if GC.respond_to?(:enable_stats)
49
-
50
- subscriber = self.new(user_options)
51
- UnionStationExtension.attach_to(:action_controller, subscriber)
52
- UnionStationExtension.attach_to(:active_record, subscriber)
53
- if defined?(ActiveSupport::Cache::Store)
54
- ActiveSupport::Cache::Store.instrument = true
55
- UnionStationExtension.attach_to(:active_support, subscriber)
56
- end
57
- PhusionPassenger.on_event(:starting_request_handler_thread) do
58
- if defined?(ActiveSupport::Cache::Store)
59
- # This flag is thread-local.
60
- ActiveSupport::Cache::Store.instrument = true
61
- end
62
- end
63
-
64
- if defined?(ActionDispatch::DebugExceptions)
65
- exceptions_middleware = ActionDispatch::DebugExceptions
66
- elsif defined?(ActionDispatch::ShowExceptions)
67
- exceptions_middleware = ActionDispatch::ShowExceptions
68
- end
69
- if exceptions_middleware
70
- if defined?(Rails)
71
- Rails.application.middleware.insert_after(
72
- exceptions_middleware,
73
- ExceptionLogger,
74
- union_station_core,
75
- app_group_name)
76
- end
77
- end
78
-
79
- if defined?(ActionController::Base)
80
- ActionController::Base.class_eval do
81
- include ACExtension
82
- end
83
- end
84
-
85
- if defined?(ActiveSupport::Benchmarkable)
86
- ActiveSupport::Benchmarkable.class_eval do
87
- include ASBenchmarkableExtension
88
- alias_method_chain :benchmark, :passenger
89
- end
90
- end
91
-
92
- return true
93
- end
94
-
95
- def initialize(options)
96
- super()
97
- install_event_preprocessor(options[:event_preprocessor]) if options[:event_preprocessor]
98
- end
99
-
100
- def process_action(event)
101
- view_runtime = event.payload[:view_runtime]
102
- if view_runtime
103
- PhusionPassenger.log_total_view_rendering_time(nil, (view_runtime * 1000).to_i)
104
- end
105
- end
106
-
107
- def sql(event)
108
- PhusionPassenger.log_database_query(nil,
109
- event.payload[:name] || "SQL",
110
- event.time,
111
- event.end,
112
- event.payload[:sql])
113
- end
114
-
115
- def cache_read(event)
116
- if event.payload[:hit]
117
- PhusionPassenger.log_cache_hit(nil, event.payload[:key])
118
- else
119
- PhusionPassenger.log_cache_miss(nil, event.payload[:key])
120
- end
121
- end
122
-
123
- def cache_fetch_hit(event)
124
- PhusionPassenger.log_cache_hit(nil, event.payload[:key])
125
- end
126
-
127
- def cache_generate(event)
128
- PhusionPassenger.log_cache_miss(nil, event.payload[:key],
129
- event.duration * 1000)
130
- end
131
-
132
- class ExceptionLogger
133
- def initialize(app, union_station_core, app_group_name)
134
- @app = app
135
- @union_station_core = union_station_core
136
- @app_group_name = app_group_name
137
- end
138
-
139
- def call(env)
140
- @app.call(env)
141
- rescue Exception => e
142
- log_union_station_exception(env, e) if env[PASSENGER_TXN_ID]
143
- raise e
144
- end
145
-
146
- private
147
- def log_union_station_exception(env, exception)
148
- options = {}
149
- request = ActionDispatch::Request.new(env)
150
- if request.parameters['controller']
151
- options[:controller_name] = request.parameters['controller'].humanize + "Controller"
152
- options[:action_name] = request.parameters['action']
153
- end
154
- PhusionPassenger.log_request_exception(env, exception, options)
155
- end
156
- end
157
-
158
- module ACExtension
159
- def process_action(action, *args)
160
- options = {
161
- :controller_name => self.class.name,
162
- :action_name => action_name,
163
- :method => request.request_method
164
- }
165
- PhusionPassenger.log_controller_action(request.env, options) do
166
- super
167
- end
168
- end
169
-
170
- def render(*args)
171
- PhusionPassenger.log_view_rendering(request.env) do
172
- super
173
- end
174
- end
175
- end
176
-
177
- module ASBenchmarkableExtension
178
- def benchmark_with_passenger(message = "Benchmarking", *args)
179
- PhusionPassenger.benchmark(nil, message) do
180
- benchmark_without_passenger(message, *args) do
181
- yield
182
- end
183
- end
184
- end
185
- end
186
-
187
- private
188
- def install_event_preprocessor(event_preprocessor)
189
- public_methods(false).each do |name|
190
- singleton = class << self; self end
191
- singleton.send(:define_method, name, lambda do |event|
192
- event_preprocessor.call(event)
193
- super(event)
194
- end)
195
- end
196
- end
197
- end # class UnionStationExtension
198
- end # module ActiveSupport3Extensions
29
+ module ActiveSupport3Extensions
30
+ def self.init!(options, user_options = {})
31
+ if !UnionStationExtension.install!(options, user_options)
32
+ # Remove code to save memory.
33
+ PhusionPassenger::ActiveSupport3Extensions.send(:remove_const, :UnionStationExtension)
34
+ PhusionPassenger.send(:remove_const, :ActiveSupport3Extensions)
35
+ end
36
+ end
37
+
38
+ class UnionStationExtension < ActiveSupport::LogSubscriber
39
+ def self.install!(options, user_options)
40
+ union_station_core = options["union_station_core"]
41
+ app_group_name = options["app_group_name"]
42
+ return false if !union_station_core || !options["analytics"]
43
+
44
+ # If the Ruby interpreter supports GC statistics then turn it on
45
+ # so that the info can be logged.
46
+ GC.enable_stats if GC.respond_to?(:enable_stats)
47
+
48
+ subscriber = self.new(user_options)
49
+ UnionStationExtension.attach_to(:action_controller, subscriber)
50
+ UnionStationExtension.attach_to(:active_record, subscriber)
51
+ if defined?(ActiveSupport::Cache::Store)
52
+ ActiveSupport::Cache::Store.instrument = true
53
+ UnionStationExtension.attach_to(:active_support, subscriber)
54
+ end
55
+ PhusionPassenger.on_event(:starting_request_handler_thread) do
56
+ if defined?(ActiveSupport::Cache::Store)
57
+ # This flag is thread-local.
58
+ ActiveSupport::Cache::Store.instrument = true
59
+ end
60
+ end
61
+
62
+ if defined?(ActionDispatch::DebugExceptions)
63
+ exceptions_middleware = ActionDispatch::DebugExceptions
64
+ elsif defined?(ActionDispatch::ShowExceptions)
65
+ exceptions_middleware = ActionDispatch::ShowExceptions
66
+ end
67
+ if exceptions_middleware
68
+ if defined?(Rails)
69
+ Rails.application.middleware.insert_after(
70
+ exceptions_middleware,
71
+ ExceptionLogger,
72
+ union_station_core,
73
+ app_group_name)
74
+ end
75
+ end
76
+
77
+ if defined?(ActionController::Base)
78
+ ActionController::Base.class_eval do
79
+ include ACExtension
80
+ end
81
+ end
82
+
83
+ if defined?(ActiveSupport::Benchmarkable)
84
+ ActiveSupport::Benchmarkable.class_eval do
85
+ include ASBenchmarkableExtension
86
+ alias_method_chain :benchmark, :passenger
87
+ end
88
+ end
89
+
90
+ return true
91
+ end
92
+
93
+ def initialize(options)
94
+ super()
95
+ install_event_preprocessor(options[:event_preprocessor]) if options[:event_preprocessor]
96
+ end
97
+
98
+ def process_action(event)
99
+ view_runtime = event.payload[:view_runtime]
100
+ if view_runtime
101
+ PhusionPassenger.log_total_view_rendering_time(nil, (view_runtime * 1000).to_i)
102
+ end
103
+ end
104
+
105
+ def sql(event)
106
+ PhusionPassenger.log_database_query(nil,
107
+ event.payload[:name] || "SQL",
108
+ event.time,
109
+ event.end,
110
+ event.payload[:sql])
111
+ end
112
+
113
+ def cache_read(event)
114
+ if event.payload[:hit]
115
+ PhusionPassenger.log_cache_hit(nil, event.payload[:key])
116
+ else
117
+ PhusionPassenger.log_cache_miss(nil, event.payload[:key])
118
+ end
119
+ end
120
+
121
+ def cache_fetch_hit(event)
122
+ PhusionPassenger.log_cache_hit(nil, event.payload[:key])
123
+ end
124
+
125
+ def cache_generate(event)
126
+ PhusionPassenger.log_cache_miss(nil, event.payload[:key],
127
+ event.duration * 1000)
128
+ end
129
+
130
+ class ExceptionLogger
131
+ def initialize(app, union_station_core, app_group_name)
132
+ @app = app
133
+ @union_station_core = union_station_core
134
+ @app_group_name = app_group_name
135
+ end
136
+
137
+ def call(env)
138
+ @app.call(env)
139
+ rescue Exception => e
140
+ log_union_station_exception(env, e) if env[PASSENGER_TXN_ID]
141
+ raise e
142
+ end
143
+
144
+ private
145
+ def log_union_station_exception(env, exception)
146
+ options = {}
147
+ request = ActionDispatch::Request.new(env)
148
+ if request.parameters['controller']
149
+ options[:controller_name] = request.parameters['controller'].humanize + "Controller"
150
+ options[:action_name] = request.parameters['action']
151
+ end
152
+ PhusionPassenger.log_request_exception(env, exception, options)
153
+ end
154
+ end
155
+
156
+ module ACExtension
157
+ def process_action(action, *args)
158
+ options = {
159
+ :controller_name => self.class.name,
160
+ :action_name => action_name,
161
+ :method => request.request_method
162
+ }
163
+ PhusionPassenger.log_controller_action(request.env, options) do
164
+ super
165
+ end
166
+ end
167
+
168
+ def render(*args)
169
+ PhusionPassenger.log_view_rendering(request.env) do
170
+ super
171
+ end
172
+ end
173
+ end
174
+
175
+ module ASBenchmarkableExtension
176
+ def benchmark_with_passenger(message = "Benchmarking", *args)
177
+ PhusionPassenger.benchmark(nil, message) do
178
+ benchmark_without_passenger(message, *args) do
179
+ yield
180
+ end
181
+ end
182
+ end
183
+ end
184
+
185
+ private
186
+ def install_event_preprocessor(event_preprocessor)
187
+ public_methods(false).each do |name|
188
+ singleton = class << self; self end
189
+ singleton.send(:define_method, name, lambda do |event|
190
+ event_preprocessor.call(event)
191
+ super(event)
192
+ end)
193
+ end
194
+ end
195
+ end # class UnionStationExtension
196
+ end # module ActiveSupport3Extensions
199
197
 
200
198
  end # module PhusionPassenger
@@ -23,26 +23,26 @@
23
23
 
24
24
  module PhusionPassenger
25
25
 
26
- module AdminTools
27
- def self.tmpdir
28
- ["PASSENGER_INSTANCE_REGISTRY_DIR", "TMPDIR"].each do |name|
29
- if ENV.has_key?(name) && !ENV[name].empty?
30
- return ENV[name]
31
- end
32
- end
33
- return "/tmp"
34
- end
26
+ module AdminTools
27
+ def self.tmpdir
28
+ ["PASSENGER_INSTANCE_REGISTRY_DIR", "TMPDIR"].each do |name|
29
+ if ENV.has_key?(name) && !ENV[name].empty?
30
+ return ENV[name]
31
+ end
32
+ end
33
+ return "/tmp"
34
+ end
35
35
 
36
- def self.process_is_alive?(pid)
37
- begin
38
- Process.kill(0, pid)
39
- return true
40
- rescue Errno::ESRCH
41
- return false
42
- rescue SystemCallError => e
43
- return true
44
- end
45
- end
46
- end # module AdminTools
36
+ def self.process_is_alive?(pid)
37
+ begin
38
+ Process.kill(0, pid)
39
+ return true
40
+ rescue Errno::ESRCH
41
+ return false
42
+ rescue SystemCallError => e
43
+ return true
44
+ end
45
+ end
46
+ end # module AdminTools
47
47
 
48
48
  end # module PhusionPassenger
@@ -26,182 +26,182 @@ PhusionPassenger.require_passenger_lib 'constants'
26
26
  PhusionPassenger.require_passenger_lib 'utils/json'
27
27
 
28
28
  module PhusionPassenger
29
- module AdminTools
30
-
31
- class Instance
32
- STALE_TIMEOUT = 60
33
-
34
- attr_reader :path, :state, :name, :server_software, :properties
35
-
36
- def initialize(path)
37
- @path = path
38
- # Possible states:
39
- #
40
- # * :good - Everything is good. But the Watchdog process that created
41
- # it might have died. In that case, the directory should be cleaned up.
42
- # Use `locked?` to check.
43
- #
44
- # * :not_finalized - The instance directory hasn't been finalized yet,
45
- # so we can't read any information from it. It is possible that the
46
- # process that has created it has died, i.e. that it will never
47
- # become finalized. In that case, the directory should be cleaned up.
48
- # Use `stale?` to check.
49
- #
50
- # * :structure_version_unsupported - The properties file advertised a
51
- # structure version that we don't support. We can't read any
52
- # information from it.
53
- #
54
- # * :corrupted - The instance directory is corrupted in some way.
55
- @state = nil
56
-
57
- reload_properties
58
- end
59
-
60
- def locked?
61
- if defined?(File::LOCK_EX)
62
- return !File.open("#{@path}/lock", "r") do |f|
63
- f.flock(File::LOCK_EX | File::LOCK_NB)
64
- end
65
- else
66
- # Solaris :-(
67
- # Since using fcntl locks in Ruby is a huge pain,
68
- # we'll fallback to checking the watchdog PID.
69
- return watchdog_alive?
70
- end
71
- end
72
-
73
- def stale?
74
- stat = File.stat(@path)
75
- if stat.mtime < Time.now - STALE_TIMEOUT
76
- return !locked?
77
- else
78
- return false
79
- end
80
- end
81
-
82
- def watchdog_alive?
83
- return process_is_alive?(@watchdog_pid)
84
- end
85
-
86
- def http_request(socket_path, request)
87
- sock = Net::BufferedIO.new(UNIXSocket.new("#{@path}/#{socket_path}"))
88
- begin
89
- request.exec(sock, "1.1", request.path)
90
-
91
- done = false
92
- while !done
93
- response = Net::HTTPResponse.read_new(sock)
94
- done = !response.kind_of?(Net::HTTPContinue)
95
- end
96
-
97
- response.reading_body(sock, request.response_body_permitted?) do
98
- # Nothing
99
- end
100
- ensure
101
- sock.close
102
- end
103
-
104
- return response
105
- end
106
-
107
- def server_pid
108
- @server_pid ||= File.read("#{@path}/server.pid").to_i
109
- end
110
-
111
- def full_admin_password
112
- @full_admin_password ||= File.read("#{@path}/full_admin_password.txt")
113
- end
114
-
115
- def read_only_admin_password
116
- @read_only_admin_password ||= File.read("#{@path}/read_only_admin_password.txt")
117
- end
118
-
119
- private
120
- class CorruptedError < StandardError
121
- end
122
-
123
- def reload_properties
124
- @properties = nil
125
- @state = nil
126
- begin
127
- reload_properties_internal
128
- rescue CorruptedError
129
- @state = :corrupted
130
- end
131
- end
132
-
133
- def reload_properties_internal
134
- if !File.exist?("#{@path}/creation_finalized")
135
- @state = :unfinalized
136
- return
137
- end
138
- check(File.file?("#{@path}/creation_finalized"))
139
-
140
- properties = nil
141
- begin
142
- File.open("#{@path}/properties.json", "r") do |f|
143
- properties = Utils::JSON.parse(f.read)
144
- end
145
- rescue Errno::ENOENT
146
- raise CorruptedError
147
- rescue RuntimeError => e
148
- if e.message =~ /parse error/
149
- raise CorruptedError
150
- else
151
- raise
152
- end
153
- end
154
-
155
- check(!properties.nil?)
156
- props = properties["instance_dir"]
157
- check(!props.nil?)
158
- major_version = props["major_version"]
159
- minor_version = props["minor_version"]
160
- check(major_version.is_a?(Integer))
161
- check(minor_version.is_a?(Integer))
162
- name = properties["name"]
163
- check(name.is_a?(String))
164
- check(!name.empty?)
165
- server_software = properties["server_software"]
166
- check(server_software.is_a?(String))
167
- check(!server_software.empty?)
168
- watchdog_pid = properties["watchdog_pid"]
169
- check(watchdog_pid.is_a?(Integer))
170
-
171
- version_supported =
172
- major_version == PhusionPassenger::SERVER_INSTANCE_DIR_STRUCTURE_MAJOR_VERSION &&
173
- minor_version <= PhusionPassenger::SERVER_INSTANCE_DIR_STRUCTURE_MINOR_VERSION
174
- if !version_supported
175
- @state = :structure_version_unsupported
176
- return
177
- end
178
-
179
- check(File.file?("#{@path}/lock"))
180
- check(File.directory?("#{@path}/agents.s"))
181
- check(File.directory?("#{@path}/apps.s"))
182
-
183
- @properties = properties
184
- @name = name
185
- @server_software = server_software
186
- @watchdog_pid = watchdog_pid
187
- @state = :good
188
- end
189
-
190
- def check(val)
191
- raise CorruptedError if !val
192
- end
193
-
194
- def process_is_alive?(pid)
195
- begin
196
- Process.kill(0, pid)
197
- return true
198
- rescue Errno::ESRCH
199
- return false
200
- rescue SystemCallError => e
201
- return true
202
- end
203
- end
204
- end
205
-
206
- end # module AdminTools
29
+ module AdminTools
30
+
31
+ class Instance
32
+ STALE_TIMEOUT = 60
33
+
34
+ attr_reader :path, :state, :name, :server_software, :properties
35
+
36
+ def initialize(path)
37
+ @path = path
38
+ # Possible states:
39
+ #
40
+ # * :good - Everything is good. But the Watchdog process that created
41
+ # it might have died. In that case, the directory should be cleaned up.
42
+ # Use `locked?` to check.
43
+ #
44
+ # * :not_finalized - The instance directory hasn't been finalized yet,
45
+ # so we can't read any information from it. It is possible that the
46
+ # process that has created it has died, i.e. that it will never
47
+ # become finalized. In that case, the directory should be cleaned up.
48
+ # Use `stale?` to check.
49
+ #
50
+ # * :structure_version_unsupported - The properties file advertised a
51
+ # structure version that we don't support. We can't read any
52
+ # information from it.
53
+ #
54
+ # * :corrupted - The instance directory is corrupted in some way.
55
+ @state = nil
56
+
57
+ reload_properties
58
+ end
59
+
60
+ def locked?
61
+ if defined?(File::LOCK_EX)
62
+ return !File.open("#{@path}/lock", "r") do |f|
63
+ f.flock(File::LOCK_EX | File::LOCK_NB)
64
+ end
65
+ else
66
+ # Solaris :-(
67
+ # Since using fcntl locks in Ruby is a huge pain,
68
+ # we'll fallback to checking the watchdog PID.
69
+ return watchdog_alive?
70
+ end
71
+ end
72
+
73
+ def stale?
74
+ stat = File.stat(@path)
75
+ if stat.mtime < Time.now - STALE_TIMEOUT
76
+ return !locked?
77
+ else
78
+ return false
79
+ end
80
+ end
81
+
82
+ def watchdog_alive?
83
+ return process_is_alive?(@watchdog_pid)
84
+ end
85
+
86
+ def http_request(socket_path, request)
87
+ sock = Net::BufferedIO.new(UNIXSocket.new("#{@path}/#{socket_path}"))
88
+ begin
89
+ request.exec(sock, "1.1", request.path)
90
+
91
+ done = false
92
+ while !done
93
+ response = Net::HTTPResponse.read_new(sock)
94
+ done = !response.kind_of?(Net::HTTPContinue)
95
+ end
96
+
97
+ response.reading_body(sock, request.response_body_permitted?) do
98
+ # Nothing
99
+ end
100
+ ensure
101
+ sock.close
102
+ end
103
+
104
+ return response
105
+ end
106
+
107
+ def server_pid
108
+ @server_pid ||= File.read("#{@path}/server.pid").to_i
109
+ end
110
+
111
+ def full_admin_password
112
+ @full_admin_password ||= File.read("#{@path}/full_admin_password.txt")
113
+ end
114
+
115
+ def read_only_admin_password
116
+ @read_only_admin_password ||= File.read("#{@path}/read_only_admin_password.txt")
117
+ end
118
+
119
+ private
120
+ class CorruptedError < StandardError
121
+ end
122
+
123
+ def reload_properties
124
+ @properties = nil
125
+ @state = nil
126
+ begin
127
+ reload_properties_internal
128
+ rescue CorruptedError
129
+ @state = :corrupted
130
+ end
131
+ end
132
+
133
+ def reload_properties_internal
134
+ if !File.exist?("#{@path}/creation_finalized")
135
+ @state = :unfinalized
136
+ return
137
+ end
138
+ check(File.file?("#{@path}/creation_finalized"))
139
+
140
+ properties = nil
141
+ begin
142
+ File.open("#{@path}/properties.json", "r") do |f|
143
+ properties = Utils::JSON.parse(f.read)
144
+ end
145
+ rescue Errno::ENOENT
146
+ raise CorruptedError
147
+ rescue RuntimeError => e
148
+ if e.message =~ /parse error/
149
+ raise CorruptedError
150
+ else
151
+ raise
152
+ end
153
+ end
154
+
155
+ check(!properties.nil?)
156
+ props = properties["instance_dir"]
157
+ check(!props.nil?)
158
+ major_version = props["major_version"]
159
+ minor_version = props["minor_version"]
160
+ check(major_version.is_a?(Integer))
161
+ check(minor_version.is_a?(Integer))
162
+ name = properties["name"]
163
+ check(name.is_a?(String))
164
+ check(!name.empty?)
165
+ server_software = properties["server_software"]
166
+ check(server_software.is_a?(String))
167
+ check(!server_software.empty?)
168
+ watchdog_pid = properties["watchdog_pid"]
169
+ check(watchdog_pid.is_a?(Integer))
170
+
171
+ version_supported =
172
+ major_version == PhusionPassenger::SERVER_INSTANCE_DIR_STRUCTURE_MAJOR_VERSION &&
173
+ minor_version <= PhusionPassenger::SERVER_INSTANCE_DIR_STRUCTURE_MINOR_VERSION
174
+ if !version_supported
175
+ @state = :structure_version_unsupported
176
+ return
177
+ end
178
+
179
+ check(File.file?("#{@path}/lock"))
180
+ check(File.directory?("#{@path}/agents.s"))
181
+ check(File.directory?("#{@path}/apps.s"))
182
+
183
+ @properties = properties
184
+ @name = name
185
+ @server_software = server_software
186
+ @watchdog_pid = watchdog_pid
187
+ @state = :good
188
+ end
189
+
190
+ def check(val)
191
+ raise CorruptedError if !val
192
+ end
193
+
194
+ def process_is_alive?(pid)
195
+ begin
196
+ Process.kill(0, pid)
197
+ return true
198
+ rescue Errno::ESRCH
199
+ return false
200
+ rescue SystemCallError => e
201
+ return true
202
+ end
203
+ end
204
+ end
205
+
206
+ end # module AdminTools
207
207
  end # module PhusionPassenger