passenger 2.0.6 → 2.1.2
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.
- data/DEVELOPERS.TXT +10 -4
- data/LICENSE +1 -1
- data/NEWS +0 -0
- data/Rakefile +183 -117
- data/benchmark/dispatcher.rb +5 -9
- data/bin/passenger-install-apache2-module +52 -18
- data/bin/passenger-memory-stats +67 -13
- data/bin/passenger-spawn-server +8 -4
- data/bin/passenger-status +21 -46
- data/bin/passenger-stress-test +5 -5
- data/debian/postinst +1 -1
- data/doc/ApplicationPool algorithm.txt +180 -128
- data/doc/Architectural overview.html +1 -778
- data/doc/Security of user switching support.html +1 -643
- data/doc/Users guide Apache.html +3127 -0
- data/doc/Users guide Nginx.html +1458 -0
- data/doc/Users guide.html +1404 -467
- data/doc/Users guide.txt +843 -105
- data/doc/cxxapi/ApplicationPoolServer_8h-source.html +751 -641
- data/doc/cxxapi/ApplicationPool_8h-source.html +168 -171
- data/doc/cxxapi/Application_8h-source.html +494 -394
- data/doc/cxxapi/Bucket_8h-source.html +21 -15
- data/doc/cxxapi/CachedFileStat_8h-source.html +191 -0
- data/doc/cxxapi/Configuration_8h-source.html +311 -149
- data/doc/cxxapi/DirectoryMapper_8h-source.html +309 -0
- data/doc/cxxapi/DummySpawnManager_8h-source.html +3 -4
- data/doc/cxxapi/Exceptions_8h-source.html +182 -165
- data/doc/cxxapi/FileChecker_8h-source.html +130 -0
- data/doc/cxxapi/Hooks_8h-source.html +2 -3
- data/doc/cxxapi/Logging_8h-source.html +92 -89
- data/doc/cxxapi/MessageChannel_8h-source.html +585 -477
- data/doc/cxxapi/PoolOptions_8h-source.html +305 -0
- data/doc/cxxapi/SpawnManager_8h-source.html +515 -540
- data/doc/cxxapi/StandardApplicationPool_8h-source.html +779 -679
- data/doc/cxxapi/SystemTime_8h-source.html +104 -0
- data/doc/cxxapi/Utils_8h-source.html +331 -227
- data/doc/cxxapi/annotated.html +6 -7
- data/doc/cxxapi/classClient-members.html +1 -2
- data/doc/cxxapi/classClient.html +1 -2
- data/doc/cxxapi/classHooks-members.html +5 -2
- data/doc/cxxapi/classHooks.html +112 -2
- data/doc/cxxapi/classPassenger_1_1Application-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1Application.html +8 -9
- data/doc/cxxapi/classPassenger_1_1ApplicationPool-members.html +4 -4
- data/doc/cxxapi/classPassenger_1_1ApplicationPool.html +42 -81
- data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1ApplicationPoolServer.html +3 -4
- data/doc/cxxapi/classPassenger_1_1ApplicationPool__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1Application_1_1Session-members.html +3 -2
- data/doc/cxxapi/classPassenger_1_1Application_1_1Session.html +74 -3
- data/doc/cxxapi/classPassenger_1_1BusyException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1BusyException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1ConfigurationException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1ConfigurationException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper-members.html +38 -0
- data/doc/cxxapi/classPassenger_1_1DirectoryMapper.html +256 -0
- data/doc/cxxapi/classPassenger_1_1DummySpawnManager-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1DummySpawnManager.html +2 -3
- data/doc/cxxapi/{classPassenger_1_1Thread-members.html → classPassenger_1_1FileChecker-members.html} +4 -5
- data/doc/cxxapi/classPassenger_1_1FileChecker.html +121 -0
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1FileNotFoundException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1FileSystemException-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1FileSystemException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1FileSystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1IOException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1IOException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1IOException__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1MessageChannel-members.html +5 -2
- data/doc/cxxapi/classPassenger_1_1MessageChannel.html +155 -5
- data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption-members.html → classPassenger_1_1RuntimeException-members.html} +2 -3
- data/doc/cxxapi/{classboost_1_1this__thread_1_1enable__syscall__interruption.html → classPassenger_1_1RuntimeException.html} +10 -8
- data/doc/cxxapi/classPassenger_1_1SpawnException-members.html +1 -2
- data/doc/cxxapi/classPassenger_1_1SpawnException.html +2 -3
- data/doc/cxxapi/classPassenger_1_1SpawnManager-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1SpawnManager.html +15 -56
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool-members.html +5 -4
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool.html +20 -81
- data/doc/cxxapi/classPassenger_1_1StandardApplicationPool__inherit__graph.png +0 -0
- data/doc/cxxapi/classPassenger_1_1SystemException-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1SystemException.html +9 -10
- data/doc/cxxapi/classPassenger_1_1SystemException__inherit__graph.png +0 -0
- data/doc/cxxapi/{classboost_1_1this__thread_1_1disable__syscall__interruption-members.html → classPassenger_1_1SystemTime-members.html} +5 -3
- data/doc/cxxapi/classPassenger_1_1SystemTime.html +86 -0
- data/doc/cxxapi/classPassenger_1_1TempFile-members.html +2 -3
- data/doc/cxxapi/classPassenger_1_1TempFile.html +17 -9
- data/doc/cxxapi/definitions_8h-source.html +1 -2
- data/doc/cxxapi/files.html +6 -3
- data/doc/cxxapi/functions.html +98 -35
- data/doc/cxxapi/functions_func.html +60 -32
- data/doc/cxxapi/functions_type.html +1 -2
- data/doc/cxxapi/functions_vars.html +27 -2
- data/doc/cxxapi/graph_legend.html +1 -2
- data/doc/cxxapi/graph_legend.png +0 -0
- data/doc/cxxapi/group__Configuration.html +3 -4
- data/doc/cxxapi/group__Configuration.png +0 -0
- data/doc/cxxapi/group__Core.html +3 -4
- data/doc/cxxapi/group__Core.png +0 -0
- data/doc/cxxapi/group__Exceptions.html +4 -2
- data/doc/cxxapi/group__Hooks.html +1 -6
- data/doc/cxxapi/group__Hooks.png +0 -0
- data/doc/cxxapi/group__Support.html +259 -36
- data/doc/cxxapi/hierarchy.html +6 -7
- data/doc/cxxapi/inherit__graph__0.map +1 -1
- data/doc/cxxapi/inherit__graph__0.md5 +1 -1
- data/doc/cxxapi/inherit__graph__0.png +0 -0
- data/doc/cxxapi/inherit__graph__1.map +1 -1
- data/doc/cxxapi/inherit__graph__1.md5 +1 -1
- data/doc/cxxapi/inherit__graph__1.png +0 -0
- data/doc/cxxapi/inherit__graph__10.map +1 -1
- data/doc/cxxapi/inherit__graph__10.md5 +1 -1
- data/doc/cxxapi/inherit__graph__10.png +0 -0
- data/doc/cxxapi/inherit__graph__11.map +1 -1
- data/doc/cxxapi/inherit__graph__11.md5 +1 -1
- data/doc/cxxapi/inherit__graph__11.png +0 -0
- data/doc/cxxapi/inherit__graph__12.map +2 -1
- data/doc/cxxapi/inherit__graph__12.md5 +1 -1
- data/doc/cxxapi/inherit__graph__12.png +0 -0
- data/doc/cxxapi/inherit__graph__13.map +1 -1
- data/doc/cxxapi/inherit__graph__13.md5 +1 -1
- data/doc/cxxapi/inherit__graph__13.png +0 -0
- data/doc/cxxapi/inherit__graph__14.map +1 -2
- data/doc/cxxapi/inherit__graph__14.md5 +1 -1
- data/doc/cxxapi/inherit__graph__14.png +0 -0
- data/doc/cxxapi/inherit__graph__15.map +1 -1
- data/doc/cxxapi/inherit__graph__15.md5 +1 -1
- data/doc/cxxapi/inherit__graph__15.png +0 -0
- data/doc/cxxapi/inherit__graph__16.map +1 -1
- data/doc/cxxapi/inherit__graph__16.md5 +1 -1
- data/doc/cxxapi/inherit__graph__16.png +0 -0
- data/doc/cxxapi/inherit__graph__17.png +0 -0
- data/doc/cxxapi/inherit__graph__18.png +0 -0
- data/doc/cxxapi/inherit__graph__19.png +0 -0
- data/doc/cxxapi/inherit__graph__2.map +1 -1
- data/doc/cxxapi/inherit__graph__2.md5 +1 -1
- data/doc/cxxapi/inherit__graph__2.png +0 -0
- data/doc/cxxapi/inherit__graph__20.map +1 -1
- data/doc/cxxapi/inherit__graph__20.md5 +1 -1
- data/doc/cxxapi/inherit__graph__20.png +0 -0
- data/doc/cxxapi/inherit__graph__21.map +1 -1
- data/doc/cxxapi/inherit__graph__21.md5 +1 -1
- data/doc/cxxapi/inherit__graph__21.png +0 -0
- data/doc/cxxapi/inherit__graph__3.map +1 -1
- data/doc/cxxapi/inherit__graph__3.md5 +1 -1
- data/doc/cxxapi/inherit__graph__3.png +0 -0
- data/doc/cxxapi/inherit__graph__4.map +1 -1
- data/doc/cxxapi/inherit__graph__4.md5 +1 -1
- data/doc/cxxapi/inherit__graph__4.png +0 -0
- data/doc/cxxapi/inherit__graph__5.map +2 -1
- data/doc/cxxapi/inherit__graph__5.md5 +1 -1
- data/doc/cxxapi/inherit__graph__5.png +0 -0
- data/doc/cxxapi/inherit__graph__6.map +1 -1
- data/doc/cxxapi/inherit__graph__6.md5 +1 -1
- data/doc/cxxapi/inherit__graph__6.png +0 -0
- data/doc/cxxapi/inherit__graph__7.map +1 -1
- data/doc/cxxapi/inherit__graph__7.md5 +1 -1
- data/doc/cxxapi/inherit__graph__7.png +0 -0
- data/doc/cxxapi/inherit__graph__8.map +1 -1
- data/doc/cxxapi/inherit__graph__8.md5 +1 -1
- data/doc/cxxapi/inherit__graph__8.png +0 -0
- data/doc/cxxapi/inherit__graph__9.map +1 -2
- data/doc/cxxapi/inherit__graph__9.md5 +1 -1
- data/doc/cxxapi/inherit__graph__9.png +0 -0
- data/doc/cxxapi/inherits.html +30 -31
- data/doc/cxxapi/main.html +1 -2
- data/doc/cxxapi/modules.html +1 -2
- data/doc/cxxapi/structPassenger_1_1AnythingToString-members.html +1 -2
- data/doc/cxxapi/structPassenger_1_1AnythingToString.html +2 -3
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4-members.html +1 -2
- data/doc/cxxapi/structPassenger_1_1AnythingToString_3_01vector_3_01string_01_4_01_4.html +2 -3
- data/doc/cxxapi/structPassenger_1_1PoolOptions-members.html +49 -0
- data/doc/cxxapi/structPassenger_1_1PoolOptions.html +404 -0
- data/doc/cxxapi/tree.html +18 -20
- data/doc/images/conservative_spawning.png +0 -0
- data/doc/images/conservative_spawning.svg +248 -0
- data/doc/images/smart-lv2.png +0 -0
- data/doc/images/smart-lv2.svg +320 -0
- data/doc/rdoc/classes/ConditionVariable.html +68 -34
- data/doc/rdoc/classes/Exception.html +16 -16
- data/doc/rdoc/classes/GC.html +9 -9
- data/doc/rdoc/classes/IO.html +36 -17
- data/doc/rdoc/classes/PhusionPassenger.html +183 -0
- data/doc/rdoc/classes/PhusionPassenger/AbstractRequestHandler.html +511 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer.html +285 -242
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerAlreadyStarted.html +3 -3
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerError.html +3 -3
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/ServerNotStarted.html +3 -3
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AbstractServer/UnknownMessage.html +3 -3
- data/doc/rdoc/classes/PhusionPassenger/AbstractServerCollection.html +598 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools.html +140 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess.html +247 -0
- data/doc/rdoc/classes/PhusionPassenger/AdminTools/ControlProcess/Instance.html +138 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/AppInitError.html +36 -19
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/Application.html +81 -96
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/ConsoleTextTemplate.html +18 -18
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/FrameworkInitError.html +20 -18
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/HTMLTemplate.html +18 -18
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/InitializationError.html +9 -9
- data/doc/rdoc/classes/PhusionPassenger/InvalidPath.html +92 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/MessageChannel.html +93 -92
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/NativeSupport.html +55 -25
- data/doc/rdoc/classes/PhusionPassenger/Rack.html +91 -0
- data/doc/rdoc/classes/PhusionPassenger/Rack/ApplicationSpawner.html +185 -0
- data/doc/rdoc/classes/PhusionPassenger/Rack/RequestHandler.html +182 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz.html +95 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner.html +424 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/ApplicationSpawner/Error.html +98 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/CGIFixed.html +200 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner.html +444 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/FrameworkSpawner/Error.html +98 -0
- data/doc/rdoc/classes/PhusionPassenger/Railz/RequestHandler.html +154 -0
- data/doc/rdoc/classes/PhusionPassenger/SpawnManager.html +408 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/UnknownError.html +13 -13
- data/doc/rdoc/classes/PhusionPassenger/Utils.html +687 -0
- data/doc/rdoc/classes/{Passenger → PhusionPassenger}/VersionNotFound.html +8 -8
- data/doc/rdoc/classes/PhusionPassenger/WSGI.html +89 -0
- data/doc/rdoc/classes/PhusionPassenger/WSGI/ApplicationSpawner.html +188 -0
- data/doc/rdoc/classes/PlatformInfo.html +663 -159
- data/doc/rdoc/classes/RakeExtensions.html +4 -4
- data/doc/rdoc/classes/Signal.html +134 -0
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/DEVELOPERS_TXT.html +15 -10
- data/doc/rdoc/files/README.html +5 -7
- data/doc/rdoc/files/ext/{passenger → phusion_passenger}/native_support_c.html +2 -2
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_request_handler_rb.html +7 -9
- data/doc/rdoc/files/lib/phusion_passenger/abstract_server_collection_rb.html +120 -0
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/abstract_server_rb.html +7 -10
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools/control_process_rb.html +99 -0
- data/doc/rdoc/files/lib/phusion_passenger/admin_tools_rb.html +92 -0
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/application_rb.html +6 -8
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/console_text_template_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/constants_rb.html +4 -5
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/dependencies_rb.html +6 -8
- data/doc/rdoc/files/lib/phusion_passenger/events_rb.html +116 -0
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/exceptions_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/html_template_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/message_channel_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/platform_info_rb.html +6 -7
- data/doc/rdoc/files/lib/phusion_passenger/rack/application_spawner_rb.html +123 -0
- data/doc/rdoc/files/lib/phusion_passenger/rack/request_handler_rb.html +117 -0
- data/doc/rdoc/files/lib/{passenger/utils_rb.html → phusion_passenger/railz/application_spawner_rb.html} +24 -17
- data/doc/rdoc/files/lib/phusion_passenger/railz/cgi_fixed_rb.html +126 -0
- data/doc/rdoc/files/lib/phusion_passenger/railz/framework_spawner_rb.html +139 -0
- data/doc/rdoc/files/lib/phusion_passenger/railz/request_handler_rb.html +118 -0
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/simple_benchmarking_rb.html +5 -7
- data/doc/rdoc/files/lib/{passenger → phusion_passenger}/spawn_manager_rb.html +40 -24
- data/doc/rdoc/files/lib/phusion_passenger/utils_rb.html +169 -0
- data/doc/rdoc/files/lib/phusion_passenger/wsgi/application_spawner_rb.html +120 -0
- data/doc/rdoc/files/lib/rake/extensions_rb.html +3 -4
- data/doc/rdoc/fr_class_index.html +37 -19
- data/doc/rdoc/fr_file_index.html +25 -14
- data/doc/rdoc/fr_method_index.html +145 -74
- data/ext/apache2/Application.h +145 -44
- data/ext/apache2/ApplicationPool.h +27 -29
- data/ext/apache2/ApplicationPoolServer.h +183 -72
- data/ext/apache2/ApplicationPoolServerExecutable.cpp +249 -42
- data/ext/apache2/Bucket.cpp +61 -9
- data/ext/apache2/Bucket.h +15 -8
- data/ext/apache2/CachedFileStat.cpp +114 -0
- data/ext/apache2/CachedFileStat.h +169 -0
- data/ext/apache2/Configuration.cpp +213 -22
- data/ext/apache2/Configuration.h +176 -13
- data/ext/apache2/DirectoryMapper.h +287 -0
- data/ext/apache2/Exceptions.h +30 -12
- data/ext/apache2/FileChecker.h +108 -0
- data/ext/apache2/Hooks.cpp +709 -493
- data/ext/apache2/LICENSE-CNRI.TXT +15 -0
- data/ext/apache2/Logging.h +26 -22
- data/ext/apache2/MessageChannel.h +124 -15
- data/ext/apache2/PoolOptions.h +283 -0
- data/ext/apache2/SpawnManager.h +75 -99
- data/ext/apache2/StandardApplicationPool.h +296 -195
- data/ext/apache2/SystemTime.cpp +28 -0
- data/ext/apache2/SystemTime.h +82 -0
- data/ext/apache2/Utils.cpp +172 -18
- data/ext/apache2/Utils.h +124 -19
- data/ext/boost/cstdint.hpp +4 -2
- data/ext/boost/current_function.hpp +67 -0
- data/ext/boost/detail/sp_counted_base.hpp +4 -4
- data/ext/boost/thread/exceptions.hpp +2 -1
- data/ext/boost/thread/pthread/thread.hpp +11 -3
- data/ext/boost/thread/pthread/thread_data.hpp +2 -1
- data/ext/oxt/backtrace.cpp +172 -0
- data/ext/oxt/backtrace.hpp +135 -0
- data/ext/oxt/detail/backtrace_disabled.hpp +39 -0
- data/ext/oxt/detail/backtrace_enabled.hpp +155 -0
- data/ext/oxt/detail/spin_lock_gcc_x86.hpp +82 -0
- data/ext/oxt/detail/spin_lock_portable.hpp +38 -0
- data/ext/oxt/detail/spin_lock_pthreads.hpp +97 -0
- data/ext/oxt/detail/tracable_exception_disabled.hpp +46 -0
- data/ext/oxt/detail/tracable_exception_enabled.hpp +48 -0
- data/ext/oxt/macros.hpp +58 -0
- data/ext/oxt/spin_lock.hpp +55 -0
- data/ext/{apache2/System.cpp → oxt/system_calls.cpp} +87 -52
- data/ext/oxt/system_calls.hpp +234 -0
- data/ext/oxt/thread.cpp +32 -0
- data/ext/oxt/thread.hpp +223 -0
- data/ext/oxt/tracable_exception.cpp +87 -0
- data/ext/oxt/tracable_exception.hpp +35 -0
- data/{lib/passenger/constants.rb → ext/phusion_passenger/extconf.rb} +14 -9
- data/ext/{passenger → phusion_passenger}/native_support.c +33 -6
- data/lib/{passenger → phusion_passenger}/abstract_request_handler.rb +209 -93
- data/lib/{passenger → phusion_passenger}/abstract_server.rb +23 -8
- data/lib/phusion_passenger/abstract_server_collection.rb +301 -0
- data/lib/phusion_passenger/admin_tools.rb +25 -0
- data/lib/phusion_passenger/admin_tools/control_process.rb +107 -0
- data/lib/{passenger → phusion_passenger}/application.rb +13 -16
- data/lib/{passenger → phusion_passenger}/console_text_template.rb +2 -2
- data/{ext/passenger/extconf.rb → lib/phusion_passenger/constants.rb} +5 -5
- data/lib/{passenger → phusion_passenger}/dependencies.rb +38 -32
- data/lib/phusion_passenger/events.rb +45 -0
- data/lib/{passenger → phusion_passenger}/exceptions.rb +12 -5
- data/lib/{passenger → phusion_passenger}/html_template.rb +2 -2
- data/lib/{passenger → phusion_passenger}/message_channel.rb +3 -2
- data/lib/phusion_passenger/platform_info.rb +500 -0
- data/lib/{passenger → phusion_passenger}/rack/application_spawner.rb +29 -22
- data/lib/{passenger → phusion_passenger}/rack/request_handler.rb +14 -9
- data/lib/{passenger → phusion_passenger}/railz/application_spawner.rb +94 -74
- data/lib/{passenger → phusion_passenger}/railz/cgi_fixed.rb +2 -2
- data/lib/{passenger → phusion_passenger}/railz/framework_spawner.rb +86 -98
- data/lib/{passenger → phusion_passenger}/railz/request_handler.rb +6 -6
- data/lib/{passenger → phusion_passenger}/simple_benchmarking.rb +0 -0
- data/lib/{passenger → phusion_passenger}/spawn_manager.rb +136 -128
- data/lib/{passenger → phusion_passenger}/templates/apache2_config_snippets.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
- data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +38 -0
- data/lib/{passenger → phusion_passenger}/templates/app_init_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/database_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/deployment_example.txt.erb +1 -1
- data/lib/{passenger → phusion_passenger}/templates/error_layout.css +0 -0
- data/lib/{passenger → phusion_passenger}/templates/error_layout.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/framework_init_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/general_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/invalid_app_root.html.erb +1 -1
- data/lib/{passenger → phusion_passenger}/templates/load_error.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/no_write_permission_to_passenger_root.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/run_installer_as_root.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/version_not_found.html.erb +0 -0
- data/lib/{passenger → phusion_passenger}/templates/welcome.txt.erb +0 -0
- data/lib/{passenger → phusion_passenger}/utils.rb +210 -44
- data/lib/{passenger → phusion_passenger}/wsgi/application_spawner.rb +18 -15
- data/lib/{passenger → phusion_passenger}/wsgi/request_handler.py +7 -1
- data/man/passenger-memory-stats.8 +1 -1
- data/misc/render_error_pages.rb +1 -1
- data/test/ApplicationPoolServerTest.cpp +0 -28
- data/test/ApplicationPoolServer_ApplicationPoolTest.cpp +4 -0
- data/test/ApplicationPoolTest.cpp +307 -69
- data/test/CachedFileStatTest.cpp +262 -0
- data/test/FileCheckerTest.cpp +79 -0
- data/test/MessageChannelTest.cpp +3 -3
- data/test/PoolOptionsTest.cpp +37 -0
- data/test/SpawnManagerTest.cpp +4 -4
- data/test/StandardApplicationPoolTest.cpp +4 -0
- data/test/SystemTimeTest.cpp +37 -0
- data/test/UtilsTest.cpp +137 -0
- data/test/integration_tests.rb +270 -23
- data/test/oxt/backtrace_test.cpp +128 -0
- data/test/oxt/oxt_test_main.cpp +25 -0
- data/test/oxt/syscall_interruption_test.cpp +50 -0
- data/test/ruby/abstract_request_handler_spec.rb +83 -0
- data/test/ruby/abstract_server_collection_spec.rb +246 -0
- data/test/ruby/application_spec.rb +3 -3
- data/test/ruby/message_channel_spec.rb +2 -2
- data/test/ruby/rack/application_spawner_spec.rb +3 -5
- data/test/ruby/rails/application_spawner_spec.rb +54 -15
- data/test/ruby/rails/framework_spawner_spec.rb +6 -8
- data/test/ruby/rails/minimal_spawner_spec.rb +29 -0
- data/test/ruby/rails/spawner_error_handling_spec.rb +1 -1
- data/test/ruby/rails/spawner_privilege_lowering_spec.rb +3 -3
- data/test/ruby/spawn_manager_spec.rb +23 -12
- data/test/ruby/utils_spec.rb +36 -2
- data/test/ruby/wsgi/application_spawner_spec.rb +47 -0
- data/test/stub/apache2/httpd.conf.erb +3 -5
- data/test/stub/message_channel.rb +2 -2
- data/test/stub/message_channel_2.rb +2 -2
- data/test/stub/message_channel_3.rb +3 -3
- data/test/stub/minimal-railsapp/README +0 -0
- data/test/stub/minimal-railsapp/config/application.rb +0 -0
- data/test/stub/minimal-railsapp/config/environment.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/actionmailer/lib/action_mailer.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_controller.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_pack.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/actionpack/lib/action_view.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/activerecord/lib/active_record.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/activeresource/lib/active_resource.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/activesupport/lib/active_support/whiny_nil.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/railties/lib/dispatcher.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/railties/lib/initializer.rb +0 -0
- data/test/stub/minimal-railsapp/vendor/rails/railties/lib/ruby_version_check.rb +0 -0
- data/test/stub/rails_apps/foobar/app/controllers/foo_controller.rb +8 -0
- data/test/stub/rails_apps/foobar/config/environments/development.rb +1 -2
- data/test/stub/rails_apps/mycook/app/controllers/welcome_controller.rb +21 -1
- data/test/stub/rails_apps/mycook/sites/some.site/public/uploads.html +26 -0
- data/test/stub/rails_apps/mycook/sites/some.site/public/welcome/cached.html +26 -0
- data/test/stub/railsapp/app/controllers/application.rb +0 -0
- data/test/stub/railsapp/app/controllers/bar_controller_1.rb +0 -0
- data/test/stub/railsapp/app/controllers/bar_controller_2.rb +1 -1
- data/test/stub/railsapp/app/controllers/foo_controller.rb +4 -0
- data/test/stub/railsapp/app/helpers/application_helper.rb +0 -0
- data/test/stub/railsapp/config/boot.rb +0 -0
- data/test/stub/railsapp/config/database.yml +0 -0
- data/test/stub/railsapp/config/environment.rb +0 -0
- data/test/stub/railsapp/config/environments/development.rb +0 -0
- data/test/stub/railsapp/config/environments/production.rb +0 -0
- data/test/stub/railsapp/config/initializers/inflections.rb +0 -0
- data/test/stub/railsapp/config/initializers/mime_types.rb +0 -0
- data/test/stub/railsapp/config/routes.rb +0 -0
- data/test/stub/railsapp/public/useless.txt +0 -0
- data/test/stub/spawn_server.rb +3 -4
- data/test/stub/wsgi/passenger_wsgi.pyc +0 -0
- data/test/support/apache2_controller.rb +57 -7
- data/test/support/tut.h +15 -0
- data/vendor/README +12 -0
- data/vendor/README_FOR_PACKAGERS +1 -0
- data/vendor/rack-0.9.1/AUTHORS +8 -0
- data/vendor/rack-0.9.1/COPYING +18 -0
- data/vendor/rack-0.9.1/ChangeLog +1423 -0
- data/vendor/rack-0.9.1/KNOWN-ISSUES +18 -0
- data/vendor/rack-0.9.1/README +306 -0
- data/vendor/rack-0.9.1/Rakefile +188 -0
- data/vendor/rack-0.9.1/SPEC +129 -0
- data/vendor/rack-0.9.1/lib/rack.rb +86 -0
- data/vendor/rack-0.9.1/lib/rack/adapter/camping.rb +22 -0
- data/vendor/rack-0.9.1/lib/rack/auth/abstract/handler.rb +28 -0
- data/vendor/rack-0.9.1/lib/rack/auth/abstract/request.rb +37 -0
- data/vendor/rack-0.9.1/lib/rack/auth/basic.rb +58 -0
- data/vendor/rack-0.9.1/lib/rack/auth/digest/md5.rb +124 -0
- data/vendor/rack-0.9.1/lib/rack/auth/digest/nonce.rb +51 -0
- data/vendor/rack-0.9.1/lib/rack/auth/digest/params.rb +55 -0
- data/vendor/rack-0.9.1/lib/rack/auth/digest/request.rb +40 -0
- data/vendor/rack-0.9.1/lib/rack/auth/openid.rb +438 -0
- data/vendor/rack-0.9.1/lib/rack/builder.rb +67 -0
- data/vendor/rack-0.9.1/lib/rack/cascade.rb +36 -0
- data/vendor/rack-0.9.1/lib/rack/commonlogger.rb +61 -0
- data/vendor/rack-0.9.1/lib/rack/conditionalget.rb +43 -0
- data/vendor/rack-0.9.1/lib/rack/content_length.rb +25 -0
- data/vendor/rack-0.9.1/lib/rack/deflater.rb +87 -0
- data/vendor/rack-0.9.1/lib/rack/directory.rb +150 -0
- data/vendor/rack-0.9.1/lib/rack/file.rb +85 -0
- data/vendor/rack-0.9.1/lib/rack/handler.rb +48 -0
- data/vendor/rack-0.9.1/lib/rack/handler/cgi.rb +57 -0
- data/vendor/rack-0.9.1/lib/rack/handler/evented_mongrel.rb +8 -0
- data/vendor/rack-0.9.1/lib/rack/handler/fastcgi.rb +86 -0
- data/vendor/rack-0.9.1/lib/rack/handler/lsws.rb +52 -0
- data/vendor/rack-0.9.1/lib/rack/handler/mongrel.rb +82 -0
- data/vendor/rack-0.9.1/lib/rack/handler/scgi.rb +57 -0
- data/vendor/rack-0.9.1/lib/rack/handler/swiftiplied_mongrel.rb +8 -0
- data/vendor/rack-0.9.1/lib/rack/handler/thin.rb +15 -0
- data/vendor/rack-0.9.1/lib/rack/handler/webrick.rb +61 -0
- data/vendor/rack-0.9.1/lib/rack/head.rb +19 -0
- data/vendor/rack-0.9.1/lib/rack/lint.rb +465 -0
- data/vendor/rack-0.9.1/lib/rack/lobster.rb +65 -0
- data/vendor/rack-0.9.1/lib/rack/methodoverride.rb +27 -0
- data/vendor/rack-0.9.1/lib/rack/mime.rb +204 -0
- data/vendor/rack-0.9.1/lib/rack/mock.rb +160 -0
- data/vendor/rack-0.9.1/lib/rack/recursive.rb +57 -0
- data/vendor/rack-0.9.1/lib/rack/reloader.rb +64 -0
- data/vendor/rack-0.9.1/lib/rack/request.rb +218 -0
- data/vendor/rack-0.9.1/lib/rack/response.rb +171 -0
- data/vendor/rack-0.9.1/lib/rack/session/abstract/id.rb +153 -0
- data/vendor/rack-0.9.1/lib/rack/session/cookie.rb +89 -0
- data/vendor/rack-0.9.1/lib/rack/session/memcache.rb +97 -0
- data/vendor/rack-0.9.1/lib/rack/session/pool.rb +73 -0
- data/vendor/rack-0.9.1/lib/rack/showexceptions.rb +348 -0
- data/vendor/rack-0.9.1/lib/rack/showstatus.rb +106 -0
- data/vendor/rack-0.9.1/lib/rack/static.rb +38 -0
- data/vendor/rack-0.9.1/lib/rack/urlmap.rb +48 -0
- data/vendor/rack-0.9.1/lib/rack/utils.rb +347 -0
- metadata +1197 -1055
- data/doc/cxxapi/System_8h-source.html +0 -251
- data/doc/cxxapi/classDirectoryMapper-members.html +0 -38
- data/doc/cxxapi/classDirectoryMapper.html +0 -203
- data/doc/cxxapi/classPassenger_1_1Thread.html +0 -100
- data/doc/cxxapi/classboost_1_1this__thread_1_1disable__syscall__interruption.html +0 -46
- data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption-members.html +0 -33
- data/doc/cxxapi/classboost_1_1this__thread_1_1restore__syscall__interruption.html +0 -44
- data/doc/cxxapi/namespacePassenger.html +0 -208
- data/doc/cxxapi/namespacePassenger_1_1InterruptableCalls.html +0 -43
- data/doc/cxxapi/namespacemembers.html +0 -70
- data/doc/cxxapi/namespacemembers_func.html +0 -66
- data/doc/cxxapi/namespacemembers_type.html +0 -46
- data/doc/cxxapi/namespaces.html +0 -35
- data/doc/rdoc/classes/Passenger.html +0 -136
- data/doc/rdoc/classes/Passenger/AbstractRequestHandler.html +0 -402
- data/doc/rdoc/classes/Passenger/SpawnManager.html +0 -379
- data/doc/rdoc/classes/Passenger/Utils.html +0 -578
- data/ext/apache2/System.h +0 -228
- data/lib/passenger/platform_info.rb +0 -302
- data/lib/passenger/templates/app_exited_during_initialization.html.erb +0 -19
- data/test/stub/apache2/httpd.conf +0 -75
- data/test/stub/rails_apps/foobar/config/environments/test.rb +0 -22
- data/test/stub/rails_apps/mycook/config/environments/test.rb +0 -22
- data/test/stub/railsapp/config/environments/test.rb +0 -22
- data/test/stub/railsapp2/config/environments/test.rb +0 -22
@@ -0,0 +1,305 @@
|
|
1
|
+
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
2
|
+
<html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
|
3
|
+
<title>Passenger: PoolOptions.h Source File</title>
|
4
|
+
<link href="doxygen.css" rel="stylesheet" type="text/css">
|
5
|
+
<link href="tabs.css" rel="stylesheet" type="text/css">
|
6
|
+
</head><body>
|
7
|
+
<!-- Generated by Doxygen 1.5.5 -->
|
8
|
+
<div class="navigation" id="top">
|
9
|
+
<div class="tabs">
|
10
|
+
<ul>
|
11
|
+
<li><a href="main.html"><span>Main Page</span></a></li>
|
12
|
+
<li><a href="modules.html"><span>Modules</span></a></li>
|
13
|
+
<li><a href="annotated.html"><span>Classes</span></a></li>
|
14
|
+
<li class="current"><a href="files.html"><span>Files</span></a></li>
|
15
|
+
</ul>
|
16
|
+
</div>
|
17
|
+
<h1>PoolOptions.h</h1><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*</span>
|
18
|
+
<a name="l00002"></a>00002 <span class="comment"> * Phusion Passenger - http://www.modrails.com/</span>
|
19
|
+
<a name="l00003"></a>00003 <span class="comment"> * Copyright (C) 2008 Phusion</span>
|
20
|
+
<a name="l00004"></a>00004 <span class="comment"> *</span>
|
21
|
+
<a name="l00005"></a>00005 <span class="comment"> * Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.</span>
|
22
|
+
<a name="l00006"></a>00006 <span class="comment"> *</span>
|
23
|
+
<a name="l00007"></a>00007 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
|
24
|
+
<a name="l00008"></a>00008 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
|
25
|
+
<a name="l00009"></a>00009 <span class="comment"> * the Free Software Foundation; version 2 of the License.</span>
|
26
|
+
<a name="l00010"></a>00010 <span class="comment"> *</span>
|
27
|
+
<a name="l00011"></a>00011 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
|
28
|
+
<a name="l00012"></a>00012 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
|
29
|
+
<a name="l00013"></a>00013 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span>
|
30
|
+
<a name="l00014"></a>00014 <span class="comment"> * GNU General Public License for more details.</span>
|
31
|
+
<a name="l00015"></a>00015 <span class="comment"> *</span>
|
32
|
+
<a name="l00016"></a>00016 <span class="comment"> * You should have received a copy of the GNU General Public License along</span>
|
33
|
+
<a name="l00017"></a>00017 <span class="comment"> * with this program; if not, write to the Free Software Foundation, Inc.,</span>
|
34
|
+
<a name="l00018"></a>00018 <span class="comment"> * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span>
|
35
|
+
<a name="l00019"></a>00019 <span class="comment"> */</span>
|
36
|
+
<a name="l00020"></a>00020 <span class="preprocessor">#ifndef _PASSENGER_SPAWN_OPTIONS_H_</span>
|
37
|
+
<a name="l00021"></a>00021 <span class="preprocessor"></span><span class="preprocessor">#define _PASSENGER_SPAWN_OPTIONS_H_</span>
|
38
|
+
<a name="l00022"></a>00022 <span class="preprocessor"></span>
|
39
|
+
<a name="l00023"></a>00023 <span class="preprocessor">#include <string></span>
|
40
|
+
<a name="l00024"></a>00024 <span class="preprocessor">#include "Utils.h"</span>
|
41
|
+
<a name="l00025"></a>00025
|
42
|
+
<a name="l00026"></a>00026 <span class="keyword">namespace </span>Passenger {
|
43
|
+
<a name="l00027"></a>00027
|
44
|
+
<a name="l00028"></a>00028 <span class="keyword">using namespace </span>std;
|
45
|
+
<a name="l00029"></a>00029 <span class="comment"></span>
|
46
|
+
<a name="l00030"></a>00030 <span class="comment">/**</span>
|
47
|
+
<a name="l00031"></a>00031 <span class="comment"> * This struct encapsulates information for ApplicationPool::get() and for</span>
|
48
|
+
<a name="l00032"></a>00032 <span class="comment"> * SpawnManager::spawn(), such as which application is to be spawned.</span>
|
49
|
+
<a name="l00033"></a>00033 <span class="comment"> *</span>
|
50
|
+
<a name="l00034"></a>00034 <span class="comment"> * <h2>Notes on privilege lowering support</h2></span>
|
51
|
+
<a name="l00035"></a>00035 <span class="comment"> *</span>
|
52
|
+
<a name="l00036"></a>00036 <span class="comment"> * If <tt>lowerPrivilege</tt> is true, then it will be attempt to</span>
|
53
|
+
<a name="l00037"></a>00037 <span class="comment"> * switch the spawned application instance to the user who owns the</span>
|
54
|
+
<a name="l00038"></a>00038 <span class="comment"> * application's <tt>config/environment.rb</tt>, and to the default</span>
|
55
|
+
<a name="l00039"></a>00039 <span class="comment"> * group of that user.</span>
|
56
|
+
<a name="l00040"></a>00040 <span class="comment"> *</span>
|
57
|
+
<a name="l00041"></a>00041 <span class="comment"> * If that user doesn't exist on the system, or if that user is root,</span>
|
58
|
+
<a name="l00042"></a>00042 <span class="comment"> * then it will be attempted to switch to the username given by</span>
|
59
|
+
<a name="l00043"></a>00043 <span class="comment"> * <tt>lowestUser</tt> (and to the default group of that user).</span>
|
60
|
+
<a name="l00044"></a>00044 <span class="comment"> * If <tt>lowestUser</tt> doesn't exist either, or if switching user failed</span>
|
61
|
+
<a name="l00045"></a>00045 <span class="comment"> * (because the spawn server process does not have the privilege to do so),</span>
|
62
|
+
<a name="l00046"></a>00046 <span class="comment"> * then the application will be spawned anyway, without reporting an error.</span>
|
63
|
+
<a name="l00047"></a>00047 <span class="comment"> *</span>
|
64
|
+
<a name="l00048"></a>00048 <span class="comment"> * It goes without saying that lowering privilege is only possible if</span>
|
65
|
+
<a name="l00049"></a>00049 <span class="comment"> * the spawn server is running as root (and thus, by induction, that</span>
|
66
|
+
<a name="l00050"></a>00050 <span class="comment"> * Phusion Passenger and Apache's control process are also running as root).</span>
|
67
|
+
<a name="l00051"></a>00051 <span class="comment"> * Note that if Apache is listening on port 80, then its control process must</span>
|
68
|
+
<a name="l00052"></a>00052 <span class="comment"> * be running as root. See "doc/Security of user switching.txt" for</span>
|
69
|
+
<a name="l00053"></a>00053 <span class="comment"> * a detailed explanation.</span>
|
70
|
+
<a name="l00054"></a>00054 <span class="comment"> */</span>
|
71
|
+
<a name="l00055"></a><a class="code" href="structPassenger_1_1PoolOptions.html">00055</a> <span class="keyword">struct </span><a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a> {<span class="comment"></span>
|
72
|
+
<a name="l00056"></a>00056 <span class="comment"> /**</span>
|
73
|
+
<a name="l00057"></a>00057 <span class="comment"> * The root directory of the application to spawn. In case of a Ruby on Rails</span>
|
74
|
+
<a name="l00058"></a>00058 <span class="comment"> * application, this is the folder that contains 'app/', 'public/', 'config/',</span>
|
75
|
+
<a name="l00059"></a>00059 <span class="comment"> * etc. This must be a valid directory, but the path does not have to be absolute.</span>
|
76
|
+
<a name="l00060"></a>00060 <span class="comment"> */</span>
|
77
|
+
<a name="l00061"></a><a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3">00061</a> <span class="keywordtype">string</span> <a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a>;
|
78
|
+
<a name="l00062"></a>00062 <span class="comment"></span>
|
79
|
+
<a name="l00063"></a>00063 <span class="comment"> /** Whether to lower the application's privileges. */</span>
|
80
|
+
<a name="l00064"></a><a class="code" href="structPassenger_1_1PoolOptions.html#7feed1c0a150ffc9bd003f5535d675db">00064</a> <span class="keywordtype">bool</span> <a class="code" href="structPassenger_1_1PoolOptions.html#7feed1c0a150ffc9bd003f5535d675db" title="Whether to lower the application&#39;s privileges.">lowerPrivilege</a>;
|
81
|
+
<a name="l00065"></a>00065 <span class="comment"></span>
|
82
|
+
<a name="l00066"></a>00066 <span class="comment"> /**</span>
|
83
|
+
<a name="l00067"></a>00067 <span class="comment"> * The user to fallback to if lowering privilege fails.</span>
|
84
|
+
<a name="l00068"></a>00068 <span class="comment"> */</span>
|
85
|
+
<a name="l00069"></a><a class="code" href="structPassenger_1_1PoolOptions.html#ec92a9f5d0a265a77fbfdb549f39557a">00069</a> <span class="keywordtype">string</span> <a class="code" href="structPassenger_1_1PoolOptions.html#ec92a9f5d0a265a77fbfdb549f39557a" title="The user to fallback to if lowering privilege fails.">lowestUser</a>;
|
86
|
+
<a name="l00070"></a>00070 <span class="comment"></span>
|
87
|
+
<a name="l00071"></a>00071 <span class="comment"> /**</span>
|
88
|
+
<a name="l00072"></a>00072 <span class="comment"> * The RAILS_ENV/RACK_ENV environment that should be used. May not be an</span>
|
89
|
+
<a name="l00073"></a>00073 <span class="comment"> * empty string.</span>
|
90
|
+
<a name="l00074"></a>00074 <span class="comment"> */</span>
|
91
|
+
<a name="l00075"></a><a class="code" href="structPassenger_1_1PoolOptions.html#4324bb724859905f9991faa9b90aedbc">00075</a> <span class="keywordtype">string</span> <a class="code" href="structPassenger_1_1PoolOptions.html#4324bb724859905f9991faa9b90aedbc" title="The RAILS_ENV/RACK_ENV environment that should be used.">environment</a>;
|
92
|
+
<a name="l00076"></a>00076 <span class="comment"></span>
|
93
|
+
<a name="l00077"></a>00077 <span class="comment"> /**</span>
|
94
|
+
<a name="l00078"></a>00078 <span class="comment"> * The spawn method to use. Either "smart" or "conservative". See the Ruby</span>
|
95
|
+
<a name="l00079"></a>00079 <span class="comment"> * class <tt>SpawnManager</tt> for details.</span>
|
96
|
+
<a name="l00080"></a>00080 <span class="comment"> */</span>
|
97
|
+
<a name="l00081"></a><a class="code" href="structPassenger_1_1PoolOptions.html#feb629e3ced79f5a2dbccc1beeeeab9e">00081</a> <span class="keywordtype">string</span> <a class="code" href="structPassenger_1_1PoolOptions.html#feb629e3ced79f5a2dbccc1beeeeab9e" title="The spawn method to use.">spawnMethod</a>;
|
98
|
+
<a name="l00082"></a>00082 <span class="comment"></span>
|
99
|
+
<a name="l00083"></a>00083 <span class="comment"> /** The application type. Either "rails", "rack" or "wsgi". */</span>
|
100
|
+
<a name="l00084"></a><a class="code" href="structPassenger_1_1PoolOptions.html#5e1c129ae0b8be350c7ed238eec8a8c9">00084</a> <span class="keywordtype">string</span> <a class="code" href="structPassenger_1_1PoolOptions.html#5e1c129ae0b8be350c7ed238eec8a8c9" title="The application type.">appType</a>;
|
101
|
+
<a name="l00085"></a>00085 <span class="comment"></span>
|
102
|
+
<a name="l00086"></a>00086 <span class="comment"> /**</span>
|
103
|
+
<a name="l00087"></a>00087 <span class="comment"> * The idle timeout, in seconds, of Rails framework spawners.</span>
|
104
|
+
<a name="l00088"></a>00088 <span class="comment"> * A timeout of 0 means that the framework spawner should never idle timeout. A timeout</span>
|
105
|
+
<a name="l00089"></a>00089 <span class="comment"> * of -1 means that the default timeout value should be used.</span>
|
106
|
+
<a name="l00090"></a>00090 <span class="comment"> *</span>
|
107
|
+
<a name="l00091"></a>00091 <span class="comment"> * For more details about Rails framework spawners, please</span>
|
108
|
+
<a name="l00092"></a>00092 <span class="comment"> * read the documentation on the Railz::FrameworkSpawner</span>
|
109
|
+
<a name="l00093"></a>00093 <span class="comment"> * Ruby class.</span>
|
110
|
+
<a name="l00094"></a>00094 <span class="comment"> */</span>
|
111
|
+
<a name="l00095"></a><a class="code" href="structPassenger_1_1PoolOptions.html#cbbea86958b42ffa7989680ed1587c70">00095</a> <span class="keywordtype">long</span> <a class="code" href="structPassenger_1_1PoolOptions.html#cbbea86958b42ffa7989680ed1587c70" title="The idle timeout, in seconds, of Rails framework spawners.">frameworkSpawnerTimeout</a>;
|
112
|
+
<a name="l00096"></a>00096 <span class="comment"></span>
|
113
|
+
<a name="l00097"></a>00097 <span class="comment"> /**</span>
|
114
|
+
<a name="l00098"></a>00098 <span class="comment"> * The idle timeout, in seconds, of Rails application spawners.</span>
|
115
|
+
<a name="l00099"></a>00099 <span class="comment"> * A timeout of 0 means that the application spawner should never idle timeout. A timeout</span>
|
116
|
+
<a name="l00100"></a>00100 <span class="comment"> * of -1 means that the default timeout value should be used.</span>
|
117
|
+
<a name="l00101"></a>00101 <span class="comment"> *</span>
|
118
|
+
<a name="l00102"></a>00102 <span class="comment"> * For more details about Rails application spawners, please</span>
|
119
|
+
<a name="l00103"></a>00103 <span class="comment"> * read the documentation on the Railz::ApplicationSpawner</span>
|
120
|
+
<a name="l00104"></a>00104 <span class="comment"> * Ruby class.</span>
|
121
|
+
<a name="l00105"></a>00105 <span class="comment"> */</span>
|
122
|
+
<a name="l00106"></a><a class="code" href="structPassenger_1_1PoolOptions.html#5a2f27a853e33c22da71430216d798cf">00106</a> <span class="keywordtype">long</span> <a class="code" href="structPassenger_1_1PoolOptions.html#5a2f27a853e33c22da71430216d798cf" title="The idle timeout, in seconds, of Rails application spawners.">appSpawnerTimeout</a>;
|
123
|
+
<a name="l00107"></a>00107 <span class="comment"></span>
|
124
|
+
<a name="l00108"></a>00108 <span class="comment"> /**</span>
|
125
|
+
<a name="l00109"></a>00109 <span class="comment"> * The maximum number of requests that the spawned application may process</span>
|
126
|
+
<a name="l00110"></a>00110 <span class="comment"> * before exiting. A value of 0 means unlimited.</span>
|
127
|
+
<a name="l00111"></a>00111 <span class="comment"> */</span>
|
128
|
+
<a name="l00112"></a><a class="code" href="structPassenger_1_1PoolOptions.html#70251ed3cb3713cb26a0b166c6b015c0">00112</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="structPassenger_1_1PoolOptions.html#70251ed3cb3713cb26a0b166c6b015c0" title="The maximum number of requests that the spawned application may process before exiting...">maxRequests</a>;
|
129
|
+
<a name="l00113"></a>00113 <span class="comment"></span>
|
130
|
+
<a name="l00114"></a>00114 <span class="comment"> /**</span>
|
131
|
+
<a name="l00115"></a>00115 <span class="comment"> * The maximum amount of memory (in MB) the spawned application may use.</span>
|
132
|
+
<a name="l00116"></a>00116 <span class="comment"> * A value of 0 means unlimited.</span>
|
133
|
+
<a name="l00117"></a>00117 <span class="comment"> */</span>
|
134
|
+
<a name="l00118"></a><a class="code" href="structPassenger_1_1PoolOptions.html#f61aa527e17a4f2bb5d66260749d17cd">00118</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="structPassenger_1_1PoolOptions.html#f61aa527e17a4f2bb5d66260749d17cd" title="The maximum amount of memory (in MB) the spawned application may use.">memoryLimit</a>;
|
135
|
+
<a name="l00119"></a>00119 <span class="comment"></span>
|
136
|
+
<a name="l00120"></a>00120 <span class="comment"> /**</span>
|
137
|
+
<a name="l00121"></a>00121 <span class="comment"> * Whether to use a global queue instead of a per-backend process</span>
|
138
|
+
<a name="l00122"></a>00122 <span class="comment"> * queue. This option is only used by ApplicationPool::get().</span>
|
139
|
+
<a name="l00123"></a>00123 <span class="comment"> *</span>
|
140
|
+
<a name="l00124"></a>00124 <span class="comment"> * If enabled, when all backend processes are active, get() will</span>
|
141
|
+
<a name="l00125"></a>00125 <span class="comment"> * wait until there's at least one backend process that's idle, instead</span>
|
142
|
+
<a name="l00126"></a>00126 <span class="comment"> * of queuing the request into a random process's private queue.</span>
|
143
|
+
<a name="l00127"></a>00127 <span class="comment"> * This is especially useful if a website has one or more long-running</span>
|
144
|
+
<a name="l00128"></a>00128 <span class="comment"> * requests.</span>
|
145
|
+
<a name="l00129"></a>00129 <span class="comment"> */</span>
|
146
|
+
<a name="l00130"></a><a class="code" href="structPassenger_1_1PoolOptions.html#b610e568a7b5d3bb27460d6e35952b7e">00130</a> <span class="keywordtype">bool</span> <a class="code" href="structPassenger_1_1PoolOptions.html#b610e568a7b5d3bb27460d6e35952b7e" title="Whether to use a global queue instead of a per-backend process queue.">useGlobalQueue</a>;
|
147
|
+
<a name="l00131"></a>00131 <span class="comment"></span>
|
148
|
+
<a name="l00132"></a>00132 <span class="comment"> /**</span>
|
149
|
+
<a name="l00133"></a>00133 <span class="comment"> * A throttling rate for file stats. When set to a non-zero value N,</span>
|
150
|
+
<a name="l00134"></a>00134 <span class="comment"> * restart.txt and other files which are usually stat()ted on every</span>
|
151
|
+
<a name="l00135"></a>00135 <span class="comment"> * ApplicationPool::get() call will be stat()ed at most every N seconds.</span>
|
152
|
+
<a name="l00136"></a>00136 <span class="comment"> */</span>
|
153
|
+
<a name="l00137"></a><a class="code" href="structPassenger_1_1PoolOptions.html#eaf5a998b4a5da2246685c2dfb8a8c6d">00137</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="structPassenger_1_1PoolOptions.html#eaf5a998b4a5da2246685c2dfb8a8c6d" title="A throttling rate for file stats.">statThrottleRate</a>;
|
154
|
+
<a name="l00138"></a>00138 <span class="comment"></span>
|
155
|
+
<a name="l00139"></a>00139 <span class="comment"> /**</span>
|
156
|
+
<a name="l00140"></a>00140 <span class="comment"> * The directory which contains restart.txt and always_restart.txt.</span>
|
157
|
+
<a name="l00141"></a>00141 <span class="comment"> * An empty string means that the default directory should be used.</span>
|
158
|
+
<a name="l00142"></a>00142 <span class="comment"> */</span>
|
159
|
+
<a name="l00143"></a><a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5">00143</a> <span class="keywordtype">string</span> <a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a>;
|
160
|
+
<a name="l00144"></a>00144 <span class="comment"></span>
|
161
|
+
<a name="l00145"></a>00145 <span class="comment"> /**</span>
|
162
|
+
<a name="l00146"></a>00146 <span class="comment"> * Creates a new PoolOptions object with the default values filled in.</span>
|
163
|
+
<a name="l00147"></a>00147 <span class="comment"> * One must still set appRoot manually, after having used this constructor.</span>
|
164
|
+
<a name="l00148"></a>00148 <span class="comment"> */</span>
|
165
|
+
<a name="l00149"></a><a class="code" href="structPassenger_1_1PoolOptions.html#b2b7c72144c108657e3ad4ac9f6e26f4">00149</a> <a class="code" href="structPassenger_1_1PoolOptions.html#b2b7c72144c108657e3ad4ac9f6e26f4" title="Creates a new PoolOptions object with the default values filled in.">PoolOptions</a>() {
|
166
|
+
<a name="l00150"></a>00150 <a class="code" href="structPassenger_1_1PoolOptions.html#7feed1c0a150ffc9bd003f5535d675db" title="Whether to lower the application&#39;s privileges.">lowerPrivilege</a> = <span class="keyword">true</span>;
|
167
|
+
<a name="l00151"></a>00151 <a class="code" href="structPassenger_1_1PoolOptions.html#ec92a9f5d0a265a77fbfdb549f39557a" title="The user to fallback to if lowering privilege fails.">lowestUser</a> = <span class="stringliteral">"nobody"</span>;
|
168
|
+
<a name="l00152"></a>00152 <a class="code" href="structPassenger_1_1PoolOptions.html#4324bb724859905f9991faa9b90aedbc" title="The RAILS_ENV/RACK_ENV environment that should be used.">environment</a> = <span class="stringliteral">"production"</span>;
|
169
|
+
<a name="l00153"></a>00153 <a class="code" href="structPassenger_1_1PoolOptions.html#feb629e3ced79f5a2dbccc1beeeeab9e" title="The spawn method to use.">spawnMethod</a> = <span class="stringliteral">"smart"</span>;
|
170
|
+
<a name="l00154"></a>00154 <a class="code" href="structPassenger_1_1PoolOptions.html#5e1c129ae0b8be350c7ed238eec8a8c9" title="The application type.">appType</a> = <span class="stringliteral">"rails"</span>;
|
171
|
+
<a name="l00155"></a>00155 <a class="code" href="structPassenger_1_1PoolOptions.html#cbbea86958b42ffa7989680ed1587c70" title="The idle timeout, in seconds, of Rails framework spawners.">frameworkSpawnerTimeout</a> = -1;
|
172
|
+
<a name="l00156"></a>00156 <a class="code" href="structPassenger_1_1PoolOptions.html#5a2f27a853e33c22da71430216d798cf" title="The idle timeout, in seconds, of Rails application spawners.">appSpawnerTimeout</a> = -1;
|
173
|
+
<a name="l00157"></a>00157 <a class="code" href="structPassenger_1_1PoolOptions.html#70251ed3cb3713cb26a0b166c6b015c0" title="The maximum number of requests that the spawned application may process before exiting...">maxRequests</a> = 0;
|
174
|
+
<a name="l00158"></a>00158 <a class="code" href="structPassenger_1_1PoolOptions.html#f61aa527e17a4f2bb5d66260749d17cd" title="The maximum amount of memory (in MB) the spawned application may use.">memoryLimit</a> = 0;
|
175
|
+
<a name="l00159"></a>00159 <a class="code" href="structPassenger_1_1PoolOptions.html#b610e568a7b5d3bb27460d6e35952b7e" title="Whether to use a global queue instead of a per-backend process queue.">useGlobalQueue</a> = <span class="keyword">false</span>;
|
176
|
+
<a name="l00160"></a>00160 <a class="code" href="structPassenger_1_1PoolOptions.html#eaf5a998b4a5da2246685c2dfb8a8c6d" title="A throttling rate for file stats.">statThrottleRate</a> = 0;
|
177
|
+
<a name="l00161"></a>00161 }
|
178
|
+
<a name="l00162"></a>00162 <span class="comment"></span>
|
179
|
+
<a name="l00163"></a>00163 <span class="comment"> /**</span>
|
180
|
+
<a name="l00164"></a>00164 <span class="comment"> * Creates a new PoolOptions object with the given values.</span>
|
181
|
+
<a name="l00165"></a>00165 <span class="comment"> */</span>
|
182
|
+
<a name="l00166"></a><a class="code" href="structPassenger_1_1PoolOptions.html#038861a1ee8bda738325c38ce511347d">00166</a> <a class="code" href="structPassenger_1_1PoolOptions.html#b2b7c72144c108657e3ad4ac9f6e26f4" title="Creates a new PoolOptions object with the default values filled in.">PoolOptions</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &<a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a>,
|
183
|
+
<a name="l00167"></a>00167 <span class="keywordtype">bool</span> <a class="code" href="structPassenger_1_1PoolOptions.html#7feed1c0a150ffc9bd003f5535d675db" title="Whether to lower the application&#39;s privileges.">lowerPrivilege</a> = <span class="keyword">true</span>,
|
184
|
+
<a name="l00168"></a>00168 <span class="keyword">const</span> <span class="keywordtype">string</span> &<a class="code" href="structPassenger_1_1PoolOptions.html#ec92a9f5d0a265a77fbfdb549f39557a" title="The user to fallback to if lowering privilege fails.">lowestUser</a> = <span class="stringliteral">"nobody"</span>,
|
185
|
+
<a name="l00169"></a>00169 <span class="keyword">const</span> <span class="keywordtype">string</span> &<a class="code" href="structPassenger_1_1PoolOptions.html#4324bb724859905f9991faa9b90aedbc" title="The RAILS_ENV/RACK_ENV environment that should be used.">environment</a> = <span class="stringliteral">"production"</span>,
|
186
|
+
<a name="l00170"></a>00170 <span class="keyword">const</span> <span class="keywordtype">string</span> &<a class="code" href="structPassenger_1_1PoolOptions.html#feb629e3ced79f5a2dbccc1beeeeab9e" title="The spawn method to use.">spawnMethod</a> = <span class="stringliteral">"smart"</span>,
|
187
|
+
<a name="l00171"></a>00171 <span class="keyword">const</span> <span class="keywordtype">string</span> &<a class="code" href="structPassenger_1_1PoolOptions.html#5e1c129ae0b8be350c7ed238eec8a8c9" title="The application type.">appType</a> = <span class="stringliteral">"rails"</span>,
|
188
|
+
<a name="l00172"></a>00172 <span class="keywordtype">long</span> <a class="code" href="structPassenger_1_1PoolOptions.html#cbbea86958b42ffa7989680ed1587c70" title="The idle timeout, in seconds, of Rails framework spawners.">frameworkSpawnerTimeout</a> = -1,
|
189
|
+
<a name="l00173"></a>00173 <span class="keywordtype">long</span> <a class="code" href="structPassenger_1_1PoolOptions.html#5a2f27a853e33c22da71430216d798cf" title="The idle timeout, in seconds, of Rails application spawners.">appSpawnerTimeout</a> = -1,
|
190
|
+
<a name="l00174"></a>00174 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="structPassenger_1_1PoolOptions.html#70251ed3cb3713cb26a0b166c6b015c0" title="The maximum number of requests that the spawned application may process before exiting...">maxRequests</a> = 0,
|
191
|
+
<a name="l00175"></a>00175 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="structPassenger_1_1PoolOptions.html#f61aa527e17a4f2bb5d66260749d17cd" title="The maximum amount of memory (in MB) the spawned application may use.">memoryLimit</a> = 0,
|
192
|
+
<a name="l00176"></a>00176 <span class="keywordtype">bool</span> <a class="code" href="structPassenger_1_1PoolOptions.html#b610e568a7b5d3bb27460d6e35952b7e" title="Whether to use a global queue instead of a per-backend process queue.">useGlobalQueue</a> = <span class="keyword">false</span>,
|
193
|
+
<a name="l00177"></a>00177 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> <a class="code" href="structPassenger_1_1PoolOptions.html#eaf5a998b4a5da2246685c2dfb8a8c6d" title="A throttling rate for file stats.">statThrottleRate</a> = 0,
|
194
|
+
<a name="l00178"></a>00178 <span class="keyword">const</span> <span class="keywordtype">string</span> &<a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a> = <span class="stringliteral">""</span>
|
195
|
+
<a name="l00179"></a>00179 ) {
|
196
|
+
<a name="l00180"></a>00180 this->appRoot = appRoot;
|
197
|
+
<a name="l00181"></a>00181 this-><a class="code" href="structPassenger_1_1PoolOptions.html#7feed1c0a150ffc9bd003f5535d675db" title="Whether to lower the application&#39;s privileges.">lowerPrivilege</a> = <a class="code" href="structPassenger_1_1PoolOptions.html#7feed1c0a150ffc9bd003f5535d675db" title="Whether to lower the application&#39;s privileges.">lowerPrivilege</a>;
|
198
|
+
<a name="l00182"></a>00182 this-><a class="code" href="structPassenger_1_1PoolOptions.html#ec92a9f5d0a265a77fbfdb549f39557a" title="The user to fallback to if lowering privilege fails.">lowestUser</a> = <a class="code" href="structPassenger_1_1PoolOptions.html#ec92a9f5d0a265a77fbfdb549f39557a" title="The user to fallback to if lowering privilege fails.">lowestUser</a>;
|
199
|
+
<a name="l00183"></a>00183 this-><a class="code" href="structPassenger_1_1PoolOptions.html#4324bb724859905f9991faa9b90aedbc" title="The RAILS_ENV/RACK_ENV environment that should be used.">environment</a> = <a class="code" href="structPassenger_1_1PoolOptions.html#4324bb724859905f9991faa9b90aedbc" title="The RAILS_ENV/RACK_ENV environment that should be used.">environment</a>;
|
200
|
+
<a name="l00184"></a>00184 this-><a class="code" href="structPassenger_1_1PoolOptions.html#feb629e3ced79f5a2dbccc1beeeeab9e" title="The spawn method to use.">spawnMethod</a> = <a class="code" href="structPassenger_1_1PoolOptions.html#feb629e3ced79f5a2dbccc1beeeeab9e" title="The spawn method to use.">spawnMethod</a>;
|
201
|
+
<a name="l00185"></a>00185 this-><a class="code" href="structPassenger_1_1PoolOptions.html#5e1c129ae0b8be350c7ed238eec8a8c9" title="The application type.">appType</a> = <a class="code" href="structPassenger_1_1PoolOptions.html#5e1c129ae0b8be350c7ed238eec8a8c9" title="The application type.">appType</a>;
|
202
|
+
<a name="l00186"></a>00186 this-><a class="code" href="structPassenger_1_1PoolOptions.html#cbbea86958b42ffa7989680ed1587c70" title="The idle timeout, in seconds, of Rails framework spawners.">frameworkSpawnerTimeout</a> = <a class="code" href="structPassenger_1_1PoolOptions.html#cbbea86958b42ffa7989680ed1587c70" title="The idle timeout, in seconds, of Rails framework spawners.">frameworkSpawnerTimeout</a>;
|
203
|
+
<a name="l00187"></a>00187 this-><a class="code" href="structPassenger_1_1PoolOptions.html#5a2f27a853e33c22da71430216d798cf" title="The idle timeout, in seconds, of Rails application spawners.">appSpawnerTimeout</a> = <a class="code" href="structPassenger_1_1PoolOptions.html#5a2f27a853e33c22da71430216d798cf" title="The idle timeout, in seconds, of Rails application spawners.">appSpawnerTimeout</a>;
|
204
|
+
<a name="l00188"></a>00188 this-><a class="code" href="structPassenger_1_1PoolOptions.html#70251ed3cb3713cb26a0b166c6b015c0" title="The maximum number of requests that the spawned application may process before exiting...">maxRequests</a> = <a class="code" href="structPassenger_1_1PoolOptions.html#70251ed3cb3713cb26a0b166c6b015c0" title="The maximum number of requests that the spawned application may process before exiting...">maxRequests</a>;
|
205
|
+
<a name="l00189"></a>00189 this-><a class="code" href="structPassenger_1_1PoolOptions.html#f61aa527e17a4f2bb5d66260749d17cd" title="The maximum amount of memory (in MB) the spawned application may use.">memoryLimit</a> = <a class="code" href="structPassenger_1_1PoolOptions.html#f61aa527e17a4f2bb5d66260749d17cd" title="The maximum amount of memory (in MB) the spawned application may use.">memoryLimit</a>;
|
206
|
+
<a name="l00190"></a>00190 this-><a class="code" href="structPassenger_1_1PoolOptions.html#b610e568a7b5d3bb27460d6e35952b7e" title="Whether to use a global queue instead of a per-backend process queue.">useGlobalQueue</a> = <a class="code" href="structPassenger_1_1PoolOptions.html#b610e568a7b5d3bb27460d6e35952b7e" title="Whether to use a global queue instead of a per-backend process queue.">useGlobalQueue</a>;
|
207
|
+
<a name="l00191"></a>00191 this-><a class="code" href="structPassenger_1_1PoolOptions.html#eaf5a998b4a5da2246685c2dfb8a8c6d" title="A throttling rate for file stats.">statThrottleRate</a> = <a class="code" href="structPassenger_1_1PoolOptions.html#eaf5a998b4a5da2246685c2dfb8a8c6d" title="A throttling rate for file stats.">statThrottleRate</a>;
|
208
|
+
<a name="l00192"></a>00192 this-><a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a> = <a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a>;
|
209
|
+
<a name="l00193"></a>00193 }
|
210
|
+
<a name="l00194"></a>00194 <span class="comment"></span>
|
211
|
+
<a name="l00195"></a>00195 <span class="comment"> /**</span>
|
212
|
+
<a name="l00196"></a>00196 <span class="comment"> * Creates a new PoolOptions object from the given string vector.</span>
|
213
|
+
<a name="l00197"></a>00197 <span class="comment"> * This vector contains information that's written to by toVector().</span>
|
214
|
+
<a name="l00198"></a>00198 <span class="comment"> *</span>
|
215
|
+
<a name="l00199"></a>00199 <span class="comment"> * For example:</span>
|
216
|
+
<a name="l00200"></a>00200 <span class="comment"> * @code</span>
|
217
|
+
<a name="l00201"></a>00201 <span class="comment"> * PoolOptions options(...);</span>
|
218
|
+
<a name="l00202"></a>00202 <span class="comment"> * vector<string> vec;</span>
|
219
|
+
<a name="l00203"></a>00203 <span class="comment"> *</span>
|
220
|
+
<a name="l00204"></a>00204 <span class="comment"> * vec.push_back("my");</span>
|
221
|
+
<a name="l00205"></a>00205 <span class="comment"> * vec.push_back("data");</span>
|
222
|
+
<a name="l00206"></a>00206 <span class="comment"> * options.toVector(vec); // PoolOptions information will start at index 2.</span>
|
223
|
+
<a name="l00207"></a>00207 <span class="comment"> *</span>
|
224
|
+
<a name="l00208"></a>00208 <span class="comment"> * PoolOptions copy(vec, 2);</span>
|
225
|
+
<a name="l00209"></a>00209 <span class="comment"> * @endcode</span>
|
226
|
+
<a name="l00210"></a>00210 <span class="comment"> *</span>
|
227
|
+
<a name="l00211"></a>00211 <span class="comment"> * @param vec The vector containing spawn options information.</span>
|
228
|
+
<a name="l00212"></a>00212 <span class="comment"> * @param startIndex The index in vec at which the information starts.</span>
|
229
|
+
<a name="l00213"></a>00213 <span class="comment"> */</span>
|
230
|
+
<a name="l00214"></a><a class="code" href="structPassenger_1_1PoolOptions.html#eaa4faa9716475b2592c7506d2834ba6">00214</a> <a class="code" href="structPassenger_1_1PoolOptions.html#b2b7c72144c108657e3ad4ac9f6e26f4" title="Creates a new PoolOptions object with the default values filled in.">PoolOptions</a>(<span class="keyword">const</span> vector<string> &vec, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> startIndex = 0) {
|
231
|
+
<a name="l00215"></a>00215 <a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a> = vec[startIndex + 1];
|
232
|
+
<a name="l00216"></a>00216 <a class="code" href="structPassenger_1_1PoolOptions.html#7feed1c0a150ffc9bd003f5535d675db" title="Whether to lower the application&#39;s privileges.">lowerPrivilege</a> = vec[startIndex + 3] == <span class="stringliteral">"true"</span>;
|
233
|
+
<a name="l00217"></a>00217 <a class="code" href="structPassenger_1_1PoolOptions.html#ec92a9f5d0a265a77fbfdb549f39557a" title="The user to fallback to if lowering privilege fails.">lowestUser</a> = vec[startIndex + 5];
|
234
|
+
<a name="l00218"></a>00218 <a class="code" href="structPassenger_1_1PoolOptions.html#4324bb724859905f9991faa9b90aedbc" title="The RAILS_ENV/RACK_ENV environment that should be used.">environment</a> = vec[startIndex + 7];
|
235
|
+
<a name="l00219"></a>00219 <a class="code" href="structPassenger_1_1PoolOptions.html#feb629e3ced79f5a2dbccc1beeeeab9e" title="The spawn method to use.">spawnMethod</a> = vec[startIndex + 9];
|
236
|
+
<a name="l00220"></a>00220 <a class="code" href="structPassenger_1_1PoolOptions.html#5e1c129ae0b8be350c7ed238eec8a8c9" title="The application type.">appType</a> = vec[startIndex + 11];
|
237
|
+
<a name="l00221"></a>00221 <a class="code" href="structPassenger_1_1PoolOptions.html#cbbea86958b42ffa7989680ed1587c70" title="The idle timeout, in seconds, of Rails framework spawners.">frameworkSpawnerTimeout</a> = <a class="code" href="group__Support.html#g7b50461f1bc2b370c956967870da2762" title="Converts the given string to a long integer.">atol</a>(vec[startIndex + 13]);
|
238
|
+
<a name="l00222"></a>00222 <a class="code" href="structPassenger_1_1PoolOptions.html#5a2f27a853e33c22da71430216d798cf" title="The idle timeout, in seconds, of Rails application spawners.">appSpawnerTimeout</a> = <a class="code" href="group__Support.html#g7b50461f1bc2b370c956967870da2762" title="Converts the given string to a long integer.">atol</a>(vec[startIndex + 15]);
|
239
|
+
<a name="l00223"></a>00223 <a class="code" href="structPassenger_1_1PoolOptions.html#70251ed3cb3713cb26a0b166c6b015c0" title="The maximum number of requests that the spawned application may process before exiting...">maxRequests</a> = <a class="code" href="group__Support.html#g7b50461f1bc2b370c956967870da2762" title="Converts the given string to a long integer.">atol</a>(vec[startIndex + 17]);
|
240
|
+
<a name="l00224"></a>00224 <a class="code" href="structPassenger_1_1PoolOptions.html#f61aa527e17a4f2bb5d66260749d17cd" title="The maximum amount of memory (in MB) the spawned application may use.">memoryLimit</a> = <a class="code" href="group__Support.html#g7b50461f1bc2b370c956967870da2762" title="Converts the given string to a long integer.">atol</a>(vec[startIndex + 19]);
|
241
|
+
<a name="l00225"></a>00225 <a class="code" href="structPassenger_1_1PoolOptions.html#b610e568a7b5d3bb27460d6e35952b7e" title="Whether to use a global queue instead of a per-backend process queue.">useGlobalQueue</a> = vec[startIndex + 21] == <span class="stringliteral">"true"</span>;
|
242
|
+
<a name="l00226"></a>00226 <a class="code" href="structPassenger_1_1PoolOptions.html#eaf5a998b4a5da2246685c2dfb8a8c6d" title="A throttling rate for file stats.">statThrottleRate</a> = <a class="code" href="group__Support.html#g7b50461f1bc2b370c956967870da2762" title="Converts the given string to a long integer.">atol</a>(vec[startIndex + 23]);
|
243
|
+
<a name="l00227"></a>00227 <a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a> = vec[startIndex + 25];
|
244
|
+
<a name="l00228"></a>00228 }
|
245
|
+
<a name="l00229"></a>00229 <span class="comment"></span>
|
246
|
+
<a name="l00230"></a>00230 <span class="comment"> /**</span>
|
247
|
+
<a name="l00231"></a>00231 <span class="comment"> * Append the information in this PoolOptions object to the given</span>
|
248
|
+
<a name="l00232"></a>00232 <span class="comment"> * string vector. The resulting array could, for example, be used</span>
|
249
|
+
<a name="l00233"></a>00233 <span class="comment"> * as a message to be sent to the spawn server.</span>
|
250
|
+
<a name="l00234"></a>00234 <span class="comment"> */</span>
|
251
|
+
<a name="l00235"></a><a class="code" href="structPassenger_1_1PoolOptions.html#b5e62e9abf7b89b8d3e5cdfb14e9d2af">00235</a> <span class="keywordtype">void</span> <a class="code" href="structPassenger_1_1PoolOptions.html#b5e62e9abf7b89b8d3e5cdfb14e9d2af" title="Append the information in this PoolOptions object to the given string vector.">toVector</a>(vector<string> &vec)<span class="keyword"> const </span>{
|
252
|
+
<a name="l00236"></a>00236 <span class="keywordflow">if</span> (vec.capacity() < vec.size() + 10) {
|
253
|
+
<a name="l00237"></a>00237 vec.reserve(vec.size() + 10);
|
254
|
+
<a name="l00238"></a>00238 }
|
255
|
+
<a name="l00239"></a>00239 appendKeyValue (vec, <span class="stringliteral">"app_root"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a>);
|
256
|
+
<a name="l00240"></a>00240 appendKeyValue (vec, <span class="stringliteral">"lower_privilege"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#7feed1c0a150ffc9bd003f5535d675db" title="Whether to lower the application&#39;s privileges.">lowerPrivilege</a> ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>);
|
257
|
+
<a name="l00241"></a>00241 appendKeyValue (vec, <span class="stringliteral">"lowest_user"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#ec92a9f5d0a265a77fbfdb549f39557a" title="The user to fallback to if lowering privilege fails.">lowestUser</a>);
|
258
|
+
<a name="l00242"></a>00242 appendKeyValue (vec, <span class="stringliteral">"environment"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#4324bb724859905f9991faa9b90aedbc" title="The RAILS_ENV/RACK_ENV environment that should be used.">environment</a>);
|
259
|
+
<a name="l00243"></a>00243 appendKeyValue (vec, <span class="stringliteral">"spawn_method"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#feb629e3ced79f5a2dbccc1beeeeab9e" title="The spawn method to use.">spawnMethod</a>);
|
260
|
+
<a name="l00244"></a>00244 appendKeyValue (vec, <span class="stringliteral">"app_type"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#5e1c129ae0b8be350c7ed238eec8a8c9" title="The application type.">appType</a>);
|
261
|
+
<a name="l00245"></a>00245 appendKeyValue2(vec, <span class="stringliteral">"framework_spawner_timeout"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#cbbea86958b42ffa7989680ed1587c70" title="The idle timeout, in seconds, of Rails framework spawners.">frameworkSpawnerTimeout</a>);
|
262
|
+
<a name="l00246"></a>00246 appendKeyValue2(vec, <span class="stringliteral">"app_spawner_timeout"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#5a2f27a853e33c22da71430216d798cf" title="The idle timeout, in seconds, of Rails application spawners.">appSpawnerTimeout</a>);
|
263
|
+
<a name="l00247"></a>00247 appendKeyValue3(vec, <span class="stringliteral">"max_requests"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#70251ed3cb3713cb26a0b166c6b015c0" title="The maximum number of requests that the spawned application may process before exiting...">maxRequests</a>);
|
264
|
+
<a name="l00248"></a>00248 appendKeyValue3(vec, <span class="stringliteral">"memory_limit"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#f61aa527e17a4f2bb5d66260749d17cd" title="The maximum amount of memory (in MB) the spawned application may use.">memoryLimit</a>);
|
265
|
+
<a name="l00249"></a>00249 appendKeyValue (vec, <span class="stringliteral">"use_global_queue"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#b610e568a7b5d3bb27460d6e35952b7e" title="Whether to use a global queue instead of a per-backend process queue.">useGlobalQueue</a> ? <span class="stringliteral">"true"</span> : <span class="stringliteral">"false"</span>);
|
266
|
+
<a name="l00250"></a>00250 appendKeyValue3(vec, <span class="stringliteral">"stat_throttle_rate"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#eaf5a998b4a5da2246685c2dfb8a8c6d" title="A throttling rate for file stats.">statThrottleRate</a>);
|
267
|
+
<a name="l00251"></a>00251 appendKeyValue (vec, <span class="stringliteral">"restart_dir"</span>, <a class="code" href="structPassenger_1_1PoolOptions.html#b0f889f70a3ed22f2423d110ddaf26f5" title="The directory which contains restart.txt and always_restart.txt.">restartDir</a>);
|
268
|
+
<a name="l00252"></a>00252 }
|
269
|
+
<a name="l00253"></a>00253
|
270
|
+
<a name="l00254"></a>00254 <span class="keyword">private</span>:
|
271
|
+
<a name="l00255"></a>00255 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span>
|
272
|
+
<a name="l00256"></a>00256 appendKeyValue(vector<string> &vec, <span class="keyword">const</span> <span class="keywordtype">char</span> *key, <span class="keyword">const</span> <span class="keywordtype">string</span> &value) {
|
273
|
+
<a name="l00257"></a>00257 vec.push_back(key);
|
274
|
+
<a name="l00258"></a>00258 vec.push_back(const_cast<string &>(value));
|
275
|
+
<a name="l00259"></a>00259 }
|
276
|
+
<a name="l00260"></a>00260
|
277
|
+
<a name="l00261"></a>00261 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span>
|
278
|
+
<a name="l00262"></a>00262 appendKeyValue(vector<string> &vec, <span class="keyword">const</span> <span class="keywordtype">char</span> *key, <span class="keyword">const</span> <span class="keywordtype">char</span> *value) {
|
279
|
+
<a name="l00263"></a>00263 vec.push_back(key);
|
280
|
+
<a name="l00264"></a>00264 vec.push_back(value);
|
281
|
+
<a name="l00265"></a>00265 }
|
282
|
+
<a name="l00266"></a>00266
|
283
|
+
<a name="l00267"></a>00267 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span>
|
284
|
+
<a name="l00268"></a>00268 appendKeyValue2(vector<string> &vec, <span class="keyword">const</span> <span class="keywordtype">char</span> *key, <span class="keywordtype">long</span> value) {
|
285
|
+
<a name="l00269"></a>00269 vec.push_back(key);
|
286
|
+
<a name="l00270"></a>00270 vec.push_back(<a class="code" href="group__Support.html#gf6fab368d70c18fdf16bf5a24f630407" title="Convert anything to a string.">toString</a>(value));
|
287
|
+
<a name="l00271"></a>00271 }
|
288
|
+
<a name="l00272"></a>00272
|
289
|
+
<a name="l00273"></a>00273 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">void</span>
|
290
|
+
<a name="l00274"></a>00274 appendKeyValue3(vector<string> &vec, <span class="keyword">const</span> <span class="keywordtype">char</span> *key, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> value) {
|
291
|
+
<a name="l00275"></a>00275 vec.push_back(key);
|
292
|
+
<a name="l00276"></a>00276 vec.push_back(<a class="code" href="group__Support.html#gf6fab368d70c18fdf16bf5a24f630407" title="Convert anything to a string.">toString</a>(value));
|
293
|
+
<a name="l00277"></a>00277 }
|
294
|
+
<a name="l00278"></a>00278 };
|
295
|
+
<a name="l00279"></a>00279
|
296
|
+
<a name="l00280"></a>00280 } <span class="comment">// namespace Passenger</span>
|
297
|
+
<a name="l00281"></a>00281
|
298
|
+
<a name="l00282"></a>00282 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_SPAWN_OPTIONS_H_ */</span>
|
299
|
+
<a name="l00283"></a>00283
|
300
|
+
</pre></div></div>
|
301
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Fri Mar 13 19:24:32 2009 for Passenger by
|
302
|
+
<a href="http://www.doxygen.org/index.html">
|
303
|
+
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.5 </small></address>
|
304
|
+
</body>
|
305
|
+
</html>
|
@@ -10,7 +10,6 @@
|
|
10
10
|
<ul>
|
11
11
|
<li><a href="main.html"><span>Main Page</span></a></li>
|
12
12
|
<li><a href="modules.html"><span>Modules</span></a></li>
|
13
|
-
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
|
14
13
|
<li><a href="annotated.html"><span>Classes</span></a></li>
|
15
14
|
<li class="current"><a href="files.html"><span>Files</span></a></li>
|
16
15
|
</ul>
|
@@ -41,552 +40,528 @@
|
|
41
40
|
<a name="l00024"></a>00024 <span class="preprocessor">#include <list></span>
|
42
41
|
<a name="l00025"></a>00025 <span class="preprocessor">#include <boost/shared_ptr.hpp></span>
|
43
42
|
<a name="l00026"></a>00026 <span class="preprocessor">#include <boost/thread.hpp></span>
|
44
|
-
<a name="l00027"></a>00027
|
45
|
-
<a name="l00028"></a>00028 <span class="preprocessor">#include <
|
46
|
-
<a name="l00029"></a>00029
|
47
|
-
<a name="l00030"></a>00030 <span class="preprocessor">#include <sys/
|
48
|
-
<a name="l00031"></a>00031 <span class="preprocessor">#include <
|
49
|
-
<a name="l00032"></a>00032 <span class="preprocessor">#include <
|
50
|
-
<a name="l00033"></a>00033 <span class="preprocessor">#include <
|
51
|
-
<a name="l00034"></a>00034 <span class="preprocessor">#include <
|
52
|
-
<a name="l00035"></a>00035 <span class="preprocessor">#include <
|
53
|
-
<a name="l00036"></a>00036 <span class="preprocessor">#include <
|
54
|
-
<a name="l00037"></a>00037 <span class="preprocessor">#include <
|
55
|
-
<a name="l00038"></a>00038
|
56
|
-
<a name="l00039"></a>00039 <span class="preprocessor">#include
|
57
|
-
<a name="l00040"></a>00040 <span class="preprocessor">#include
|
58
|
-
<a name="l00041"></a>00041
|
59
|
-
<a name="l00042"></a>00042 <span class="preprocessor">#include "
|
60
|
-
<a name="l00043"></a>00043 <span class="preprocessor">#include "
|
61
|
-
<a name="l00044"></a>00044
|
62
|
-
<a name="l00045"></a>00045 <span class="
|
63
|
-
<a name="l00046"></a>00046
|
64
|
-
<a name="l00047"></a>00047
|
65
|
-
<a name="l00048"></a>00048 <span class="keyword">
|
66
|
-
<a name="l00049"></a>00049
|
67
|
-
<a name="l00050"></a>00050 <span class="
|
68
|
-
<a name="l00051"></a>00051 <span class="
|
69
|
-
<a name="l00052"></a>00052 <span class="
|
70
|
-
<a name="l00053"></a>00053 <span class="comment"
|
71
|
-
<a name="l00054"></a>00054 <span class="comment"
|
72
|
-
<a name="l00055"></a>00055 <span class="comment">
|
73
|
-
<a name="l00056"></a>00056 <span class="comment">
|
74
|
-
<a name="l00057"></a>00057 <span class="comment">
|
75
|
-
<a name="l00058"></a>00058 <span class="comment"> *
|
76
|
-
<a name="l00059"></a>00059 <span class="comment">
|
77
|
-
<a name="l00060"></a>00060 <span class="comment"> *
|
78
|
-
<a name="l00061"></a>00061 <span class="comment">
|
79
|
-
<a name="l00062"></a>00062 <span class="comment"> *
|
80
|
-
<a name="l00063"></a>00063 <span class="comment"> *
|
81
|
-
<a name="l00064"></a>00064 <span class="comment">
|
82
|
-
<a name="l00065"></a>00065 <span class="comment"> *
|
83
|
-
<a name="l00066"></a>00066 <span class="comment"> *
|
84
|
-
<a name="l00067"></a>00067 <span class="comment">
|
85
|
-
<a name="l00068"></a>00068 <span class="comment">
|
86
|
-
<a name="l00069"></a>00069 <span class="comment"> *
|
87
|
-
<a name="l00070"></a>00070 <span class="comment"> *
|
43
|
+
<a name="l00027"></a>00027 <span class="preprocessor">#include <oxt/system_calls.hpp></span>
|
44
|
+
<a name="l00028"></a>00028 <span class="preprocessor">#include <oxt/backtrace.hpp></span>
|
45
|
+
<a name="l00029"></a>00029
|
46
|
+
<a name="l00030"></a>00030 <span class="preprocessor">#include <sys/types.h></span>
|
47
|
+
<a name="l00031"></a>00031 <span class="preprocessor">#include <sys/wait.h></span>
|
48
|
+
<a name="l00032"></a>00032 <span class="preprocessor">#include <sys/stat.h></span>
|
49
|
+
<a name="l00033"></a>00033 <span class="preprocessor">#include <arpa/inet.h></span>
|
50
|
+
<a name="l00034"></a>00034 <span class="preprocessor">#include <cstdio></span>
|
51
|
+
<a name="l00035"></a>00035 <span class="preprocessor">#include <cstdarg></span>
|
52
|
+
<a name="l00036"></a>00036 <span class="preprocessor">#include <unistd.h></span>
|
53
|
+
<a name="l00037"></a>00037 <span class="preprocessor">#include <errno.h></span>
|
54
|
+
<a name="l00038"></a>00038 <span class="preprocessor">#include <grp.h></span>
|
55
|
+
<a name="l00039"></a>00039 <span class="preprocessor">#include <pwd.h></span>
|
56
|
+
<a name="l00040"></a>00040 <span class="preprocessor">#include <signal.h></span>
|
57
|
+
<a name="l00041"></a>00041
|
58
|
+
<a name="l00042"></a>00042 <span class="preprocessor">#include "Application.h"</span>
|
59
|
+
<a name="l00043"></a>00043 <span class="preprocessor">#include "PoolOptions.h"</span>
|
60
|
+
<a name="l00044"></a>00044 <span class="preprocessor">#include "MessageChannel.h"</span>
|
61
|
+
<a name="l00045"></a>00045 <span class="preprocessor">#include "Exceptions.h"</span>
|
62
|
+
<a name="l00046"></a>00046 <span class="preprocessor">#include "Logging.h"</span>
|
63
|
+
<a name="l00047"></a>00047
|
64
|
+
<a name="l00048"></a>00048 <span class="keyword">namespace </span>Passenger {
|
65
|
+
<a name="l00049"></a>00049
|
66
|
+
<a name="l00050"></a>00050 <span class="keyword">using namespace </span>std;
|
67
|
+
<a name="l00051"></a>00051 <span class="keyword">using namespace </span>boost;
|
68
|
+
<a name="l00052"></a>00052 <span class="keyword">using namespace </span>oxt;
|
69
|
+
<a name="l00053"></a>00053 <span class="comment"></span>
|
70
|
+
<a name="l00054"></a>00054 <span class="comment">/**</span>
|
71
|
+
<a name="l00055"></a>00055 <span class="comment"> * @brief Spawning of Ruby on Rails/Rack application instances.</span>
|
72
|
+
<a name="l00056"></a>00056 <span class="comment"> *</span>
|
73
|
+
<a name="l00057"></a>00057 <span class="comment"> * This class is responsible for spawning new instances of Ruby on Rails or</span>
|
74
|
+
<a name="l00058"></a>00058 <span class="comment"> * Rack applications. Use the spawn() method to do so.</span>
|
75
|
+
<a name="l00059"></a>00059 <span class="comment"> *</span>
|
76
|
+
<a name="l00060"></a>00060 <span class="comment"> * @note This class is fully thread-safe.</span>
|
77
|
+
<a name="l00061"></a>00061 <span class="comment"> *</span>
|
78
|
+
<a name="l00062"></a>00062 <span class="comment"> * <h2>Implementation details</h2></span>
|
79
|
+
<a name="l00063"></a>00063 <span class="comment"> * Internally, this class makes use of a spawn server, which is written in Ruby. This server</span>
|
80
|
+
<a name="l00064"></a>00064 <span class="comment"> * is automatically started when a SpawnManager instance is created, and automatically</span>
|
81
|
+
<a name="l00065"></a>00065 <span class="comment"> * shutdown when that instance is destroyed. The existance of the spawn server is almost</span>
|
82
|
+
<a name="l00066"></a>00066 <span class="comment"> * totally transparent to users of this class. Spawn requests are sent to the server,</span>
|
83
|
+
<a name="l00067"></a>00067 <span class="comment"> * and details about the spawned process is returned.</span>
|
84
|
+
<a name="l00068"></a>00068 <span class="comment"> *</span>
|
85
|
+
<a name="l00069"></a>00069 <span class="comment"> * If the spawn server dies during the middle of an operation, it will be restarted.</span>
|
86
|
+
<a name="l00070"></a>00070 <span class="comment"> * See spawn() for full details.</span>
|
88
87
|
<a name="l00071"></a>00071 <span class="comment"> *</span>
|
89
|
-
<a name="l00072"></a>00072 <span class="comment"> * The
|
90
|
-
<a name="l00073"></a>00073 <span class="comment"> *
|
91
|
-
<a name="l00074"></a>00074 <span class="comment"> *
|
92
|
-
<a name="l00075"></a>00075 <span class="comment">
|
93
|
-
<a name="l00076"></a>00076 <span class="comment"> *
|
94
|
-
<a name="l00077"></a>00077 <span class="comment"> *
|
95
|
-
<a name="l00078"></a>00078 <span class="comment">
|
96
|
-
<a name="l00079"></a>00079 <span class="comment"> *
|
97
|
-
<a name="l00080"></a>00080 <span class="comment">
|
98
|
-
<a name="l00081"></a>00081 <span class="comment"> *
|
99
|
-
<a name="l00082"></a>00082 <span class="comment">
|
100
|
-
<a name="l00083"></a
|
101
|
-
<a name="l00084"></a>00084 <span class="
|
102
|
-
<a name="l00085"></a>00085
|
103
|
-
<a name="l00086"></a>00086
|
104
|
-
<a name="l00087"></a>00087
|
105
|
-
<a name="l00088"></a>00088
|
106
|
-
<a name="l00089"></a>00089 <span class="keywordtype">
|
107
|
-
<a name="l00090"></a>00090
|
108
|
-
<a name="l00091"></a>00091
|
109
|
-
<a name="l00092"></a>00092
|
110
|
-
<a name="l00093"></a>00093
|
111
|
-
<a name="l00094"></a>00094 <
|
112
|
-
<a name="l00095"></a>00095
|
113
|
-
<a name="l00096"></a>00096
|
114
|
-
<a name="l00097"></a>00097
|
115
|
-
<a name="l00098"></a>00098
|
116
|
-
<a name="l00099"></a>00099
|
117
|
-
<a name="l00100"></a>00100
|
118
|
-
<a name="l00101"></a>00101 <span class="comment"
|
119
|
-
<a name="l00102"></a>00102 <span class="comment">
|
120
|
-
<a name="l00103"></a>00103 <span class="comment"> *
|
121
|
-
<a name="l00104"></a>00104 <span class="comment">
|
122
|
-
<a name="l00105"></a>00105
|
123
|
-
<a name="l00106"></a>00106
|
124
|
-
<a name="l00107"></a>00107
|
125
|
-
<a name="l00108"></a>00108
|
126
|
-
<a name="l00109"></a>00109
|
127
|
-
<a name="l00110"></a>00110
|
128
|
-
<a name="l00111"></a>00111
|
129
|
-
<a name="l00112"></a>00112
|
130
|
-
<a name="l00113"></a>00113
|
131
|
-
<a name="l00114"></a>00114
|
132
|
-
<a name="l00115"></a>00115
|
133
|
-
<a name="l00116"></a>00116
|
134
|
-
<a name="l00117"></a>00117
|
135
|
-
<a name="l00118"></a>00118
|
136
|
-
<a name="l00119"></a>00119
|
137
|
-
<a name="l00120"></a>00120
|
138
|
-
<a name="l00121"></a>00121
|
139
|
-
<a name="l00122"></a>00122
|
140
|
-
<a name="l00123"></a>00123
|
141
|
-
<a name="l00124"></a>00124
|
142
|
-
<a name="l00125"></a>00125
|
143
|
-
<a name="l00126"></a>00126
|
144
|
-
<a name="l00127"></a>00127
|
145
|
-
<a name="l00128"></a>00128
|
146
|
-
<a name="l00129"></a>00129
|
147
|
-
<a name="l00130"></a>00130
|
148
|
-
<a name="l00131"></a>00131
|
149
|
-
<a name="l00132"></a>00132
|
150
|
-
<a name="l00133"></a>00133
|
151
|
-
<a name="l00134"></a>00134
|
152
|
-
<a name="l00135"></a>00135
|
153
|
-
<a name="l00136"></a>00136
|
154
|
-
<a name="l00137"></a>00137
|
155
|
-
<a name="l00138"></a>00138
|
156
|
-
<a name="l00139"></a>00139
|
157
|
-
<a name="l00140"></a>00140
|
158
|
-
<a name="l00141"></a>00141
|
159
|
-
<a name="l00142"></a>00142
|
88
|
+
<a name="l00072"></a>00072 <span class="comment"> * The communication channel with the server is anonymous, i.e. no other processes</span>
|
89
|
+
<a name="l00073"></a>00073 <span class="comment"> * can access the communication channel, so communication is guaranteed to be safe</span>
|
90
|
+
<a name="l00074"></a>00074 <span class="comment"> * (unless, of course, if the spawn server itself is a trojan).</span>
|
91
|
+
<a name="l00075"></a>00075 <span class="comment"> *</span>
|
92
|
+
<a name="l00076"></a>00076 <span class="comment"> * The server will try to keep the spawning time as small as possible, by keeping</span>
|
93
|
+
<a name="l00077"></a>00077 <span class="comment"> * corresponding Ruby on Rails frameworks and application code in memory. So the second</span>
|
94
|
+
<a name="l00078"></a>00078 <span class="comment"> * time an instance of the same application is spawned, the spawn time is significantly</span>
|
95
|
+
<a name="l00079"></a>00079 <span class="comment"> * lower than the first time. Nevertheless, spawning is a relatively expensive operation</span>
|
96
|
+
<a name="l00080"></a>00080 <span class="comment"> * (compared to the processing of a typical HTTP request/response), and so should be</span>
|
97
|
+
<a name="l00081"></a>00081 <span class="comment"> * avoided whenever possible.</span>
|
98
|
+
<a name="l00082"></a>00082 <span class="comment"> *</span>
|
99
|
+
<a name="l00083"></a>00083 <span class="comment"> * See the documentation of the spawn server for full implementation details.</span>
|
100
|
+
<a name="l00084"></a>00084 <span class="comment"> *</span>
|
101
|
+
<a name="l00085"></a>00085 <span class="comment"> * @ingroup Support</span>
|
102
|
+
<a name="l00086"></a>00086 <span class="comment"> */</span>
|
103
|
+
<a name="l00087"></a><a class="code" href="classPassenger_1_1SpawnManager.html">00087</a> <span class="keyword">class </span><a class="code" href="classPassenger_1_1SpawnManager.html" title="Spawning of Ruby on Rails/Rack application instances.">SpawnManager</a> {
|
104
|
+
<a name="l00088"></a>00088 <span class="keyword">private</span>:
|
105
|
+
<a name="l00089"></a>00089 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">int</span> SPAWN_SERVER_INPUT_FD = 3;
|
106
|
+
<a name="l00090"></a>00090
|
107
|
+
<a name="l00091"></a>00091 <span class="keywordtype">string</span> spawnServerCommand;
|
108
|
+
<a name="l00092"></a>00092 <span class="keywordtype">string</span> logFile;
|
109
|
+
<a name="l00093"></a>00093 <span class="keywordtype">string</span> rubyCommand;
|
110
|
+
<a name="l00094"></a>00094 <span class="keywordtype">string</span> user;
|
111
|
+
<a name="l00095"></a>00095
|
112
|
+
<a name="l00096"></a>00096 boost::mutex lock;
|
113
|
+
<a name="l00097"></a>00097
|
114
|
+
<a name="l00098"></a>00098 <a class="code" href="classPassenger_1_1MessageChannel.html" title="Convenience class for I/O operations on file descriptors.">MessageChannel</a> channel;
|
115
|
+
<a name="l00099"></a>00099 pid_t pid;
|
116
|
+
<a name="l00100"></a>00100 <span class="keywordtype">bool</span> serverNeedsRestart;
|
117
|
+
<a name="l00101"></a>00101 <span class="comment"></span>
|
118
|
+
<a name="l00102"></a>00102 <span class="comment"> /**</span>
|
119
|
+
<a name="l00103"></a>00103 <span class="comment"> * Restarts the spawn server.</span>
|
120
|
+
<a name="l00104"></a>00104 <span class="comment"> *</span>
|
121
|
+
<a name="l00105"></a>00105 <span class="comment"> * @pre System call interruption is disabled.</span>
|
122
|
+
<a name="l00106"></a>00106 <span class="comment"> * @throws SystemException An error occured while trying to setup the spawn server.</span>
|
123
|
+
<a name="l00107"></a>00107 <span class="comment"> * @throws IOException The specified log file could not be opened.</span>
|
124
|
+
<a name="l00108"></a>00108 <span class="comment"> */</span>
|
125
|
+
<a name="l00109"></a>00109 <span class="keywordtype">void</span> restartServer() {
|
126
|
+
<a name="l00110"></a>00110 TRACE_POINT();
|
127
|
+
<a name="l00111"></a>00111 <span class="keywordflow">if</span> (pid != 0) {
|
128
|
+
<a name="l00112"></a>00112 UPDATE_TRACE_POINT();
|
129
|
+
<a name="l00113"></a>00113 channel.<a class="code" href="classPassenger_1_1MessageChannel.html#06309e208fc5e10642a2e9bbe0f351eb" title="Close the underlying file descriptor.">close</a>();
|
130
|
+
<a name="l00114"></a>00114
|
131
|
+
<a name="l00115"></a>00115 <span class="comment">// Wait at most 5 seconds for the spawn server to exit.</span>
|
132
|
+
<a name="l00116"></a>00116 <span class="comment">// If that doesn't work, kill it, then wait at most 5 seconds</span>
|
133
|
+
<a name="l00117"></a>00117 <span class="comment">// for it to exit.</span>
|
134
|
+
<a name="l00118"></a>00118 time_t begin = syscalls::time(NULL);
|
135
|
+
<a name="l00119"></a>00119 <span class="keywordtype">bool</span> done = <span class="keyword">false</span>;
|
136
|
+
<a name="l00120"></a>00120 <span class="keywordflow">while</span> (!done && syscalls::time(NULL) - begin < 5) {
|
137
|
+
<a name="l00121"></a>00121 <span class="keywordflow">if</span> (syscalls::waitpid(pid, NULL, WNOHANG) > 0) {
|
138
|
+
<a name="l00122"></a>00122 done = <span class="keyword">true</span>;
|
139
|
+
<a name="l00123"></a>00123 } <span class="keywordflow">else</span> {
|
140
|
+
<a name="l00124"></a>00124 syscalls::usleep(100000);
|
141
|
+
<a name="l00125"></a>00125 }
|
142
|
+
<a name="l00126"></a>00126 }
|
143
|
+
<a name="l00127"></a>00127 UPDATE_TRACE_POINT();
|
144
|
+
<a name="l00128"></a>00128 <span class="keywordflow">if</span> (!done) {
|
145
|
+
<a name="l00129"></a>00129 UPDATE_TRACE_POINT();
|
146
|
+
<a name="l00130"></a>00130 P_TRACE(2, <span class="stringliteral">"Spawn server did not exit in time, killing it..."</span>);
|
147
|
+
<a name="l00131"></a>00131 syscalls::kill(pid, SIGTERM);
|
148
|
+
<a name="l00132"></a>00132 begin = syscalls::time(NULL);
|
149
|
+
<a name="l00133"></a>00133 <span class="keywordflow">while</span> (syscalls::time(NULL) - begin < 5) {
|
150
|
+
<a name="l00134"></a>00134 <span class="keywordflow">if</span> (syscalls::waitpid(pid, NULL, WNOHANG) > 0) {
|
151
|
+
<a name="l00135"></a>00135 <span class="keywordflow">break</span>;
|
152
|
+
<a name="l00136"></a>00136 } <span class="keywordflow">else</span> {
|
153
|
+
<a name="l00137"></a>00137 syscalls::usleep(100000);
|
154
|
+
<a name="l00138"></a>00138 }
|
155
|
+
<a name="l00139"></a>00139 }
|
156
|
+
<a name="l00140"></a>00140 P_TRACE(2, <span class="stringliteral">"Spawn server has exited."</span>);
|
157
|
+
<a name="l00141"></a>00141 }
|
158
|
+
<a name="l00142"></a>00142 pid = 0;
|
160
159
|
<a name="l00143"></a>00143 }
|
161
|
-
<a name="l00144"></a>00144
|
162
|
-
<a name="l00145"></a>00145
|
163
|
-
<a name="l00146"></a>00146
|
164
|
-
<a name="l00147"></a>00147
|
165
|
-
<a name="l00148"></a>00148
|
166
|
-
<a name="l00149"></a>00149
|
167
|
-
<a name="l00150"></a>00150
|
168
|
-
<a name="l00151"></a>00151
|
169
|
-
<a name="l00152"></a>00152
|
170
|
-
<a name="l00153"></a>00153
|
171
|
-
<a name="l00154"></a>00154
|
172
|
-
<a name="l00155"></a>00155
|
173
|
-
<a name="l00156"></a>00156
|
174
|
-
<a name="l00157"></a>00157
|
175
|
-
<a name="l00158"></a>00158
|
160
|
+
<a name="l00144"></a>00144
|
161
|
+
<a name="l00145"></a>00145 <span class="keywordtype">int</span> fds[2];
|
162
|
+
<a name="l00146"></a>00146 FILE *logFileHandle = NULL;
|
163
|
+
<a name="l00147"></a>00147
|
164
|
+
<a name="l00148"></a>00148 serverNeedsRestart = <span class="keyword">true</span>;
|
165
|
+
<a name="l00149"></a>00149 <span class="keywordflow">if</span> (syscalls::socketpair(AF_UNIX, SOCK_STREAM, 0, fds) == -1) {
|
166
|
+
<a name="l00150"></a>00150 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a>(<span class="stringliteral">"Cannot create a Unix socket"</span>, errno);
|
167
|
+
<a name="l00151"></a>00151 }
|
168
|
+
<a name="l00152"></a>00152 <span class="keywordflow">if</span> (!logFile.empty()) {
|
169
|
+
<a name="l00153"></a>00153 logFileHandle = syscalls::fopen(logFile.c_str(), <span class="stringliteral">"a"</span>);
|
170
|
+
<a name="l00154"></a>00154 <span class="keywordflow">if</span> (logFileHandle == NULL) {
|
171
|
+
<a name="l00155"></a>00155 <span class="keywordtype">string</span> message(<span class="stringliteral">"Cannot open log file '"</span>);
|
172
|
+
<a name="l00156"></a>00156 message.append(logFile);
|
173
|
+
<a name="l00157"></a>00157 message.append(<span class="stringliteral">"' for writing."</span>);
|
174
|
+
<a name="l00158"></a>00158 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1IOException.html" title="Represents an error that occured during an I/O operation.">IOException</a>(message);
|
176
175
|
<a name="l00159"></a>00159 }
|
177
|
-
<a name="l00160"></a>00160
|
178
|
-
<a name="l00161"></a>00161
|
179
|
-
<a name="l00162"></a>00162
|
180
|
-
<a name="l00163"></a>00163
|
181
|
-
<a name="l00164"></a>00164
|
182
|
-
<a name="l00165"></a>00165
|
183
|
-
<a name="l00166"></a>00166
|
184
|
-
<a name="l00167"></a>00167
|
185
|
-
<a name="l00168"></a>00168
|
186
|
-
<a name="l00169"></a>00169
|
187
|
-
<a name="l00170"></a>00170
|
188
|
-
<a name="l00171"></a>00171
|
189
|
-
<a name="l00172"></a>00172
|
190
|
-
<a name="l00173"></a>00173
|
191
|
-
<a name="l00174"></a>00174
|
192
|
-
<a name="l00175"></a>00175
|
193
|
-
<a name="l00176"></a>00176
|
194
|
-
<a name="l00177"></a>00177
|
195
|
-
<a name="l00178"></a>00178
|
196
|
-
<a name="l00179"></a>00179
|
197
|
-
<a name="l00180"></a>00180
|
198
|
-
<a name="l00181"></a>00181
|
199
|
-
<a name="l00182"></a>00182
|
200
|
-
<a name="l00183"></a>00183 user
|
201
|
-
<a name="l00184"></a>00184
|
202
|
-
<a name="l00185"></a>00185 e)
|
203
|
-
<a name="l00186"></a>00186
|
204
|
-
<a name="l00187"></a>00187
|
205
|
-
<a name="l00188"></a>00188
|
206
|
-
<a name="l00189"></a>00189 <span class="
|
207
|
-
<a name="l00190"></a>00190
|
208
|
-
<a name="l00191"></a>00191
|
209
|
-
<a name="l00192"></a>00192
|
210
|
-
<a name="l00193"></a>00193
|
211
|
-
<a name="l00194"></a>00194
|
212
|
-
<a name="l00195"></a>00195
|
213
|
-
<a name="l00196"></a>00196
|
214
|
-
<a name="l00197"></a>00197
|
215
|
-
<a name="l00198"></a>00198
|
216
|
-
<a name="l00199"></a>00199
|
217
|
-
<a name="l00200"></a>00200
|
218
|
-
<a name="l00201"></a>00201
|
219
|
-
<a name="l00202"></a>00202
|
220
|
-
<a name="l00203"></a>00203
|
221
|
-
<a name="l00204"></a>00204 <span class="
|
222
|
-
<a name="l00205"></a>00205
|
223
|
-
<a name="l00206"></a>00206
|
224
|
-
<a name="l00207"></a>00207
|
225
|
-
<a name="l00208"></a>00208
|
226
|
-
<a name="l00209"></a>00209
|
227
|
-
<a name="l00210"></a>00210
|
228
|
-
<a name="l00211"></a>00211
|
229
|
-
<a name="l00212"></a>00212
|
230
|
-
<a name="l00213"></a>00213
|
231
|
-
<a name="l00214"></a>00214
|
232
|
-
<a name="l00215"></a>00215
|
233
|
-
<a name="l00216"></a>00216
|
234
|
-
<a name="l00217"></a>00217
|
235
|
-
<a name="l00218"></a>00218
|
236
|
-
<a name="l00219"></a>00219
|
237
|
-
<a name="l00220"></a>00220
|
238
|
-
<a name="l00221"></a>00221
|
239
|
-
<a name="l00222"></a>00222
|
240
|
-
<a name="l00223"></a>00223
|
241
|
-
<a name="l00224"></a>00224
|
242
|
-
<a name="l00225"></a>00225
|
243
|
-
<a name="l00226"></a>00226
|
244
|
-
<a name="l00227"></a>00227
|
245
|
-
<a name="l00228"></a>00228
|
246
|
-
<a name="l00229"></a>00229
|
247
|
-
<a name="l00230"></a>00230
|
248
|
-
<a name="l00231"></a>00231
|
249
|
-
<a name="l00232"></a>00232
|
250
|
-
<a name="l00233"></a>00233
|
251
|
-
<a name="l00234"></a>00234
|
252
|
-
<a name="l00235"></a>00235
|
253
|
-
<a name="l00236"></a>00236
|
254
|
-
<a name="l00237"></a>00237
|
255
|
-
<a name="l00238"></a>00238
|
256
|
-
<a name="l00239"></a>00239 <span class="
|
257
|
-
<a name="l00240"></a>00240
|
258
|
-
<a name="l00241"></a>00241
|
259
|
-
<a name="l00242"></a>00242
|
260
|
-
<a name="l00243"></a>00243
|
261
|
-
<a name="l00244"></a>00244 <
|
262
|
-
<a name="l00245"></a>00245 <span class="
|
263
|
-
<a name="l00246"></a>00246
|
264
|
-
<a name="l00247"></a>00247 <span class="
|
265
|
-
<a name="l00248"></a>00248 <span class="
|
266
|
-
<a name="l00249"></a>00249
|
267
|
-
<a name="l00250"></a>00250
|
268
|
-
<a name="l00251"></a>00251
|
269
|
-
<a name="l00252"></a>00252
|
270
|
-
<a name="l00253"></a>00253
|
271
|
-
<a name="l00254"></a>00254
|
272
|
-
<a name="l00255"></a>00255
|
273
|
-
<a name="l00256"></a>00256
|
274
|
-
<a name="l00257"></a>00257
|
275
|
-
<a name="l00258"></a>00258
|
276
|
-
<a name="l00259"></a>00259
|
277
|
-
<a name="l00260"></a>00260
|
278
|
-
<a name="l00261"></a>00261
|
279
|
-
<a name="l00262"></a>00262
|
280
|
-
<a name="l00263"></a>00263
|
281
|
-
<a name="l00264"></a>00264
|
282
|
-
<a name="l00265"></a>00265
|
283
|
-
<a name="l00266"></a>00266
|
284
|
-
<a name="l00267"></a>00267
|
285
|
-
<a name="l00268"></a>00268
|
286
|
-
<a name="l00269"></a>00269
|
287
|
-
<a name="l00270"></a>00270
|
288
|
-
<a name="l00271"></a>00271
|
289
|
-
<a name="l00272"></a>00272 }
|
290
|
-
<a name="l00273"></a>00273
|
291
|
-
<a name="l00274"></a>00274
|
292
|
-
<a name="l00275"></a>00275
|
293
|
-
<a name="l00276"></a>00276
|
294
|
-
<a name="l00277"></a>00277
|
295
|
-
<a name="l00278"></a>00278
|
296
|
-
<a name="l00279"></a>00279 <span class="
|
297
|
-
<a name="l00280"></a>00280
|
298
|
-
<a name="l00281"></a>00281
|
299
|
-
<a name="l00282"></a>00282
|
300
|
-
<a name="l00283"></a>00283
|
301
|
-
<a name="l00284"></a>00284
|
302
|
-
<a name="l00285"></a>00285
|
303
|
-
<a name="l00286"></a>00286
|
304
|
-
<a name="l00287"></a>00287
|
305
|
-
<a name="l00288"></a>00288
|
306
|
-
<a name="l00289"></a>00289
|
307
|
-
<a name="l00290"></a>00290
|
308
|
-
<a name="l00291"></a>00291
|
309
|
-
<a name="l00292"></a>00292
|
310
|
-
<a name="l00293"></a>00293
|
311
|
-
<a name="l00294"></a>00294 <span class="
|
312
|
-
<a name="l00295"></a>00295
|
313
|
-
<a name="l00296"></a>00296
|
314
|
-
<a name="l00297"></a>00297
|
315
|
-
<a name="l00298"></a>00298
|
316
|
-
<a name="l00299"></a>00299 <span class="keywordflow">
|
317
|
-
<a name="l00300"></a>00300
|
318
|
-
<a name="l00301"></a>00301
|
319
|
-
<a name="l00302"></a>00302 <span class="keywordflow">
|
320
|
-
<a name="l00303"></a>00303
|
321
|
-
<a name="l00304"></a>00304 }
|
322
|
-
<a name="l00305"></a>00305
|
323
|
-
<a name="l00306"></a>00306
|
324
|
-
<a name="l00307"></a>00307
|
325
|
-
<a name="l00308"></a>00308
|
326
|
-
<a name="l00309"></a>00309
|
327
|
-
<a name="l00310"></a>00310
|
328
|
-
<a name="l00311"></a>00311
|
329
|
-
<a name="l00312"></a>00312
|
330
|
-
<a name="l00313"></a>00313
|
331
|
-
<a name="l00314"></a>00314
|
332
|
-
<a name="l00315"></a>00315
|
333
|
-
<a name="l00316"></a>00316
|
176
|
+
<a name="l00160"></a>00160 }
|
177
|
+
<a name="l00161"></a>00161
|
178
|
+
<a name="l00162"></a>00162 UPDATE_TRACE_POINT();
|
179
|
+
<a name="l00163"></a>00163 pid = syscalls::fork();
|
180
|
+
<a name="l00164"></a>00164 <span class="keywordflow">if</span> (pid == 0) {
|
181
|
+
<a name="l00165"></a>00165 <span class="keywordflow">if</span> (!logFile.empty()) {
|
182
|
+
<a name="l00166"></a>00166 dup2(fileno(logFileHandle), STDERR_FILENO);
|
183
|
+
<a name="l00167"></a>00167 fclose(logFileHandle);
|
184
|
+
<a name="l00168"></a>00168 }
|
185
|
+
<a name="l00169"></a>00169 dup2(STDERR_FILENO, STDOUT_FILENO);
|
186
|
+
<a name="l00170"></a>00170 dup2(fds[1], SPAWN_SERVER_INPUT_FD);
|
187
|
+
<a name="l00171"></a>00171
|
188
|
+
<a name="l00172"></a>00172 <span class="comment">// Close all unnecessary file descriptors</span>
|
189
|
+
<a name="l00173"></a>00173 <span class="keywordflow">for</span> (<span class="keywordtype">long</span> i = sysconf(_SC_OPEN_MAX) - 1; i > SPAWN_SERVER_INPUT_FD; i--) {
|
190
|
+
<a name="l00174"></a>00174 close(i);
|
191
|
+
<a name="l00175"></a>00175 }
|
192
|
+
<a name="l00176"></a>00176
|
193
|
+
<a name="l00177"></a>00177 <span class="keywordflow">if</span> (!user.empty()) {
|
194
|
+
<a name="l00178"></a>00178 <span class="keyword">struct </span>passwd *entry = getpwnam(user.c_str());
|
195
|
+
<a name="l00179"></a>00179 <span class="keywordflow">if</span> (entry != NULL) {
|
196
|
+
<a name="l00180"></a>00180 <span class="keywordflow">if</span> (initgroups(user.c_str(), entry->pw_gid) != 0) {
|
197
|
+
<a name="l00181"></a>00181 <span class="keywordtype">int</span> e = errno;
|
198
|
+
<a name="l00182"></a>00182 fprintf(stderr, <span class="stringliteral">"*** Passenger: cannot set supplementary "</span>
|
199
|
+
<a name="l00183"></a>00183 <span class="stringliteral">"groups for user %s: %s (%d)\n"</span>,
|
200
|
+
<a name="l00184"></a>00184 user.c_str(),
|
201
|
+
<a name="l00185"></a>00185 strerror(e),
|
202
|
+
<a name="l00186"></a>00186 e);
|
203
|
+
<a name="l00187"></a>00187 }
|
204
|
+
<a name="l00188"></a>00188 <span class="keywordflow">if</span> (setgid(entry->pw_gid) != 0) {
|
205
|
+
<a name="l00189"></a>00189 <span class="keywordtype">int</span> e = errno;
|
206
|
+
<a name="l00190"></a>00190 fprintf(stderr, <span class="stringliteral">"*** Passenger: cannot run spawn "</span>
|
207
|
+
<a name="l00191"></a>00191 <span class="stringliteral">"manager as group %d: %s (%d)\n"</span>,
|
208
|
+
<a name="l00192"></a>00192 entry->pw_gid,
|
209
|
+
<a name="l00193"></a>00193 strerror(e),
|
210
|
+
<a name="l00194"></a>00194 e);
|
211
|
+
<a name="l00195"></a>00195 }
|
212
|
+
<a name="l00196"></a>00196 <span class="keywordflow">if</span> (setuid(entry->pw_uid) != 0) {
|
213
|
+
<a name="l00197"></a>00197 <span class="keywordtype">int</span> e = errno;
|
214
|
+
<a name="l00198"></a>00198 fprintf(stderr, <span class="stringliteral">"*** Passenger: cannot run spawn "</span>
|
215
|
+
<a name="l00199"></a>00199 <span class="stringliteral">"manager as user %s (%d): %s (%d)\n"</span>,
|
216
|
+
<a name="l00200"></a>00200 user.c_str(), entry->pw_uid,
|
217
|
+
<a name="l00201"></a>00201 strerror(e),
|
218
|
+
<a name="l00202"></a>00202 e);
|
219
|
+
<a name="l00203"></a>00203 }
|
220
|
+
<a name="l00204"></a>00204 } <span class="keywordflow">else</span> {
|
221
|
+
<a name="l00205"></a>00205 fprintf(stderr, <span class="stringliteral">"*** Passenger: cannot run spawn manager "</span>
|
222
|
+
<a name="l00206"></a>00206 <span class="stringliteral">"as nonexistant user '%s'.\n"</span>,
|
223
|
+
<a name="l00207"></a>00207 user.c_str());
|
224
|
+
<a name="l00208"></a>00208 }
|
225
|
+
<a name="l00209"></a>00209 fflush(stderr);
|
226
|
+
<a name="l00210"></a>00210 }
|
227
|
+
<a name="l00211"></a>00211
|
228
|
+
<a name="l00212"></a>00212 execlp(rubyCommand.c_str(),
|
229
|
+
<a name="l00213"></a>00213 rubyCommand.c_str(),
|
230
|
+
<a name="l00214"></a>00214 spawnServerCommand.c_str(),
|
231
|
+
<a name="l00215"></a>00215 <span class="comment">// The spawn server changes the process names of the subservers</span>
|
232
|
+
<a name="l00216"></a>00216 <span class="comment">// that it starts, for better usability. However, the process name length</span>
|
233
|
+
<a name="l00217"></a>00217 <span class="comment">// (as shown by ps) is limited. Here, we try to expand that limit by</span>
|
234
|
+
<a name="l00218"></a>00218 <span class="comment">// deliberately passing a useless whitespace string to the spawn server.</span>
|
235
|
+
<a name="l00219"></a>00219 <span class="comment">// This argument is ignored by the spawn server. This works on some</span>
|
236
|
+
<a name="l00220"></a>00220 <span class="comment">// systems, such as Ubuntu Linux.</span>
|
237
|
+
<a name="l00221"></a>00221 <span class="stringliteral">" "</span>,
|
238
|
+
<a name="l00222"></a>00222 (<span class="keywordtype">char</span> *) NULL);
|
239
|
+
<a name="l00223"></a>00223 <span class="keywordtype">int</span> e = errno;
|
240
|
+
<a name="l00224"></a>00224 fprintf(stderr, <span class="stringliteral">"*** Passenger ERROR (%s:%d):\n"</span>
|
241
|
+
<a name="l00225"></a>00225 <span class="stringliteral">"Could not start the spawn server: %s: %s (%d)\n"</span>,
|
242
|
+
<a name="l00226"></a>00226 __FILE__, __LINE__,
|
243
|
+
<a name="l00227"></a>00227 rubyCommand.c_str(), strerror(e), e);
|
244
|
+
<a name="l00228"></a>00228 fflush(stderr);
|
245
|
+
<a name="l00229"></a>00229 _exit(1);
|
246
|
+
<a name="l00230"></a>00230 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pid == -1) {
|
247
|
+
<a name="l00231"></a>00231 <span class="keywordtype">int</span> e = errno;
|
248
|
+
<a name="l00232"></a>00232 syscalls::close(fds[0]);
|
249
|
+
<a name="l00233"></a>00233 syscalls::close(fds[1]);
|
250
|
+
<a name="l00234"></a>00234 <span class="keywordflow">if</span> (logFileHandle != NULL) {
|
251
|
+
<a name="l00235"></a>00235 syscalls::fclose(logFileHandle);
|
252
|
+
<a name="l00236"></a>00236 }
|
253
|
+
<a name="l00237"></a>00237 pid = 0;
|
254
|
+
<a name="l00238"></a>00238 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a>(<span class="stringliteral">"Unable to fork a process"</span>, e);
|
255
|
+
<a name="l00239"></a>00239 } <span class="keywordflow">else</span> {
|
256
|
+
<a name="l00240"></a>00240 syscalls::close(fds[1]);
|
257
|
+
<a name="l00241"></a>00241 <span class="keywordflow">if</span> (!logFile.empty()) {
|
258
|
+
<a name="l00242"></a>00242 syscalls::fclose(logFileHandle);
|
259
|
+
<a name="l00243"></a>00243 }
|
260
|
+
<a name="l00244"></a>00244 channel = <a class="code" href="classPassenger_1_1MessageChannel.html" title="Convenience class for I/O operations on file descriptors.">MessageChannel</a>(fds[0]);
|
261
|
+
<a name="l00245"></a>00245 serverNeedsRestart = <span class="keyword">false</span>;
|
262
|
+
<a name="l00246"></a>00246
|
263
|
+
<a name="l00247"></a>00247 <span class="preprocessor"> #ifdef TESTING_SPAWN_MANAGER</span>
|
264
|
+
<a name="l00248"></a>00248 <span class="preprocessor"></span> <span class="keywordflow">if</span> (nextRestartShouldFail) {
|
265
|
+
<a name="l00249"></a>00249 syscalls::kill(pid, SIGTERM);
|
266
|
+
<a name="l00250"></a>00250 syscalls::usleep(500000);
|
267
|
+
<a name="l00251"></a>00251 }
|
268
|
+
<a name="l00252"></a>00252 <span class="preprocessor"> #endif</span>
|
269
|
+
<a name="l00253"></a>00253 <span class="preprocessor"></span> }
|
270
|
+
<a name="l00254"></a>00254 }
|
271
|
+
<a name="l00255"></a>00255 <span class="comment"></span>
|
272
|
+
<a name="l00256"></a>00256 <span class="comment"> /**</span>
|
273
|
+
<a name="l00257"></a>00257 <span class="comment"> * Send the spawn command to the spawn server.</span>
|
274
|
+
<a name="l00258"></a>00258 <span class="comment"> *</span>
|
275
|
+
<a name="l00259"></a>00259 <span class="comment"> * @param PoolOptions The spawn options to use.</span>
|
276
|
+
<a name="l00260"></a>00260 <span class="comment"> * @return An Application smart pointer, representing the spawned application.</span>
|
277
|
+
<a name="l00261"></a>00261 <span class="comment"> * @throws SpawnException Something went wrong.</span>
|
278
|
+
<a name="l00262"></a>00262 <span class="comment"> */</span>
|
279
|
+
<a name="l00263"></a>00263 ApplicationPtr sendSpawnCommand(<span class="keyword">const</span> <a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a> &<a class="code" href="structPassenger_1_1PoolOptions.html" title="This struct encapsulates information for ApplicationPool::get() and for SpawnManager::spawn()...">PoolOptions</a>) {
|
280
|
+
<a name="l00264"></a>00264 TRACE_POINT();
|
281
|
+
<a name="l00265"></a>00265 vector<string> args;
|
282
|
+
<a name="l00266"></a>00266 <span class="keywordtype">int</span> ownerPipe;
|
283
|
+
<a name="l00267"></a>00267
|
284
|
+
<a name="l00268"></a>00268 <span class="keywordflow">try</span> {
|
285
|
+
<a name="l00269"></a>00269 args.push_back(<span class="stringliteral">"spawn_application"</span>);
|
286
|
+
<a name="l00270"></a>00270 PoolOptions.<a class="code" href="structPassenger_1_1PoolOptions.html#b5e62e9abf7b89b8d3e5cdfb14e9d2af" title="Append the information in this PoolOptions object to the given string vector.">toVector</a>(args);
|
287
|
+
<a name="l00271"></a>00271 channel.<a class="code" href="classPassenger_1_1MessageChannel.html#150f68bc47e060dcc6ca35bee047914d" title="Send an array message, which consists of the given elements, over the underlying...">write</a>(args);
|
288
|
+
<a name="l00272"></a>00272 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &e) {
|
289
|
+
<a name="l00273"></a>00273 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="keywordtype">string</span>(<span class="stringliteral">"Could not write 'spawn_application' "</span>
|
290
|
+
<a name="l00274"></a>00274 <span class="stringliteral">"command to the spawn server: "</span>) + e.<a class="code" href="classPassenger_1_1SystemException.html#0ef41d755fea2c9b1db2252e7c418dc8" title="Returns the system&#39;s error message.">sys</a>());
|
291
|
+
<a name="l00275"></a>00275 }
|
292
|
+
<a name="l00276"></a>00276
|
293
|
+
<a name="l00277"></a>00277 <span class="keywordflow">try</span> {
|
294
|
+
<a name="l00278"></a>00278 UPDATE_TRACE_POINT();
|
295
|
+
<a name="l00279"></a>00279 <span class="comment">// Read status.</span>
|
296
|
+
<a name="l00280"></a>00280 <span class="keywordflow">if</span> (!channel.<a class="code" href="classPassenger_1_1MessageChannel.html#129659b60d1a663337873d2af944431e" title="Read an array message from the underlying file descriptor.">read</a>(args)) {
|
297
|
+
<a name="l00281"></a>00281 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="stringliteral">"The spawn server has exited unexpectedly."</span>);
|
298
|
+
<a name="l00282"></a>00282 }
|
299
|
+
<a name="l00283"></a>00283 <span class="keywordflow">if</span> (args.size() != 1) {
|
300
|
+
<a name="l00284"></a>00284 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="stringliteral">"The spawn server sent an invalid message."</span>);
|
301
|
+
<a name="l00285"></a>00285 }
|
302
|
+
<a name="l00286"></a>00286 <span class="keywordflow">if</span> (args[0] == <span class="stringliteral">"error_page"</span>) {
|
303
|
+
<a name="l00287"></a>00287 <span class="keywordtype">string</span> errorPage;
|
304
|
+
<a name="l00288"></a>00288
|
305
|
+
<a name="l00289"></a>00289 <span class="keywordflow">if</span> (!channel.<a class="code" href="classPassenger_1_1MessageChannel.html#4ce6a0e751b5e3563bee583c231569bc" title="Read a scalar message from the underlying file descriptor.">readScalar</a>(errorPage)) {
|
306
|
+
<a name="l00290"></a>00290 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="stringliteral">"The spawn server has exited unexpectedly."</span>);
|
307
|
+
<a name="l00291"></a>00291 }
|
308
|
+
<a name="l00292"></a>00292 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="stringliteral">"An error occured while spawning the application."</span>,
|
309
|
+
<a name="l00293"></a>00293 errorPage);
|
310
|
+
<a name="l00294"></a>00294 } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (args[0] != <span class="stringliteral">"ok"</span>) {
|
311
|
+
<a name="l00295"></a>00295 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="stringliteral">"The spawn server sent an invalid message."</span>);
|
312
|
+
<a name="l00296"></a>00296 }
|
313
|
+
<a name="l00297"></a>00297
|
314
|
+
<a name="l00298"></a>00298 <span class="comment">// Read application info.</span>
|
315
|
+
<a name="l00299"></a>00299 <span class="keywordflow">if</span> (!channel.<a class="code" href="classPassenger_1_1MessageChannel.html#129659b60d1a663337873d2af944431e" title="Read an array message from the underlying file descriptor.">read</a>(args)) {
|
316
|
+
<a name="l00300"></a>00300 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="stringliteral">"The spawn server has exited unexpectedly."</span>);
|
317
|
+
<a name="l00301"></a>00301 }
|
318
|
+
<a name="l00302"></a>00302 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &e) {
|
319
|
+
<a name="l00303"></a>00303 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="keywordtype">string</span>(<span class="stringliteral">"Could not read from the spawn server: "</span>) + e.<a class="code" href="classPassenger_1_1SystemException.html#0ef41d755fea2c9b1db2252e7c418dc8" title="Returns the system&#39;s error message.">sys</a>());
|
320
|
+
<a name="l00304"></a>00304 }
|
321
|
+
<a name="l00305"></a>00305
|
322
|
+
<a name="l00306"></a>00306 UPDATE_TRACE_POINT();
|
323
|
+
<a name="l00307"></a>00307 <span class="keywordflow">try</span> {
|
324
|
+
<a name="l00308"></a>00308 ownerPipe = channel.<a class="code" href="classPassenger_1_1MessageChannel.html#1561b7e4a0f4d39ea431f456e5655488" title="Receive a file descriptor, which had been passed over the underlying file descriptor...">readFileDescriptor</a>();
|
325
|
+
<a name="l00309"></a>00309 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &e) {
|
326
|
+
<a name="l00310"></a>00310 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="keywordtype">string</span>(<span class="stringliteral">"Could not receive the spawned "</span>
|
327
|
+
<a name="l00311"></a>00311 <span class="stringliteral">"application's owner pipe from the spawn server: "</span>) +
|
328
|
+
<a name="l00312"></a>00312 e.<a class="code" href="classPassenger_1_1SystemException.html#0ef41d755fea2c9b1db2252e7c418dc8" title="Returns the system&#39;s error message.">sys</a>());
|
329
|
+
<a name="l00313"></a>00313 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1IOException.html" title="Represents an error that occured during an I/O operation.">IOException</a> &e) {
|
330
|
+
<a name="l00314"></a>00314 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="keywordtype">string</span>(<span class="stringliteral">"Could not receive the spawned "</span>
|
331
|
+
<a name="l00315"></a>00315 <span class="stringliteral">"application's owner pipe from the spawn server: "</span>) +
|
332
|
+
<a name="l00316"></a>00316 e.<a class="code" href="classPassenger_1_1IOException.html#1b65d0fdb9bc5136f5b7df759c14768a">what</a>());
|
334
333
|
<a name="l00317"></a>00317 }
|
335
334
|
<a name="l00318"></a>00318
|
336
|
-
<a name="l00319"></a>00319
|
337
|
-
<a name="l00320"></a>00320
|
338
|
-
<a name="l00321"></a>00321
|
339
|
-
<a name="l00322"></a>00322
|
340
|
-
<a name="l00323"></a>00323
|
341
|
-
<a name="l00324"></a>00324
|
342
|
-
<a name="l00325"></a>00325
|
343
|
-
<a name="l00326"></a>00326
|
344
|
-
<a name="l00327"></a>00327
|
345
|
-
<a name="l00328"></a>00328
|
346
|
-
<a name="l00329"></a>00329
|
347
|
-
<a name="l00330"></a>00330
|
348
|
-
<a name="l00331"></a>00331
|
349
|
-
<a name="l00332"></a>00332
|
350
|
-
<a name="l00333"></a>00333
|
351
|
-
<a name="l00334"></a>00334
|
352
|
-
<a name="l00335"></a>00335 <span class="
|
353
|
-
<a name="l00336"></a>00336
|
354
|
-
<a name="l00337"></a>00337 <span class="
|
355
|
-
<a name="l00338"></a>00338
|
356
|
-
<a name="l00339"></a>00339
|
357
|
-
<a name="l00340"></a>00340
|
358
|
-
<a name="l00341"></a>00341
|
359
|
-
<a name="l00342"></a>00342
|
360
|
-
<a name="l00343"></a>00343
|
361
|
-
<a name="l00344"></a>00344
|
362
|
-
<a name="l00345"></a>00345
|
363
|
-
<a name="l00346"></a>00346
|
364
|
-
<a name="l00347"></a>00347
|
365
|
-
<a name="l00348"></a>00348
|
366
|
-
<a name="l00349"></a>00349
|
367
|
-
<a name="l00350"></a>00350
|
368
|
-
<a name="l00351"></a>00351
|
369
|
-
<a name="l00352"></a>00352
|
370
|
-
<a name="l00353"></a>00353
|
371
|
-
<a name="l00354"></a>00354
|
372
|
-
<a name="l00355"></a>00355
|
373
|
-
<a name="l00356"></a>00356
|
374
|
-
<a name="l00357"></a>00357 <span class="keywordflow">
|
375
|
-
<a name="l00358"></a>00358 <span class="
|
376
|
-
<a name="l00359"></a>00359
|
377
|
-
<a name="l00360"></a>00360 }
|
378
|
-
<a name="l00361"></a>00361
|
379
|
-
<a name="l00362"></a>00362
|
380
|
-
<a name="l00363"></a>00363
|
381
|
-
<a name="l00364"></a>00364
|
382
|
-
<a name="l00365"></a>00365
|
383
|
-
<a name="l00366"></a>00366
|
384
|
-
<a name="l00367"></a>00367
|
385
|
-
<a name="l00368"></a>00368 <span class="comment">
|
386
|
-
<a name="l00369"></a>00369 <span class="comment"> *
|
387
|
-
<a name="l00370"></a>00370 <span class="comment">
|
388
|
-
<a name="l00371"></a>00371
|
389
|
-
<a name="l00372"></a>00372
|
390
|
-
<a name="l00373"></a>00373
|
391
|
-
<a name="l00374"></a>00374
|
392
|
-
<a name="l00375"></a>00375
|
393
|
-
<a name="l00376"></a>00376
|
394
|
-
<a name="l00377"></a>00377
|
395
|
-
<a name="l00378"></a>00378
|
396
|
-
<a name="l00379"></a>00379
|
397
|
-
<a name="l00380"></a>00380
|
398
|
-
<a name="l00381"></a>00381
|
399
|
-
<a name="l00382"></a>00382
|
400
|
-
<a name="l00383"></a>00383
|
401
|
-
<a name="l00384"></a>00384
|
402
|
-
<a name="l00385"></a>00385
|
403
|
-
<a name="l00386"></a>00386
|
404
|
-
<a name="l00387"></a>00387
|
405
|
-
<a name="l00388"></a>00388 P_DEBUG(<span class="stringliteral">"
|
406
|
-
<a name="l00389"></a>00389
|
407
|
-
<a name="l00390"></a>00390
|
408
|
-
<a name="l00391"></a>00391
|
409
|
-
<a name="l00392"></a>00392
|
410
|
-
<a name="l00393"></a>00393
|
411
|
-
<a name="l00394"></a>00394
|
412
|
-
<a name="l00395"></a>00395
|
413
|
-
<a name="l00396"></a>00396
|
414
|
-
<a name="l00397"></a>00397
|
335
|
+
<a name="l00319"></a>00319 <span class="keywordflow">if</span> (args.size() != 3) {
|
336
|
+
<a name="l00320"></a>00320 UPDATE_TRACE_POINT();
|
337
|
+
<a name="l00321"></a>00321 syscalls::close(ownerPipe);
|
338
|
+
<a name="l00322"></a>00322 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="stringliteral">"The spawn server sent an invalid message."</span>);
|
339
|
+
<a name="l00323"></a>00323 }
|
340
|
+
<a name="l00324"></a>00324
|
341
|
+
<a name="l00325"></a>00325 pid_t pid = <a class="code" href="group__Support.html#g73b17b509ee44938a56bf16cbf82fb48" title="Converts the given string to an integer.">atoi</a>(args[0]);
|
342
|
+
<a name="l00326"></a>00326
|
343
|
+
<a name="l00327"></a>00327 UPDATE_TRACE_POINT();
|
344
|
+
<a name="l00328"></a>00328 <span class="keywordflow">if</span> (args[2] == <span class="stringliteral">"unix"</span>) {
|
345
|
+
<a name="l00329"></a>00329 <span class="keywordtype">int</span> ret;
|
346
|
+
<a name="l00330"></a>00330 <span class="keywordflow">do</span> {
|
347
|
+
<a name="l00331"></a>00331 ret = chmod(args[1].c_str(), S_IRUSR | S_IWUSR);
|
348
|
+
<a name="l00332"></a>00332 } <span class="keywordflow">while</span> (ret == -1 && errno == EINTR);
|
349
|
+
<a name="l00333"></a>00333 <span class="keywordflow">do</span> {
|
350
|
+
<a name="l00334"></a>00334 ret = chown(args[1].c_str(), getuid(), getgid());
|
351
|
+
<a name="l00335"></a>00335 } <span class="keywordflow">while</span> (ret == -1 && errno == EINTR);
|
352
|
+
<a name="l00336"></a>00336 }
|
353
|
+
<a name="l00337"></a>00337 <span class="keywordflow">return</span> ApplicationPtr(<span class="keyword">new</span> <a class="code" href="classPassenger_1_1Application.html" title="Represents a single Ruby on Rails or Rack application instance.">Application</a>(PoolOptions.<a class="code" href="structPassenger_1_1PoolOptions.html#822039d204b48d9ed49184646734acf3" title="The root directory of the application to spawn.">appRoot</a>,
|
354
|
+
<a name="l00338"></a>00338 pid, args[1], args[2], ownerPipe));
|
355
|
+
<a name="l00339"></a>00339 }
|
356
|
+
<a name="l00340"></a>00340 <span class="comment"></span>
|
357
|
+
<a name="l00341"></a>00341 <span class="comment"> /**</span>
|
358
|
+
<a name="l00342"></a>00342 <span class="comment"> * @throws boost::thread_interrupted</span>
|
359
|
+
<a name="l00343"></a>00343 <span class="comment"> */</span>
|
360
|
+
<a name="l00344"></a>00344 ApplicationPtr
|
361
|
+
<a name="l00345"></a>00345 handleSpawnException(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a> &e, <span class="keyword">const</span> PoolOptions &PoolOptions) {
|
362
|
+
<a name="l00346"></a>00346 TRACE_POINT();
|
363
|
+
<a name="l00347"></a>00347 <span class="keywordtype">bool</span> restarted;
|
364
|
+
<a name="l00348"></a>00348 <span class="keywordflow">try</span> {
|
365
|
+
<a name="l00349"></a>00349 P_DEBUG(<span class="stringliteral">"Spawn server died. Attempting to restart it..."</span>);
|
366
|
+
<a name="l00350"></a>00350 this_thread::disable_syscall_interruption dsi;
|
367
|
+
<a name="l00351"></a>00351 restartServer();
|
368
|
+
<a name="l00352"></a>00352 P_DEBUG(<span class="stringliteral">"Restart seems to be successful."</span>);
|
369
|
+
<a name="l00353"></a>00353 restarted = <span class="keyword">true</span>;
|
370
|
+
<a name="l00354"></a>00354 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1IOException.html" title="Represents an error that occured during an I/O operation.">IOException</a> &e) {
|
371
|
+
<a name="l00355"></a>00355 P_DEBUG(<span class="stringliteral">"Restart failed: "</span> << e.<a class="code" href="classPassenger_1_1IOException.html#1b65d0fdb9bc5136f5b7df759c14768a">what</a>());
|
372
|
+
<a name="l00356"></a>00356 restarted = <span class="keyword">false</span>;
|
373
|
+
<a name="l00357"></a>00357 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &e) {
|
374
|
+
<a name="l00358"></a>00358 P_DEBUG(<span class="stringliteral">"Restart failed: "</span> << e.<a class="code" href="classPassenger_1_1SystemException.html#ee405d1078ff3aa1045bc60b1c93d7a3">what</a>());
|
375
|
+
<a name="l00359"></a>00359 restarted = <span class="keyword">false</span>;
|
376
|
+
<a name="l00360"></a>00360 }
|
377
|
+
<a name="l00361"></a>00361 <span class="keywordflow">if</span> (restarted) {
|
378
|
+
<a name="l00362"></a>00362 <span class="keywordflow">return</span> sendSpawnCommand(PoolOptions);
|
379
|
+
<a name="l00363"></a>00363 } <span class="keywordflow">else</span> {
|
380
|
+
<a name="l00364"></a>00364 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="stringliteral">"The spawn server died unexpectedly, and restarting it failed."</span>);
|
381
|
+
<a name="l00365"></a>00365 }
|
382
|
+
<a name="l00366"></a>00366 }
|
383
|
+
<a name="l00367"></a>00367 <span class="comment"></span>
|
384
|
+
<a name="l00368"></a>00368 <span class="comment"> /**</span>
|
385
|
+
<a name="l00369"></a>00369 <span class="comment"> * Send the reload command to the spawn server.</span>
|
386
|
+
<a name="l00370"></a>00370 <span class="comment"> *</span>
|
387
|
+
<a name="l00371"></a>00371 <span class="comment"> * @param appRoot The application root to reload.</span>
|
388
|
+
<a name="l00372"></a>00372 <span class="comment"> * @throws SystemException Something went wrong.</span>
|
389
|
+
<a name="l00373"></a>00373 <span class="comment"> */</span>
|
390
|
+
<a name="l00374"></a>00374 <span class="keywordtype">void</span> sendReloadCommand(<span class="keyword">const</span> <span class="keywordtype">string</span> &appRoot) {
|
391
|
+
<a name="l00375"></a>00375 TRACE_POINT();
|
392
|
+
<a name="l00376"></a>00376 <span class="keywordflow">try</span> {
|
393
|
+
<a name="l00377"></a>00377 channel.<a class="code" href="classPassenger_1_1MessageChannel.html#150f68bc47e060dcc6ca35bee047914d" title="Send an array message, which consists of the given elements, over the underlying...">write</a>(<span class="stringliteral">"reload"</span>, appRoot.c_str(), NULL);
|
394
|
+
<a name="l00378"></a>00378 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &e) {
|
395
|
+
<a name="l00379"></a>00379 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a>(<span class="stringliteral">"Could not write 'reload' command "</span>
|
396
|
+
<a name="l00380"></a>00380 <span class="stringliteral">"to the spawn server"</span>, e.<a class="code" href="classPassenger_1_1SystemException.html#ee7a6672bf79b72a4c3ee70c57d6a47c" title="The value of errno at the time the error occured.">code</a>());
|
397
|
+
<a name="l00381"></a>00381 }
|
398
|
+
<a name="l00382"></a>00382 }
|
399
|
+
<a name="l00383"></a>00383
|
400
|
+
<a name="l00384"></a>00384 <span class="keywordtype">void</span> handleReloadException(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &e, <span class="keyword">const</span> <span class="keywordtype">string</span> &appRoot) {
|
401
|
+
<a name="l00385"></a>00385 TRACE_POINT();
|
402
|
+
<a name="l00386"></a>00386 <span class="keywordtype">bool</span> restarted;
|
403
|
+
<a name="l00387"></a>00387 <span class="keywordflow">try</span> {
|
404
|
+
<a name="l00388"></a>00388 P_DEBUG(<span class="stringliteral">"Spawn server died. Attempting to restart it..."</span>);
|
405
|
+
<a name="l00389"></a>00389 restartServer();
|
406
|
+
<a name="l00390"></a>00390 P_DEBUG(<span class="stringliteral">"Restart seems to be successful."</span>);
|
407
|
+
<a name="l00391"></a>00391 restarted = <span class="keyword">true</span>;
|
408
|
+
<a name="l00392"></a>00392 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1IOException.html" title="Represents an error that occured during an I/O operation.">IOException</a> &e) {
|
409
|
+
<a name="l00393"></a>00393 P_DEBUG(<span class="stringliteral">"Restart failed: "</span> << e.<a class="code" href="classPassenger_1_1IOException.html#1b65d0fdb9bc5136f5b7df759c14768a">what</a>());
|
410
|
+
<a name="l00394"></a>00394 restarted = <span class="keyword">false</span>;
|
411
|
+
<a name="l00395"></a>00395 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &e) {
|
412
|
+
<a name="l00396"></a>00396 P_DEBUG(<span class="stringliteral">"Restart failed: "</span> << e.<a class="code" href="classPassenger_1_1SystemException.html#ee405d1078ff3aa1045bc60b1c93d7a3">what</a>());
|
413
|
+
<a name="l00397"></a>00397 restarted = <span class="keyword">false</span>;
|
415
414
|
<a name="l00398"></a>00398 }
|
416
|
-
<a name="l00399"></a>00399
|
417
|
-
<a name="l00400"></a>00400
|
418
|
-
<a name="l00401"></a>00401
|
419
|
-
<a name="l00402"></a>00402
|
420
|
-
<a name="l00403"></a>00403
|
421
|
-
<a name="l00404"></a>00404
|
422
|
-
<a name="l00405"></a>00405
|
423
|
-
<a name="l00406"></a>00406
|
424
|
-
<a name="l00407"></a>00407
|
425
|
-
<a name="l00408"></a>00408
|
426
|
-
<a name="l00409"></a>00409
|
427
|
-
<a name="l00410"></a>00410 <span class="
|
428
|
-
<a name="l00411"></a>00411
|
429
|
-
<a name="l00412"></a>00412
|
430
|
-
<a name="l00413"></a>00413
|
431
|
-
<a name="l00414"></a>00414 <span class="
|
432
|
-
<a name="l00415"></a>00415 <span class="
|
433
|
-
<a name="l00416"></a>00416 <span class="
|
434
|
-
<a name="l00417"></a>00417 <span class="
|
435
|
-
<a name="l00418"></a>00418 <span class="comment"
|
436
|
-
<a name="l00419"></a>00419 <span class="comment">
|
437
|
-
<a name="l00420"></a>00420 <span class="comment"> *
|
438
|
-
<a name="l00421"></a>00421 <span class="comment">
|
439
|
-
<a name="l00422"></a>00422 <span class="comment"> *
|
440
|
-
<a name="l00423"></a>00423 <span class="comment"> *
|
441
|
-
<a name="l00424"></a>00424 <span class="comment"> *
|
442
|
-
<a name="l00425"></a>00425 <span class="comment"> *
|
443
|
-
<a name="l00426"></a>00426 <span class="comment"> *
|
444
|
-
<a name="l00427"></a>00427 <span class="comment"> *
|
445
|
-
<a name="l00428"></a>00428 <span class="comment"> *
|
446
|
-
<a name="l00429"></a>00429 <span class="comment"> *
|
447
|
-
<a name="l00430"></a>00430 <span class="comment"> * @
|
448
|
-
<a name="l00431"></a>00431 <span class="comment"> *
|
449
|
-
<a name="l00432"></a>00432 <span class="comment">
|
450
|
-
<a name="l00433"></a
|
451
|
-
<a name="l00434"></a>00434
|
452
|
-
<a name="l00435"></a>00435
|
453
|
-
<a name="l00436"></a>00436
|
454
|
-
<a name="l00437"></a>00437
|
455
|
-
<a name="l00438"></a>00438
|
456
|
-
<a name="l00439"></a>00439
|
457
|
-
<a name="l00440"></a>00440
|
458
|
-
<a name="l00441"></a>00441
|
459
|
-
<a name="l00442"></a>00442
|
460
|
-
<a name="l00443"></a>00443
|
461
|
-
<a name="l00444"></a>00444
|
462
|
-
<a name="l00445"></a>00445
|
463
|
-
<a name="l00446"></a>00446
|
464
|
-
<a name="l00447"></a>00447
|
465
|
-
<a name="l00448"></a>00448
|
466
|
-
<a name="l00449"></a>00449
|
467
|
-
<a name="l00450"></a>00450
|
468
|
-
<a name="l00451"></a>00451
|
469
|
-
<a name="l00452"></a>00452
|
470
|
-
<a name="l00453"></a>00453
|
471
|
-
<a name="l00454"></a>00454
|
472
|
-
<a name="l00455"></a>00455
|
473
|
-
<a name="l00456"></a>00456
|
474
|
-
<a name="l00457"></a>00457 <span class="keywordflow">
|
475
|
-
<a name="l00458"></a>00458
|
476
|
-
<a name="l00459"></a>00459
|
477
|
-
<a name="l00460"></a>00460
|
478
|
-
<a name="l00461"></a>00461
|
479
|
-
<a name="l00462"></a>00462
|
480
|
-
<a name="l00463"></a>00463
|
481
|
-
<a name="l00464"></a>00464
|
482
|
-
<a name="l00465"></a>00465
|
483
|
-
<a name="l00466"></a>00466
|
484
|
-
<a name="l00467"></a>00467
|
485
|
-
<a name="l00468"></a>00468 <span class="
|
486
|
-
<a name="l00469"></a>00469
|
487
|
-
<a name="l00470"></a>00470
|
488
|
-
<a name="l00471"></a>00471 <span class="
|
489
|
-
<a name="l00472"></a>00472
|
490
|
-
<a name="l00473"></a>00473
|
491
|
-
<a name="l00474"></a>00474
|
492
|
-
<a name="l00475"></a>00475 <span class="comment">
|
493
|
-
<a name="l00476"></a>00476 <span class="comment"> *
|
494
|
-
<a name="l00477"></a>00477 <span class="comment"> *
|
495
|
-
<a name="l00478"></a>00478 <span class="comment">
|
496
|
-
<a name="l00479"></a>00479 <span class="comment">
|
497
|
-
<a name="l00480"></a>00480 <span class="comment"> *
|
498
|
-
<a name="l00481"></a>00481 <span class="comment"> *
|
499
|
-
<a name="l00482"></a>00482 <span class="comment"> *
|
500
|
-
<a name="l00483"></a>00483 <span class="comment">
|
501
|
-
<a name="l00484"></a>00484 <span class="comment"> *
|
502
|
-
<a name="l00485"></a>00485 <span class="comment"> *
|
503
|
-
<a name="l00486"></a>00486 <span class="comment">
|
504
|
-
<a name="l00487"></a>00487 <span class="comment"> *
|
505
|
-
<a name="l00488"></a>00488 <span class="comment"> *
|
506
|
-
<a name="l00489"></a>00489 <span class="comment"> *
|
507
|
-
<a name="l00490"></a>00490 <span class="comment"> *
|
508
|
-
<a name="l00491"></a>00491 <span class="comment">
|
509
|
-
<a name="l00492"></a>00492 <
|
510
|
-
<a name="l00493"></a>00493
|
511
|
-
<a name="l00494"></a>00494
|
512
|
-
<a name="l00495"></a>00495
|
513
|
-
<a name="l00496"></a>00496
|
514
|
-
<a name="l00497"></a>00497 <span class="
|
515
|
-
<a name="l00498"></a>00498
|
516
|
-
<a name="l00499"></a>00499
|
517
|
-
<a name="l00500"></a>00500 <span class="
|
518
|
-
<a name="l00501"></a>00501
|
519
|
-
<a name="l00502"></a>00502
|
520
|
-
<a name="l00503"></a>00503
|
521
|
-
<a name="l00504"></a>00504
|
522
|
-
<a name="l00505"></a>00505
|
523
|
-
<a name="l00506"></a>00506 <span class="comment">
|
524
|
-
<a name="l00507"></a>00507 <span class="comment"> *
|
525
|
-
<a name="l00508"></a>00508 <span class="comment">
|
526
|
-
<a name="l00509"></a
|
527
|
-
<a name="l00510"></a>00510
|
528
|
-
<a name="l00511"></a>00511
|
529
|
-
<a name="l00512"></a>00512
|
530
|
-
<a name="l00513"></a>00513
|
531
|
-
<a name="l00514"></a>00514
|
532
|
-
<a name="l00515"></a>00515
|
533
|
-
<a name="l00516"></a>00516
|
534
|
-
<a name="l00517"></a>00517
|
535
|
-
<a name="l00518"></a>00518
|
536
|
-
<a name="l00519"></a>00519
|
537
|
-
<a name="l00520"></a>00520
|
538
|
-
<a name="l00521"></a
|
539
|
-
<a name="l00522"></a>00522
|
540
|
-
<a name="l00523"></a>00523
|
541
|
-
<a name="l00524"></a>00524
|
542
|
-
<a name="l00525"></a>00525
|
543
|
-
<a name="l00526"></a>00526
|
544
|
-
<a name="l00527"></a>00527
|
545
|
-
<a name="l00528"></a>00528
|
546
|
-
<a name="l00529"></a>00529
|
547
|
-
<a name="l00530"></a>00530
|
548
|
-
<a name="l00531"></a>00531
|
549
|
-
<a name="l00532"></a>00532 <span class="comment">
|
550
|
-
<a name="l00533"></a>00533 <span class="comment">
|
551
|
-
<a name="l00534"></a>00534 <span class="comment"> *
|
552
|
-
<a name="l00535"></a>00535 <span class="comment">
|
553
|
-
<a name="l00536"></a>00536 <
|
554
|
-
<a name="l00537"></a>00537
|
555
|
-
<a name="l00538"></a>00538
|
556
|
-
<a name="l00539"></a>00539
|
557
|
-
<a name="l00540"></a>00540 <span class="comment"
|
558
|
-
<a name="l00541"></a>00541 <span class="comment"
|
559
|
-
<a name="l00542"></a>00542 <span class="
|
560
|
-
<a name="l00543"></a>00543
|
561
|
-
<a name="l00544"></a>00544 <span class="comment"
|
562
|
-
<a name="l00545"></a>00545
|
563
|
-
<a name="l00546"></a
|
564
|
-
<a name="l00547"></a>00547 this_thread::disable_interruption di;
|
565
|
-
<a name="l00548"></a>00548 <a class="code" href="classboost_1_1this__thread_1_1disable__syscall__interruption.html" title="Create this struct on the stack to temporarily disable system call interruption,...">this_thread::disable_syscall_interruption</a> dsi;
|
566
|
-
<a name="l00549"></a>00549 <span class="keywordflow">try</span> {
|
567
|
-
<a name="l00550"></a>00550 <span class="keywordflow">return</span> sendReloadCommand(appRoot);
|
568
|
-
<a name="l00551"></a>00551 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &e) {
|
569
|
-
<a name="l00552"></a>00552 <span class="keywordflow">return</span> handleReloadException(e, appRoot);
|
570
|
-
<a name="l00553"></a>00553 }
|
571
|
-
<a name="l00554"></a>00554 }
|
572
|
-
<a name="l00555"></a>00555 <span class="comment"></span>
|
573
|
-
<a name="l00556"></a>00556 <span class="comment"> /**</span>
|
574
|
-
<a name="l00557"></a>00557 <span class="comment"> * Get the Process ID of the spawn server. This method is used in the unit tests</span>
|
575
|
-
<a name="l00558"></a>00558 <span class="comment"> * and should not be used directly.</span>
|
576
|
-
<a name="l00559"></a>00559 <span class="comment"> */</span>
|
577
|
-
<a name="l00560"></a><a class="code" href="classPassenger_1_1SpawnManager.html#1f77e2e7e6cb464028c13a29f983ad8e">00560</a> pid_t <a class="code" href="classPassenger_1_1SpawnManager.html#1f77e2e7e6cb464028c13a29f983ad8e" title="Get the Process ID of the spawn server.">getServerPid</a>()<span class="keyword"> const </span>{
|
578
|
-
<a name="l00561"></a>00561 <span class="keywordflow">return</span> pid;
|
579
|
-
<a name="l00562"></a>00562 }
|
580
|
-
<a name="l00563"></a>00563 };
|
581
|
-
<a name="l00564"></a>00564 <span class="comment"></span>
|
582
|
-
<a name="l00565"></a>00565 <span class="comment">/** Convenient alias for SpawnManager smart pointer. */</span>
|
583
|
-
<a name="l00566"></a><a class="code" href="namespacePassenger.html#6ab2d566ff87a2676c23d8aa40204587">00566</a> <span class="keyword">typedef</span> shared_ptr<SpawnManager> <a class="code" href="namespacePassenger.html#6ab2d566ff87a2676c23d8aa40204587" title="Convenient alias for SpawnManager smart pointer.">SpawnManagerPtr</a>;
|
584
|
-
<a name="l00567"></a>00567
|
585
|
-
<a name="l00568"></a>00568 } <span class="comment">// namespace Passenger</span>
|
586
|
-
<a name="l00569"></a>00569
|
587
|
-
<a name="l00570"></a>00570 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_SPAWN_MANAGER_H_ */</span>
|
415
|
+
<a name="l00399"></a>00399 <span class="keywordflow">if</span> (restarted) {
|
416
|
+
<a name="l00400"></a>00400 <span class="keywordflow">return</span> sendReloadCommand(appRoot);
|
417
|
+
<a name="l00401"></a>00401 } <span class="keywordflow">else</span> {
|
418
|
+
<a name="l00402"></a>00402 <span class="keywordflow">throw</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a>(<span class="stringliteral">"The spawn server died unexpectedly, and restarting it failed."</span>);
|
419
|
+
<a name="l00403"></a>00403 }
|
420
|
+
<a name="l00404"></a>00404 }
|
421
|
+
<a name="l00405"></a>00405
|
422
|
+
<a name="l00406"></a>00406 <a class="code" href="classPassenger_1_1IOException.html" title="Represents an error that occured during an I/O operation.">IOException</a> prependMessageToException(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1IOException.html" title="Represents an error that occured during an I/O operation.">IOException</a> &e, <span class="keyword">const</span> <span class="keywordtype">string</span> &message) {
|
423
|
+
<a name="l00407"></a>00407 <span class="keywordflow">return</span> <a class="code" href="classPassenger_1_1IOException.html" title="Represents an error that occured during an I/O operation.">IOException</a>(message + <span class="stringliteral">": "</span> + e.<a class="code" href="classPassenger_1_1IOException.html#1b65d0fdb9bc5136f5b7df759c14768a">what</a>());
|
424
|
+
<a name="l00408"></a>00408 }
|
425
|
+
<a name="l00409"></a>00409
|
426
|
+
<a name="l00410"></a>00410 <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> prependMessageToException(<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &e, <span class="keyword">const</span> <span class="keywordtype">string</span> &message) {
|
427
|
+
<a name="l00411"></a>00411 <span class="keywordflow">return</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a>(message + <span class="stringliteral">": "</span> + e.<a class="code" href="classPassenger_1_1SystemException.html#84fa2ab4f5b7b96704734fcdfdaa0269" title="Returns a brief version of the exception message.">brief</a>(), e.<a class="code" href="classPassenger_1_1SystemException.html#ee7a6672bf79b72a4c3ee70c57d6a47c" title="The value of errno at the time the error occured.">code</a>());
|
428
|
+
<a name="l00412"></a>00412 }
|
429
|
+
<a name="l00413"></a>00413
|
430
|
+
<a name="l00414"></a>00414 <span class="keyword">public</span>:
|
431
|
+
<a name="l00415"></a>00415 <span class="preprocessor"> #ifdef TESTING_SPAWN_MANAGER</span>
|
432
|
+
<a name="l00416"></a>00416 <span class="preprocessor"></span> <span class="keywordtype">bool</span> nextRestartShouldFail;
|
433
|
+
<a name="l00417"></a>00417 <span class="preprocessor"> #endif</span>
|
434
|
+
<a name="l00418"></a>00418 <span class="preprocessor"></span><span class="comment"></span>
|
435
|
+
<a name="l00419"></a>00419 <span class="comment"> /**</span>
|
436
|
+
<a name="l00420"></a>00420 <span class="comment"> * Construct a new SpawnManager.</span>
|
437
|
+
<a name="l00421"></a>00421 <span class="comment"> *</span>
|
438
|
+
<a name="l00422"></a>00422 <span class="comment"> * @param spawnServerCommand The filename of the spawn server to use.</span>
|
439
|
+
<a name="l00423"></a>00423 <span class="comment"> * @param logFile Specify a log file that the spawn server should use.</span>
|
440
|
+
<a name="l00424"></a>00424 <span class="comment"> * Messages on its standard output and standard error channels</span>
|
441
|
+
<a name="l00425"></a>00425 <span class="comment"> * will be written to this log file. If an empty string is</span>
|
442
|
+
<a name="l00426"></a>00426 <span class="comment"> * specified, no log file will be used, and the spawn server</span>
|
443
|
+
<a name="l00427"></a>00427 <span class="comment"> * will use the same standard output/error channels as the</span>
|
444
|
+
<a name="l00428"></a>00428 <span class="comment"> * current process.</span>
|
445
|
+
<a name="l00429"></a>00429 <span class="comment"> * @param rubyCommand The Ruby interpreter's command.</span>
|
446
|
+
<a name="l00430"></a>00430 <span class="comment"> * @param user The user that the spawn manager should run as. This</span>
|
447
|
+
<a name="l00431"></a>00431 <span class="comment"> * parameter only has effect if the current process is</span>
|
448
|
+
<a name="l00432"></a>00432 <span class="comment"> * running as root. If the empty string is given, or if</span>
|
449
|
+
<a name="l00433"></a>00433 <span class="comment"> * the <tt>user</tt> is not a valid username, then</span>
|
450
|
+
<a name="l00434"></a>00434 <span class="comment"> * the spawn manager will be run as the current user.</span>
|
451
|
+
<a name="l00435"></a>00435 <span class="comment"> * @throws SystemException An error occured while trying to setup the spawn server.</span>
|
452
|
+
<a name="l00436"></a>00436 <span class="comment"> * @throws IOException The specified log file could not be opened.</span>
|
453
|
+
<a name="l00437"></a>00437 <span class="comment"> */</span>
|
454
|
+
<a name="l00438"></a><a class="code" href="classPassenger_1_1SpawnManager.html#fdefbbbad39833912ae7f9f106083099">00438</a> <a class="code" href="classPassenger_1_1SpawnManager.html#fdefbbbad39833912ae7f9f106083099" title="Construct a new SpawnManager.">SpawnManager</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &spawnServerCommand,
|
455
|
+
<a name="l00439"></a>00439 <span class="keyword">const</span> <span class="keywordtype">string</span> &logFile = <span class="stringliteral">""</span>,
|
456
|
+
<a name="l00440"></a>00440 <span class="keyword">const</span> <span class="keywordtype">string</span> &rubyCommand = <span class="stringliteral">"ruby"</span>,
|
457
|
+
<a name="l00441"></a>00441 <span class="keyword">const</span> <span class="keywordtype">string</span> &user = <span class="stringliteral">""</span>) {
|
458
|
+
<a name="l00442"></a>00442 TRACE_POINT();
|
459
|
+
<a name="l00443"></a>00443 this->spawnServerCommand = spawnServerCommand;
|
460
|
+
<a name="l00444"></a>00444 this->logFile = logFile;
|
461
|
+
<a name="l00445"></a>00445 this->rubyCommand = rubyCommand;
|
462
|
+
<a name="l00446"></a>00446 this->user = user;
|
463
|
+
<a name="l00447"></a>00447 pid = 0;
|
464
|
+
<a name="l00448"></a>00448 <span class="preprocessor"> #ifdef TESTING_SPAWN_MANAGER</span>
|
465
|
+
<a name="l00449"></a>00449 <span class="preprocessor"></span> nextRestartShouldFail = <span class="keyword">false</span>;
|
466
|
+
<a name="l00450"></a>00450 <span class="preprocessor"> #endif</span>
|
467
|
+
<a name="l00451"></a>00451 <span class="preprocessor"></span> this_thread::disable_interruption di;
|
468
|
+
<a name="l00452"></a>00452 this_thread::disable_syscall_interruption dsi;
|
469
|
+
<a name="l00453"></a>00453 <span class="keywordflow">try</span> {
|
470
|
+
<a name="l00454"></a>00454 restartServer();
|
471
|
+
<a name="l00455"></a>00455 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1IOException.html" title="Represents an error that occured during an I/O operation.">IOException</a> &e) {
|
472
|
+
<a name="l00456"></a>00456 <span class="keywordflow">throw</span> prependMessageToException(e, <span class="stringliteral">"Could not start the spawn server"</span>);
|
473
|
+
<a name="l00457"></a>00457 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &e) {
|
474
|
+
<a name="l00458"></a>00458 <span class="keywordflow">throw</span> prependMessageToException(e, <span class="stringliteral">"Could not start the spawn server"</span>);
|
475
|
+
<a name="l00459"></a>00459 }
|
476
|
+
<a name="l00460"></a>00460 }
|
477
|
+
<a name="l00461"></a>00461
|
478
|
+
<a name="l00462"></a>00462 ~<a class="code" href="classPassenger_1_1SpawnManager.html" title="Spawning of Ruby on Rails/Rack application instances.">SpawnManager</a>() throw() {
|
479
|
+
<a name="l00463"></a>00463 TRACE_POINT();
|
480
|
+
<a name="l00464"></a>00464 <span class="keywordflow">if</span> (pid != 0) {
|
481
|
+
<a name="l00465"></a>00465 UPDATE_TRACE_POINT();
|
482
|
+
<a name="l00466"></a>00466 this_thread::disable_interruption di;
|
483
|
+
<a name="l00467"></a>00467 this_thread::disable_syscall_interruption dsi;
|
484
|
+
<a name="l00468"></a>00468 P_TRACE(2, <span class="stringliteral">"Shutting down spawn manager (PID "</span> << pid << <span class="stringliteral">")."</span>);
|
485
|
+
<a name="l00469"></a>00469 channel.<a class="code" href="classPassenger_1_1MessageChannel.html#06309e208fc5e10642a2e9bbe0f351eb" title="Close the underlying file descriptor.">close</a>();
|
486
|
+
<a name="l00470"></a>00470 syscalls::waitpid(pid, NULL, 0);
|
487
|
+
<a name="l00471"></a>00471 P_TRACE(2, <span class="stringliteral">"Spawn manager exited."</span>);
|
488
|
+
<a name="l00472"></a>00472 }
|
489
|
+
<a name="l00473"></a>00473 }
|
490
|
+
<a name="l00474"></a>00474 <span class="comment"></span>
|
491
|
+
<a name="l00475"></a>00475 <span class="comment"> /**</span>
|
492
|
+
<a name="l00476"></a>00476 <span class="comment"> * Spawn a new instance of an application. Spawning details are to be passed</span>
|
493
|
+
<a name="l00477"></a>00477 <span class="comment"> * via the <tt>PoolOptions</tt> parameter.</span>
|
494
|
+
<a name="l00478"></a>00478 <span class="comment"> *</span>
|
495
|
+
<a name="l00479"></a>00479 <span class="comment"> * If the spawn server died during the spawning process, then the server</span>
|
496
|
+
<a name="l00480"></a>00480 <span class="comment"> * will be automatically restarted, and another spawn attempt will be made.</span>
|
497
|
+
<a name="l00481"></a>00481 <span class="comment"> * If restarting the server fails, or if the second spawn attempt fails,</span>
|
498
|
+
<a name="l00482"></a>00482 <span class="comment"> * then an exception will be thrown.</span>
|
499
|
+
<a name="l00483"></a>00483 <span class="comment"> *</span>
|
500
|
+
<a name="l00484"></a>00484 <span class="comment"> * @param PoolOptions An object containing the details for this spawn operation,</span>
|
501
|
+
<a name="l00485"></a>00485 <span class="comment"> * such as which application to spawn. See PoolOptions for details.</span>
|
502
|
+
<a name="l00486"></a>00486 <span class="comment"> * @return A smart pointer to an Application object, which represents the application</span>
|
503
|
+
<a name="l00487"></a>00487 <span class="comment"> * instance that has been spawned. Use this object to communicate with the</span>
|
504
|
+
<a name="l00488"></a>00488 <span class="comment"> * spawned application.</span>
|
505
|
+
<a name="l00489"></a>00489 <span class="comment"> * @throws SpawnException Something went wrong.</span>
|
506
|
+
<a name="l00490"></a>00490 <span class="comment"> * @throws boost::thread_interrupted</span>
|
507
|
+
<a name="l00491"></a>00491 <span class="comment"> */</span>
|
508
|
+
<a name="l00492"></a><a class="code" href="classPassenger_1_1SpawnManager.html#af035d564cc4e6683508939c9d6dbb64">00492</a> ApplicationPtr <a class="code" href="classPassenger_1_1SpawnManager.html#af035d564cc4e6683508939c9d6dbb64" title="Spawn a new instance of an application.">spawn</a>(<span class="keyword">const</span> PoolOptions &PoolOptions) {
|
509
|
+
<a name="l00493"></a>00493 TRACE_POINT();
|
510
|
+
<a name="l00494"></a>00494 boost::mutex::scoped_lock l(lock);
|
511
|
+
<a name="l00495"></a>00495 <span class="keywordflow">try</span> {
|
512
|
+
<a name="l00496"></a>00496 <span class="keywordflow">return</span> sendSpawnCommand(PoolOptions);
|
513
|
+
<a name="l00497"></a>00497 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SpawnException.html" title="Thrown when SpawnManager or ApplicationPool fails to spawn an application instance...">SpawnException</a> &e) {
|
514
|
+
<a name="l00498"></a>00498 <span class="keywordflow">if</span> (e.<a class="code" href="classPassenger_1_1SpawnException.html#e65dc272e183fd9e5637a4091cc6bbf4" title="Check whether an error page is available.">hasErrorPage</a>()) {
|
515
|
+
<a name="l00499"></a>00499 <span class="keywordflow">throw</span>;
|
516
|
+
<a name="l00500"></a>00500 } <span class="keywordflow">else</span> {
|
517
|
+
<a name="l00501"></a>00501 <span class="keywordflow">return</span> handleSpawnException(e, PoolOptions);
|
518
|
+
<a name="l00502"></a>00502 }
|
519
|
+
<a name="l00503"></a>00503 }
|
520
|
+
<a name="l00504"></a>00504 }
|
521
|
+
<a name="l00505"></a>00505 <span class="comment"></span>
|
522
|
+
<a name="l00506"></a>00506 <span class="comment"> /**</span>
|
523
|
+
<a name="l00507"></a>00507 <span class="comment"> * Remove the cached application instances at the given application root.</span>
|
524
|
+
<a name="l00508"></a>00508 <span class="comment"> *</span>
|
525
|
+
<a name="l00509"></a>00509 <span class="comment"> * Application code might be cached in memory. But once it a while, it will</span>
|
526
|
+
<a name="l00510"></a>00510 <span class="comment"> * be necessary to reload the code for an application, such as after</span>
|
527
|
+
<a name="l00511"></a>00511 <span class="comment"> * deploying a new version of the application. This method makes sure that</span>
|
528
|
+
<a name="l00512"></a>00512 <span class="comment"> * any cached application code is removed, so that the next time an</span>
|
529
|
+
<a name="l00513"></a>00513 <span class="comment"> * application instance is spawned, the application code will be freshly</span>
|
530
|
+
<a name="l00514"></a>00514 <span class="comment"> * loaded into memory.</span>
|
531
|
+
<a name="l00515"></a>00515 <span class="comment"> *</span>
|
532
|
+
<a name="l00516"></a>00516 <span class="comment"> * @throws SystemException Unable to communicate with the spawn server,</span>
|
533
|
+
<a name="l00517"></a>00517 <span class="comment"> * even after a restart.</span>
|
534
|
+
<a name="l00518"></a>00518 <span class="comment"> * @throws SpawnException The spawn server died unexpectedly, and a</span>
|
535
|
+
<a name="l00519"></a>00519 <span class="comment"> * restart was attempted, but it failed.</span>
|
536
|
+
<a name="l00520"></a>00520 <span class="comment"> */</span>
|
537
|
+
<a name="l00521"></a><a class="code" href="classPassenger_1_1SpawnManager.html#2e85c43042b9556ca2fd74b8d28956ce">00521</a> <span class="keywordtype">void</span> <a class="code" href="classPassenger_1_1SpawnManager.html#2e85c43042b9556ca2fd74b8d28956ce" title="Remove the cached application instances at the given application root.">reload</a>(<span class="keyword">const</span> <span class="keywordtype">string</span> &appRoot) {
|
538
|
+
<a name="l00522"></a>00522 TRACE_POINT();
|
539
|
+
<a name="l00523"></a>00523 this_thread::disable_interruption di;
|
540
|
+
<a name="l00524"></a>00524 this_thread::disable_syscall_interruption dsi;
|
541
|
+
<a name="l00525"></a>00525 <span class="keywordflow">try</span> {
|
542
|
+
<a name="l00526"></a>00526 <span class="keywordflow">return</span> sendReloadCommand(appRoot);
|
543
|
+
<a name="l00527"></a>00527 } <span class="keywordflow">catch</span> (<span class="keyword">const</span> <a class="code" href="classPassenger_1_1SystemException.html" title="Represents an error returned by a system call or a standard library call.">SystemException</a> &e) {
|
544
|
+
<a name="l00528"></a>00528 <span class="keywordflow">return</span> handleReloadException(e, appRoot);
|
545
|
+
<a name="l00529"></a>00529 }
|
546
|
+
<a name="l00530"></a>00530 }
|
547
|
+
<a name="l00531"></a>00531 <span class="comment"></span>
|
548
|
+
<a name="l00532"></a>00532 <span class="comment"> /**</span>
|
549
|
+
<a name="l00533"></a>00533 <span class="comment"> * Get the Process ID of the spawn server. This method is used in the unit tests</span>
|
550
|
+
<a name="l00534"></a>00534 <span class="comment"> * and should not be used directly.</span>
|
551
|
+
<a name="l00535"></a>00535 <span class="comment"> */</span>
|
552
|
+
<a name="l00536"></a><a class="code" href="classPassenger_1_1SpawnManager.html#1f77e2e7e6cb464028c13a29f983ad8e">00536</a> pid_t <a class="code" href="classPassenger_1_1SpawnManager.html#1f77e2e7e6cb464028c13a29f983ad8e" title="Get the Process ID of the spawn server.">getServerPid</a>()<span class="keyword"> const </span>{
|
553
|
+
<a name="l00537"></a>00537 <span class="keywordflow">return</span> pid;
|
554
|
+
<a name="l00538"></a>00538 }
|
555
|
+
<a name="l00539"></a>00539 };
|
556
|
+
<a name="l00540"></a>00540 <span class="comment"></span>
|
557
|
+
<a name="l00541"></a>00541 <span class="comment">/** Convenient alias for SpawnManager smart pointer. */</span>
|
558
|
+
<a name="l00542"></a>00542 <span class="keyword">typedef</span> shared_ptr<SpawnManager> SpawnManagerPtr;
|
559
|
+
<a name="l00543"></a>00543
|
560
|
+
<a name="l00544"></a>00544 } <span class="comment">// namespace Passenger</span>
|
561
|
+
<a name="l00545"></a>00545
|
562
|
+
<a name="l00546"></a>00546 <span class="preprocessor">#endif </span><span class="comment">/* _PASSENGER_SPAWN_MANAGER_H_ */</span>
|
588
563
|
</pre></div></div>
|
589
|
-
<hr size="1"><address style="text-align: right;"><small>Generated on
|
564
|
+
<hr size="1"><address style="text-align: right;"><small>Generated on Fri Mar 13 19:24:32 2009 for Passenger by
|
590
565
|
<a href="http://www.doxygen.org/index.html">
|
591
566
|
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.5 </small></address>
|
592
567
|
</body>
|