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.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.editorconfig +11 -5
- data/CHANGELOG +38 -0
- data/CONTRIBUTING.md +1 -4
- data/Gemfile +0 -1
- data/Gemfile.lock +0 -2
- data/Rakefile +33 -33
- data/bin/passenger +1 -1
- data/bin/passenger-config +1 -1
- data/bin/passenger-install-apache2-module +800 -800
- data/bin/passenger-install-nginx-module +592 -592
- data/bin/passenger-memory-stats +127 -127
- data/bin/passenger-status +216 -216
- data/build/agents.rb +127 -127
- data/build/apache2.rb +87 -87
- data/build/basics.rb +60 -60
- data/build/common_library.rb +165 -165
- data/build/cplusplus_support.rb +51 -51
- data/build/cxx_tests.rb +268 -268
- data/build/debian.rb +143 -143
- data/build/documentation.rb +58 -58
- data/build/integration_tests.rb +81 -81
- data/build/misc.rb +132 -132
- data/build/nginx.rb +20 -20
- data/build/node_tests.rb +7 -7
- data/build/oxt_tests.rb +14 -14
- data/build/packaging.rb +570 -570
- data/build/preprocessor.rb +260 -260
- data/build/rake_extensions.rb +71 -71
- data/build/ruby_extension.rb +29 -29
- data/build/ruby_tests.rb +6 -6
- data/build/test_basics.rb +37 -37
- data/debian.template/control.template +3 -5
- data/dev/copy_boost_headers +134 -134
- data/dev/install_scripts_bootstrap_code.rb +25 -25
- data/dev/list_tests +20 -20
- data/dev/ruby_server.rb +223 -223
- data/dev/runner +18 -18
- data/doc/ServerOptimizationGuide.txt.md +55 -2
- data/doc/Users guide Nginx.txt +0 -26
- data/doc/Users guide Standalone.txt +5 -1
- data/doc/users_guide_snippets/tips.txt +9 -0
- data/ext/common/ApplicationPool2/Group.h +23 -11
- data/ext/common/ApplicationPool2/Implementation.cpp +32 -7
- data/ext/common/ApplicationPool2/Pool.h +22 -17
- data/ext/common/ApplicationPool2/SmartSpawner.h +4 -1
- data/ext/common/ApplicationPool2/Spawner.h +1 -1
- data/ext/common/Constants.h +1 -1
- data/ext/common/agents/Base.cpp +35 -20
- data/ext/common/agents/HelperAgent/Main.cpp +8 -1
- data/ext/common/agents/HelperAgent/OptionParser.h +18 -4
- data/ext/common/agents/HelperAgent/RequestHandler.h +2 -83
- data/ext/common/agents/HelperAgent/RequestHandler/ForwardResponse.cpp +54 -1
- data/ext/common/agents/HelperAgent/RequestHandler/InitRequest.cpp +7 -4
- data/ext/common/agents/Main.cpp +1 -1
- data/ext/common/agents/Watchdog/Main.cpp +54 -19
- data/ext/nginx/Configuration.c +7 -0
- data/ext/nginx/ContentHandler.c +9 -1
- data/helper-scripts/backtrace-sanitizer.rb +106 -87
- data/helper-scripts/crash-watch.rb +32 -0
- data/helper-scripts/download_binaries/extconf.rb +38 -38
- data/helper-scripts/meteor-loader.rb +107 -107
- data/helper-scripts/prespawn +101 -101
- data/helper-scripts/rack-loader.rb +96 -96
- data/helper-scripts/rack-preloader.rb +137 -137
- data/lib/phusion_passenger.rb +292 -292
- data/lib/phusion_passenger/abstract_installer.rb +438 -438
- data/lib/phusion_passenger/active_support3_extensions/init.rb +168 -170
- data/lib/phusion_passenger/admin_tools.rb +20 -20
- data/lib/phusion_passenger/admin_tools/instance.rb +178 -178
- data/lib/phusion_passenger/admin_tools/instance_registry.rb +61 -61
- data/lib/phusion_passenger/admin_tools/memory_stats.rb +267 -267
- data/lib/phusion_passenger/apache2/config_options.rb +182 -182
- data/lib/phusion_passenger/common_library.rb +479 -485
- data/lib/phusion_passenger/config/about_command.rb +161 -161
- data/lib/phusion_passenger/config/admin_command_command.rb +129 -129
- data/lib/phusion_passenger/config/agent_compiler.rb +121 -121
- data/lib/phusion_passenger/config/build_native_support_command.rb +43 -43
- data/lib/phusion_passenger/config/command.rb +25 -25
- data/lib/phusion_passenger/config/compile_agent_command.rb +62 -62
- data/lib/phusion_passenger/config/compile_nginx_engine_command.rb +88 -73
- data/lib/phusion_passenger/config/detach_process_command.rb +72 -72
- data/lib/phusion_passenger/config/download_agent_command.rb +246 -227
- data/lib/phusion_passenger/config/download_nginx_engine_command.rb +245 -224
- data/lib/phusion_passenger/config/install_agent_command.rb +144 -132
- data/lib/phusion_passenger/config/install_standalone_runtime_command.rb +205 -185
- data/lib/phusion_passenger/config/installation_utils.rb +204 -204
- data/lib/phusion_passenger/config/list_instances_command.rb +64 -64
- data/lib/phusion_passenger/config/main.rb +152 -152
- data/lib/phusion_passenger/config/nginx_engine_compiler.rb +319 -300
- data/lib/phusion_passenger/config/reopen_logs_command.rb +67 -67
- data/lib/phusion_passenger/config/restart_app_command.rb +155 -155
- data/lib/phusion_passenger/config/system_metrics_command.rb +13 -13
- data/lib/phusion_passenger/config/utils.rb +95 -95
- data/lib/phusion_passenger/config/validate_install_command.rb +198 -198
- data/lib/phusion_passenger/console_text_template.rb +25 -25
- data/lib/phusion_passenger/constants.rb +90 -90
- data/lib/phusion_passenger/debug_logging.rb +106 -106
- data/lib/phusion_passenger/loader_shared_helpers.rb +447 -432
- data/lib/phusion_passenger/message_channel.rb +312 -312
- data/lib/phusion_passenger/message_client.rb +176 -176
- data/lib/phusion_passenger/native_support.rb +369 -369
- data/lib/phusion_passenger/nginx/config_options.rb +297 -297
- data/lib/phusion_passenger/packaging.rb +131 -131
- data/lib/phusion_passenger/platform_info.rb +360 -360
- data/lib/phusion_passenger/platform_info/apache.rb +767 -767
- data/lib/phusion_passenger/platform_info/apache_detector.rb +199 -199
- data/lib/phusion_passenger/platform_info/binary_compatibility.rb +107 -107
- data/lib/phusion_passenger/platform_info/compiler.rb +570 -570
- data/lib/phusion_passenger/platform_info/curl.rb +32 -32
- data/lib/phusion_passenger/platform_info/cxx_portability.rb +188 -188
- data/lib/phusion_passenger/platform_info/depcheck.rb +372 -372
- data/lib/phusion_passenger/platform_info/depcheck_specs/apache2.rb +109 -109
- data/lib/phusion_passenger/platform_info/depcheck_specs/compiler_toolchain.rb +4 -4
- data/lib/phusion_passenger/platform_info/depcheck_specs/gems.rb +10 -34
- data/lib/phusion_passenger/platform_info/depcheck_specs/libs.rb +101 -101
- data/lib/phusion_passenger/platform_info/depcheck_specs/ruby.rb +5 -5
- data/lib/phusion_passenger/platform_info/depcheck_specs/utilities.rb +13 -13
- data/lib/phusion_passenger/platform_info/linux.rb +55 -55
- data/lib/phusion_passenger/platform_info/operating_system.rb +149 -149
- data/lib/phusion_passenger/platform_info/ruby.rb +468 -448
- data/lib/phusion_passenger/platform_info/zlib.rb +9 -9
- data/lib/phusion_passenger/plugin.rb +66 -66
- data/lib/phusion_passenger/preloader_shared_helpers.rb +126 -126
- data/lib/phusion_passenger/public_api.rb +191 -191
- data/lib/phusion_passenger/rack/out_of_band_gc.rb +93 -94
- data/lib/phusion_passenger/rack/thread_handler_extension.rb +231 -227
- data/lib/phusion_passenger/request_handler.rb +567 -577
- data/lib/phusion_passenger/request_handler/thread_handler.rb +379 -381
- data/lib/phusion_passenger/ruby_core_enhancements.rb +86 -86
- data/lib/phusion_passenger/ruby_core_io_enhancements.rb +74 -74
- data/lib/phusion_passenger/simple_benchmarking.rb +25 -25
- data/lib/phusion_passenger/standalone/app_finder.rb +153 -150
- data/lib/phusion_passenger/standalone/command.rb +44 -40
- data/lib/phusion_passenger/standalone/config_utils.rb +53 -53
- data/lib/phusion_passenger/standalone/control_utils.rb +38 -59
- data/lib/phusion_passenger/standalone/main.rb +73 -73
- data/lib/phusion_passenger/standalone/start_command.rb +697 -685
- data/lib/phusion_passenger/standalone/start_command/builtin_engine.rb +193 -155
- data/lib/phusion_passenger/standalone/start_command/nginx_engine.rb +162 -133
- data/lib/phusion_passenger/standalone/status_command.rb +64 -64
- data/lib/phusion_passenger/standalone/stop_command.rb +72 -72
- data/lib/phusion_passenger/standalone/version_command.rb +9 -9
- data/lib/phusion_passenger/union_station/connection.rb +32 -32
- data/lib/phusion_passenger/union_station/core.rb +251 -251
- data/lib/phusion_passenger/union_station/transaction.rb +126 -126
- data/lib/phusion_passenger/utils.rb +199 -167
- data/lib/phusion_passenger/utils/ansi_colors.rb +128 -128
- data/lib/phusion_passenger/utils/download.rb +196 -196
- data/lib/phusion_passenger/utils/file_system_watcher.rb +158 -158
- data/lib/phusion_passenger/utils/hosts_file_parser.rb +101 -101
- data/lib/phusion_passenger/utils/lock.rb +31 -31
- data/lib/phusion_passenger/utils/native_support_utils.rb +31 -31
- data/lib/phusion_passenger/utils/progress_bar.rb +26 -26
- data/lib/phusion_passenger/utils/shellwords.rb +20 -20
- data/lib/phusion_passenger/utils/terminal_choice_menu.rb +206 -206
- data/lib/phusion_passenger/utils/unseekable_socket.rb +272 -272
- data/lib/phusion_passenger/vendor/crash_watch/app.rb +129 -0
- data/lib/phusion_passenger/vendor/crash_watch/gdb_controller.rb +341 -0
- data/lib/phusion_passenger/vendor/crash_watch/version.rb +24 -0
- data/lib/phusion_passenger/vendor/daemon_controller.rb +877 -0
- data/lib/phusion_passenger/vendor/daemon_controller/lock_file.rb +127 -0
- data/lib/phusion_passenger/vendor/daemon_controller/spawn.rb +26 -0
- data/lib/phusion_passenger/vendor/daemon_controller/version.rb +29 -0
- data/packaging/rpm/passenger_spec/passenger.spec.template +0 -1
- data/passenger.gemspec +0 -1
- data/resources/templates/config/nginx_engine_compiler/possible_solutions_for_download_and_extraction_problems.txt.erb +27 -0
- data/resources/templates/standalone/config.erb +19 -15
- data/test/integration_tests/apache2_tests.rb +566 -566
- data/test/integration_tests/downloaded_binaries_tests.rb +126 -125
- data/test/integration_tests/native_packaging_spec.rb +296 -296
- data/test/integration_tests/nginx_tests.rb +393 -393
- data/test/integration_tests/shared/example_webapp_tests.rb +282 -280
- data/test/integration_tests/source_packaging_test.rb +138 -138
- data/test/integration_tests/spec_helper.rb +5 -5
- data/test/integration_tests/standalone_tests.rb +367 -367
- data/test/ruby/debug_logging_spec.rb +133 -133
- data/test/ruby/message_channel_spec.rb +186 -186
- data/test/ruby/rack/loader_spec.rb +28 -28
- data/test/ruby/rack/preloader_spec.rb +34 -34
- data/test/ruby/rails3.0/loader_spec.rb +12 -12
- data/test/ruby/rails3.0/preloader_spec.rb +18 -18
- data/test/ruby/rails3.1/loader_spec.rb +12 -12
- data/test/ruby/rails3.1/preloader_spec.rb +18 -18
- data/test/ruby/rails3.2/loader_spec.rb +12 -12
- data/test/ruby/rails3.2/preloader_spec.rb +18 -18
- data/test/ruby/rails4.0/loader_spec.rb +12 -12
- data/test/ruby/rails4.0/preloader_spec.rb +18 -18
- data/test/ruby/rails4.1/loader_spec.rb +12 -12
- data/test/ruby/rails4.1/preloader_spec.rb +18 -18
- data/test/ruby/request_handler_spec.rb +730 -730
- data/test/ruby/shared/loader_sharedspec.rb +224 -224
- data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +327 -327
- data/test/ruby/shared/ruby_loader_sharedspec.rb +47 -47
- data/test/ruby/spec_helper.rb +65 -65
- data/test/ruby/standalone/runtime_installer_spec.rb +384 -384
- data/test/ruby/union_station_spec.rb +276 -276
- data/test/ruby/utils/file_system_watcher_spec.rb +220 -220
- data/test/ruby/utils/hosts_file_parser.rb +248 -248
- data/test/ruby/utils/tee_input_spec.rb +215 -215
- data/test/ruby/utils/unseekable_socket_spec.rb +57 -57
- data/test/ruby/utils_spec.rb +21 -21
- data/test/stub/rack/config.ru +87 -87
- data/test/stub/rack/library.rb +8 -8
- data/test/stub/rack/start.rb +30 -30
- data/test/support/apache2_controller.rb +191 -191
- data/test/support/nginx_controller.rb +90 -99
- data/test/support/placebo-preloader.rb +57 -57
- data/test/support/test_helper.rb +435 -435
- metadata +11 -21
- metadata.gz.asc +7 -7
- data/lib/phusion_passenger/standalone/command2.rb +0 -292
- data/lib/phusion_passenger/standalone/start2_command.rb +0 -799
- data/resources/templates/standalone/download_tool_missing.txt.erb +0 -18
- data/resources/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -17
- data/resources/templates/standalone/run_installer_as_root.txt.erb +0 -8
@@ -23,113 +23,113 @@
|
|
23
23
|
# THE SOFTWARE.
|
24
24
|
|
25
25
|
begin
|
26
|
-
|
26
|
+
require 'rubygems'
|
27
27
|
rescue LoadError
|
28
28
|
end
|
29
29
|
require 'socket'
|
30
30
|
require 'thread'
|
31
31
|
if (!defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby") && RUBY_VERSION < "1.8.7"
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
32
|
+
begin
|
33
|
+
require 'fastthread'
|
34
|
+
rescue LoadError
|
35
|
+
abort "You are using a very old Ruby version. You must install " +
|
36
|
+
"the 'fastthread' gem to fix some bugs in the Ruby threading system: " +
|
37
|
+
"gem install fastthread"
|
38
|
+
end
|
39
39
|
end
|
40
40
|
|
41
41
|
class Exception
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
42
|
+
def backtrace_string(current_location = nil)
|
43
|
+
if current_location.nil?
|
44
|
+
location = nil
|
45
|
+
else
|
46
|
+
location = "in #{current_location} "
|
47
|
+
end
|
48
|
+
current_thread = Thread.current
|
49
|
+
if !(thread_id = current_thread[:id])
|
50
|
+
current_thread.to_s =~ /:(0x[0-9a-f]+)/i
|
51
|
+
thread_id = $1 || '?'
|
52
|
+
end
|
53
|
+
if thread_name = current_thread[:name]
|
54
|
+
thread_name = "(#{thread_name})"
|
55
|
+
end
|
56
|
+
return "*** Exception #{self.class} #{location}" <<
|
57
|
+
"(#{self}) (process #{$$}, thread #{thread_id}#{thread_name}):\n" <<
|
58
|
+
"\tfrom " << backtrace.join("\n\tfrom ")
|
59
|
+
end
|
60
60
|
end
|
61
61
|
|
62
62
|
class Dir
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
63
|
+
# Dir.pwd resolves symlinks. This version tries not to, by shelling
|
64
|
+
# out to the pwd tool.
|
65
|
+
def self.pwd_no_resolve
|
66
|
+
begin
|
67
|
+
result = `pwd`.strip
|
68
|
+
rescue Errno::ENOENT
|
69
|
+
result = `/bin/pwd`.strip
|
70
|
+
end
|
71
|
+
if result.empty?
|
72
|
+
return Dir.pwd
|
73
|
+
else
|
74
|
+
return result
|
75
|
+
end
|
76
|
+
end
|
77
77
|
end
|
78
78
|
|
79
79
|
class File
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
80
|
+
# Dir.pwd resolves symlinks. So in turn, File.expand_path/File.absolute_path
|
81
|
+
# do that too. This method fixes that by using Dir.pwd_no_resolve.
|
82
|
+
if File.respond_to?(:absolute_path)
|
83
|
+
def self.absolute_path_no_resolve(path)
|
84
|
+
return File.absolute_path(path, Dir.pwd_no_resolve)
|
85
|
+
end
|
86
|
+
else
|
87
|
+
def self.absolute_path_no_resolve(path)
|
88
|
+
return File.expand_path(path, Dir.pwd_no_resolve)
|
89
|
+
end
|
90
|
+
end
|
91
91
|
end
|
92
92
|
|
93
93
|
module Signal
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
94
|
+
# Like Signal.list, but only returns signals that we can actually trap.
|
95
|
+
def self.list_trappable
|
96
|
+
ruby_engine = defined?(RUBY_ENGINE) ? RUBY_ENGINE : "ruby"
|
97
|
+
case ruby_engine
|
98
|
+
when "jruby"
|
99
|
+
result = Signal.list.dup
|
100
|
+
result.delete("QUIT")
|
101
|
+
result.delete("ILL")
|
102
|
+
result.delete("FPE")
|
103
|
+
result.delete("SEGV")
|
104
|
+
result.delete("USR1")
|
105
|
+
result.delete("IOT")
|
106
|
+
result.delete("EXIT")
|
107
|
+
else
|
108
|
+
result = Signal.list.dup
|
109
|
+
result.delete("ALRM")
|
110
|
+
result.delete("VTALRM")
|
111
|
+
end
|
112
112
|
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
113
|
+
# Don't touch SIGCHLD no matter what! On OS X waitpid() will
|
114
|
+
# malfunction if SIGCHLD doesn't have a correct handler.
|
115
|
+
result.delete("CLD")
|
116
|
+
result.delete("CHLD")
|
117
117
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
118
|
+
# Other stuff that we don't want to trap no matter which
|
119
|
+
# Ruby engine.
|
120
|
+
result.delete("STOP")
|
121
|
+
result.delete("KILL")
|
122
122
|
|
123
|
-
|
124
|
-
|
123
|
+
return result
|
124
|
+
end
|
125
125
|
end
|
126
126
|
|
127
127
|
module GC
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
128
|
+
if !respond_to?(:copy_on_write_friendly?)
|
129
|
+
# Checks whether the current Ruby interpreter's garbage
|
130
|
+
# collector is copy-on-write friendly.
|
131
|
+
def self.copy_on_write_friendly?
|
132
|
+
return false
|
133
|
+
end
|
134
|
+
end
|
135
135
|
end
|
@@ -25,84 +25,84 @@
|
|
25
25
|
PhusionPassenger.require_passenger_lib 'native_support'
|
26
26
|
|
27
27
|
class IO
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
28
|
+
if defined?(PhusionPassenger::NativeSupport)
|
29
|
+
# Writes all of the strings in the +components+ array into the given file
|
30
|
+
# descriptor using the +writev()+ system call. Unlike IO#write, this method
|
31
|
+
# does not require one to concatenate all those strings into a single buffer
|
32
|
+
# in order to send the data in a single system call. Thus, #writev is a great
|
33
|
+
# way to perform zero-copy I/O.
|
34
|
+
#
|
35
|
+
# Unlike the raw writev() system call, this method ensures that all given
|
36
|
+
# data is written before returning, by performing multiple writev() calls
|
37
|
+
# and whatever else is necessary.
|
38
|
+
#
|
39
|
+
# io.writev(["hello ", "world", "\n"])
|
40
|
+
def writev(components)
|
41
|
+
return PhusionPassenger::NativeSupport.writev(fileno, components)
|
42
|
+
end
|
43
43
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
44
|
+
# Like #writev, but accepts two arrays. The data is written in the given order.
|
45
|
+
#
|
46
|
+
# io.writev2(["hello ", "world", "\n"], ["another ", "message\n"])
|
47
|
+
def writev2(components, components2)
|
48
|
+
return PhusionPassenger::NativeSupport.writev2(fileno,
|
49
|
+
components, components2)
|
50
|
+
end
|
51
51
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
52
|
+
# Like #writev, but accepts three arrays. The data is written in the given order.
|
53
|
+
#
|
54
|
+
# io.writev3(["hello ", "world", "\n"],
|
55
|
+
# ["another ", "message\n"],
|
56
|
+
# ["yet ", "another ", "one", "\n"])
|
57
|
+
def writev3(components, components2, components3)
|
58
|
+
return PhusionPassenger::NativeSupport.writev3(fileno,
|
59
|
+
components, components2, components3)
|
60
|
+
end
|
61
|
+
else
|
62
|
+
def writev(components)
|
63
|
+
return write(components.join(''))
|
64
|
+
end
|
65
65
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
66
|
+
def writev2(components, components2)
|
67
|
+
data = ''
|
68
|
+
components.each do |component|
|
69
|
+
data << component
|
70
|
+
end
|
71
|
+
components2.each do |component|
|
72
|
+
data << component
|
73
|
+
end
|
74
|
+
return write(data)
|
75
|
+
end
|
76
76
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
77
|
+
def writev3(components, components2, components3)
|
78
|
+
data = ''
|
79
|
+
components.each do |component|
|
80
|
+
data << component
|
81
|
+
end
|
82
|
+
components2.each do |component|
|
83
|
+
data << component
|
84
|
+
end
|
85
|
+
components3.each do |component|
|
86
|
+
data << component
|
87
|
+
end
|
88
|
+
return write(data)
|
89
|
+
end
|
90
|
+
end
|
91
91
|
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
92
|
+
if IO.method_defined?(:close_on_exec=)
|
93
|
+
def close_on_exec!
|
94
|
+
self.close_on_exec = true
|
95
|
+
end
|
96
|
+
else
|
97
|
+
require 'fcntl'
|
98
98
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
99
|
+
if defined?(Fcntl::F_SETFD)
|
100
|
+
def close_on_exec!
|
101
|
+
fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
|
102
|
+
end
|
103
|
+
else
|
104
|
+
def close_on_exec!
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
108
|
end
|
@@ -22,31 +22,31 @@
|
|
22
22
|
# THE SOFTWARE.
|
23
23
|
|
24
24
|
class Object # :nodoc:
|
25
|
-
|
25
|
+
@@benchmark_results = {}
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
27
|
+
def b!(name)
|
28
|
+
time1 = Time.now
|
29
|
+
begin
|
30
|
+
yield
|
31
|
+
ensure
|
32
|
+
time2 = Time.now
|
33
|
+
@@benchmark_results[name] = 0 unless @@benchmark_results.has_key?(name)
|
34
|
+
@@benchmark_results[name] += time2 - time1
|
35
|
+
end
|
36
|
+
end
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
38
|
+
def benchmark_report(main = nil)
|
39
|
+
total = 0
|
40
|
+
if main.nil?
|
41
|
+
@@benchmark_results.each_value do |time|
|
42
|
+
total += time
|
43
|
+
end
|
44
|
+
else
|
45
|
+
total = @@benchmark_results[main]
|
46
|
+
end
|
47
|
+
@@benchmark_results.each_pair do |name, time|
|
48
|
+
printf "%-12s: %.4f (%.2f%%)\n", name, time, time / total * 100
|
49
|
+
end
|
50
|
+
printf "-- Total: %.4f\n", total
|
51
|
+
end
|
52
52
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Phusion Passenger - https://www.phusionpassenger.com/
|
2
|
-
# Copyright (c) 2010-
|
2
|
+
# Copyright (c) 2010-2015 Phusion
|
3
3
|
#
|
4
4
|
# "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
5
5
|
#
|
@@ -26,153 +26,156 @@ PhusionPassenger.require_passenger_lib 'standalone/config_utils'
|
|
26
26
|
PhusionPassenger.require_passenger_lib 'utils/file_system_watcher'
|
27
27
|
|
28
28
|
module PhusionPassenger
|
29
|
-
module Standalone
|
30
|
-
|
31
|
-
class AppFinder
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
end
|
176
|
-
|
177
|
-
|
29
|
+
module Standalone
|
30
|
+
|
31
|
+
class AppFinder
|
32
|
+
STARTUP_FILES = [
|
33
|
+
"config.ru",
|
34
|
+
"passenger_wsgi.py",
|
35
|
+
"app.js",
|
36
|
+
".meteor"
|
37
|
+
]
|
38
|
+
WATCH_ENTRIES = [
|
39
|
+
"config", "Passengerfile.json", "passenger-standalone.json"
|
40
|
+
]
|
41
|
+
|
42
|
+
attr_accessor :dirs
|
43
|
+
attr_reader :apps
|
44
|
+
attr_reader :execution_root
|
45
|
+
|
46
|
+
def self.looks_like_app_directory?(dir, options = {})
|
47
|
+
options = options.dup
|
48
|
+
ConfigUtils.load_local_config_file!(dir, options)
|
49
|
+
return options[:app_type] ||
|
50
|
+
STARTUP_FILES.any? do |file|
|
51
|
+
File.exist?("#{dir}/#{file}")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def initialize(dirs, options = {})
|
56
|
+
@dirs = dirs
|
57
|
+
@options = options.dup
|
58
|
+
determine_mode_and_execution_root(options)
|
59
|
+
end
|
60
|
+
|
61
|
+
def scan
|
62
|
+
apps = []
|
63
|
+
watchlist = []
|
64
|
+
|
65
|
+
if single_mode?
|
66
|
+
app_root = find_app_root
|
67
|
+
apps << {
|
68
|
+
:server_names => ["_"],
|
69
|
+
:root => app_root
|
70
|
+
}
|
71
|
+
watchlist << app_root
|
72
|
+
WATCH_ENTRIES.each do |entry|
|
73
|
+
if File.exist?("#{app_root}/#{entry}")
|
74
|
+
watchlist << "#{app_root}/#{entry}"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
apps.map! do |app|
|
79
|
+
@options.merge(app)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
@apps = apps
|
84
|
+
@watchlist = watchlist
|
85
|
+
return apps
|
86
|
+
end
|
87
|
+
|
88
|
+
def monitor(termination_pipe)
|
89
|
+
raise "You must call #scan first" if !@apps
|
90
|
+
|
91
|
+
watcher = PhusionPassenger::Utils::FileSystemWatcher.new(@watchlist, termination_pipe)
|
92
|
+
if wait_on_io(termination_pipe, 3)
|
93
|
+
return
|
94
|
+
end
|
95
|
+
|
96
|
+
while true
|
97
|
+
changed = watcher.wait_for_change
|
98
|
+
watcher.close
|
99
|
+
if changed
|
100
|
+
old_apps = @apps
|
101
|
+
# The change could be caused by a write to some Passengerfile.json file.
|
102
|
+
# Wait for a short period so that the write has a chance to finish.
|
103
|
+
if wait_on_io(termination_pipe, 0.25)
|
104
|
+
return
|
105
|
+
end
|
106
|
+
|
107
|
+
new_apps = scan
|
108
|
+
watcher = PhusionPassenger::Utils::FileSystemWatcher.new(@watchlist, termination_pipe)
|
109
|
+
if old_apps != new_apps
|
110
|
+
yield(new_apps)
|
111
|
+
end
|
112
|
+
|
113
|
+
# Don't process change events again for a short while,
|
114
|
+
# but do detect changes while waiting.
|
115
|
+
if wait_on_io(termination_pipe, 3)
|
116
|
+
return
|
117
|
+
end
|
118
|
+
else
|
119
|
+
return
|
120
|
+
end
|
121
|
+
end
|
122
|
+
ensure
|
123
|
+
watcher.close if watcher
|
124
|
+
end
|
125
|
+
|
126
|
+
def single_mode?
|
127
|
+
return @mode == :single
|
128
|
+
end
|
129
|
+
|
130
|
+
def multi_mode?
|
131
|
+
return !single_mode?
|
132
|
+
end
|
133
|
+
|
134
|
+
##################
|
135
|
+
|
136
|
+
private
|
137
|
+
class ConfigLoadError < StandardError
|
138
|
+
end
|
139
|
+
|
140
|
+
def find_app_root
|
141
|
+
if @dirs.empty?
|
142
|
+
return File.absolute_path_no_resolve(".")
|
143
|
+
else
|
144
|
+
return File.absolute_path_no_resolve(@dirs[0])
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def looks_like_app_directory?(dir, options = {})
|
149
|
+
return AppFinder.looks_like_app_directory?(dir, options)
|
150
|
+
end
|
151
|
+
|
152
|
+
def filename_to_server_names(filename)
|
153
|
+
basename = File.basename(filename)
|
154
|
+
names = [basename]
|
155
|
+
if basename !~ /^www\.$/i
|
156
|
+
names << "www.#{basename}"
|
157
|
+
end
|
158
|
+
return names
|
159
|
+
end
|
160
|
+
|
161
|
+
# Wait until the given IO becomes readable, or until the timeout has
|
162
|
+
# been reached. Returns true if the IO became readable, false if the
|
163
|
+
# timeout has been reached.
|
164
|
+
def wait_on_io(io, timeout)
|
165
|
+
return !!select([io], nil, nil, timeout)
|
166
|
+
end
|
167
|
+
|
168
|
+
def determine_mode_and_execution_root(options)
|
169
|
+
@mode = :single
|
170
|
+
if @dirs.empty?
|
171
|
+
@execution_root = File.absolute_path_no_resolve(".")
|
172
|
+
else
|
173
|
+
@execution_root = File.absolute_path_no_resolve(@dirs[0])
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
##################
|
178
|
+
end
|
179
|
+
|
180
|
+
end # module Standalone
|
178
181
|
end # module PhusionPassenger
|