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,301 @@
|
|
1
|
+
# Phusion Passenger - http://www.modrails.com/
|
2
|
+
# Copyright (C) 2008 Phusion
|
3
|
+
#
|
4
|
+
# Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.
|
5
|
+
#
|
6
|
+
# This program is free software; you can redistribute it and/or modify
|
7
|
+
# it under the terms of the GNU General Public License as published by
|
8
|
+
# the Free Software Foundation; version 2 of the License.
|
9
|
+
#
|
10
|
+
# This program is distributed in the hope that it will be useful,
|
11
|
+
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
+
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
+
# GNU General Public License for more details.
|
14
|
+
#
|
15
|
+
# You should have received a copy of the GNU General Public License along
|
16
|
+
# with this program; if not, write to the Free Software Foundation, Inc.,
|
17
|
+
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
18
|
+
|
19
|
+
require 'phusion_passenger/utils'
|
20
|
+
|
21
|
+
module PhusionPassenger
|
22
|
+
|
23
|
+
# This class maintains a collection of AbstractServer objects. One can add new
|
24
|
+
# AbstractServer objects, or look up existing ones via a key.
|
25
|
+
# AbstractServerCollection also automatically takes care of cleaning up
|
26
|
+
# AbstractServers that have been idle for too long.
|
27
|
+
#
|
28
|
+
# This class exists because both SpawnManager and Railz::FrameworkSpawner need this kind
|
29
|
+
# of functionality. SpawnManager maintains a collection of Railz::FrameworkSpawner
|
30
|
+
# and Railz::ApplicationSpawner objects, while Railz::FrameworkSpawner maintains a
|
31
|
+
# collection of Railz::ApplicationSpawner objects.
|
32
|
+
#
|
33
|
+
# This class is thread-safe as long as the specified thread-safety rules are followed.
|
34
|
+
class AbstractServerCollection
|
35
|
+
attr_reader :next_cleaning_time
|
36
|
+
|
37
|
+
include Utils
|
38
|
+
|
39
|
+
def initialize
|
40
|
+
@collection = {}
|
41
|
+
@lock = Mutex.new
|
42
|
+
@cleanup_lock = Mutex.new
|
43
|
+
@cond = ConditionVariable.new
|
44
|
+
@done = false
|
45
|
+
|
46
|
+
# The next time the cleaner thread should check for idle servers.
|
47
|
+
# The value may be nil, in which case the value will be calculated
|
48
|
+
# at the end of the #synchronized block.
|
49
|
+
#
|
50
|
+
# Invariant:
|
51
|
+
# if value is not nil:
|
52
|
+
# There exists an s in @collection with s.next_cleaning_time == value.
|
53
|
+
# for all s in @collection:
|
54
|
+
# if eligable_for_cleanup?(s):
|
55
|
+
# s.next_cleaning_time <= value
|
56
|
+
@next_cleaning_time = Time.now + 60 * 60
|
57
|
+
@next_cleaning_time_changed = false
|
58
|
+
|
59
|
+
@cleaner_thread = Thread.new do
|
60
|
+
begin
|
61
|
+
@lock.synchronize do
|
62
|
+
cleaner_thread_main
|
63
|
+
end
|
64
|
+
rescue Exception => e
|
65
|
+
print_exception(self.class.to_s, e)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
# Acquire the lock for this AbstractServerCollection object, and run
|
71
|
+
# the code within the block. The entire block will be a single atomic
|
72
|
+
# operation.
|
73
|
+
def synchronize
|
74
|
+
@lock.synchronize do
|
75
|
+
yield
|
76
|
+
if @next_cleaning_time.nil?
|
77
|
+
@collection.each_value do |server|
|
78
|
+
if @next_cleaning_time.nil? ||
|
79
|
+
(eligable_for_cleanup?(server) &&
|
80
|
+
server.next_cleaning_time < @next_cleaning_time
|
81
|
+
)
|
82
|
+
@next_cleaning_time = server.next_cleaning_time
|
83
|
+
end
|
84
|
+
end
|
85
|
+
if @next_cleaning_time.nil?
|
86
|
+
# There are no servers in the collection with an idle timeout.
|
87
|
+
@next_cleaning_time = Time.now + 60 * 60
|
88
|
+
end
|
89
|
+
@next_cleaning_time_changed = true
|
90
|
+
end
|
91
|
+
if @next_cleaning_time_changed
|
92
|
+
@next_cleaning_time_changed = false
|
93
|
+
@cond.signal
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
# Lookup and returns an AbstractServer with the given key.
|
99
|
+
#
|
100
|
+
# If there is no AbstractSerer associated with the given key, then the given
|
101
|
+
# block will be called. That block must return an AbstractServer object. Then,
|
102
|
+
# that object will be stored in the collection, and returned.
|
103
|
+
#
|
104
|
+
# The block must set the 'max_idle_time' attribute on the AbstractServer.
|
105
|
+
# AbstractServerCollection's idle cleaning interval will be adapted to accomodate
|
106
|
+
# with this. Changing the value outside this block is not guaranteed to have any
|
107
|
+
# effect on the idle cleaning interval.
|
108
|
+
# A max_idle_time value of nil or 0 means the AbstractServer will never be idle cleaned.
|
109
|
+
#
|
110
|
+
# If the block raises an exception, then the collection will not be modified,
|
111
|
+
# and the exception will be propagated.
|
112
|
+
#
|
113
|
+
# Precondition: this method must be called within a #synchronize block.
|
114
|
+
def lookup_or_add(key)
|
115
|
+
raise ArgumentError, "cleanup() has already been called." if @done
|
116
|
+
server = @collection[key]
|
117
|
+
if server
|
118
|
+
register_activity(server)
|
119
|
+
return server
|
120
|
+
else
|
121
|
+
server = yield
|
122
|
+
if !server.respond_to?(:start)
|
123
|
+
raise TypeError, "The block didn't return a valid AbstractServer object."
|
124
|
+
end
|
125
|
+
if eligable_for_cleanup?(server)
|
126
|
+
server.next_cleaning_time = Time.now + server.max_idle_time
|
127
|
+
if @next_cleaning_time && server.next_cleaning_time < @next_cleaning_time
|
128
|
+
@next_cleaning_time = server.next_cleaning_time
|
129
|
+
@next_cleaning_time_changed = true
|
130
|
+
end
|
131
|
+
end
|
132
|
+
@collection[key] = server
|
133
|
+
return server
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# Checks whether there's an AbstractServer object associated with the given key.
|
138
|
+
#
|
139
|
+
# Precondition: this method must be called within a #synchronize block.
|
140
|
+
def has_key?(key)
|
141
|
+
return @collection.has_key?(key)
|
142
|
+
end
|
143
|
+
|
144
|
+
# Checks whether the collection is empty.
|
145
|
+
#
|
146
|
+
# Precondition: this method must be called within a #synchronize block.
|
147
|
+
def empty?
|
148
|
+
return @collection.empty?
|
149
|
+
end
|
150
|
+
|
151
|
+
# Deletes from the collection the AbstractServer that's associated with the
|
152
|
+
# given key. If no such AbstractServer exists, nothing will happen.
|
153
|
+
#
|
154
|
+
# If the AbstractServer is started, then it will be stopped before deletion.
|
155
|
+
#
|
156
|
+
# Precondition: this method must be called within a #synchronize block.
|
157
|
+
def delete(key)
|
158
|
+
raise ArgumentError, "cleanup() has already been called." if @done
|
159
|
+
server = @collection[key]
|
160
|
+
if server
|
161
|
+
if server.started?
|
162
|
+
server.stop
|
163
|
+
end
|
164
|
+
@collection.delete(key)
|
165
|
+
if server.next_cleaning_time == @next_cleaning_time
|
166
|
+
@next_cleaning_time = nil
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
# Notify this AbstractServerCollection that +server+ has performed an activity.
|
172
|
+
# This AbstractServerCollection will update the idle information associated with +server+
|
173
|
+
# accordingly.
|
174
|
+
#
|
175
|
+
# lookup_or_add already automatically updates idle information, so you only need to
|
176
|
+
# call this method if the time at which the server has performed an activity is
|
177
|
+
# not close to the time at which lookup_or_add had been called.
|
178
|
+
#
|
179
|
+
# Precondition: this method must be called within a #synchronize block.
|
180
|
+
def register_activity(server)
|
181
|
+
if eligable_for_cleanup?(server)
|
182
|
+
if server.next_cleaning_time == @next_cleaning_time
|
183
|
+
@next_cleaning_time = nil
|
184
|
+
end
|
185
|
+
server.next_cleaning_time = Time.now + server.max_idle_time
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
# Tell the cleaner thread to check the collection as soon as possible, instead
|
190
|
+
# of sleeping until the next scheduled cleaning time.
|
191
|
+
#
|
192
|
+
# Precondition: this method must NOT be called within a #synchronize block.
|
193
|
+
def check_idle_servers!
|
194
|
+
@lock.synchronize do
|
195
|
+
@next_cleaning_time = Time.now - 60 * 60
|
196
|
+
@cond.signal
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# Iterate over all AbstractServer objects.
|
201
|
+
#
|
202
|
+
# Precondition: this method must be called within a #synchronize block.
|
203
|
+
def each
|
204
|
+
each_pair do |key, server|
|
205
|
+
yield server
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
209
|
+
# Iterate over all keys and associated AbstractServer objects.
|
210
|
+
#
|
211
|
+
# Precondition: this method must be called within a #synchronize block.
|
212
|
+
def each_pair
|
213
|
+
raise ArgumentError, "cleanup() has already been called." if @done
|
214
|
+
@collection.each_pair do |key, server|
|
215
|
+
yield(key, server)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
# Delete all AbstractServers from the collection. Each AbstractServer will be
|
220
|
+
# stopped, if necessary.
|
221
|
+
#
|
222
|
+
# Precondition: this method must be called within a #synchronize block.
|
223
|
+
def clear
|
224
|
+
@collection.each_value do |server|
|
225
|
+
if server.started?
|
226
|
+
server.stop
|
227
|
+
end
|
228
|
+
end
|
229
|
+
@collection.clear
|
230
|
+
@next_cleaning_time = nil
|
231
|
+
end
|
232
|
+
|
233
|
+
# Cleanup all resources used by this AbstractServerCollection. All AbstractServers
|
234
|
+
# from the collection will be deleted. Each AbstractServer will be stopped, if
|
235
|
+
# necessary. The background thread which removes idle AbstractServers will be stopped.
|
236
|
+
#
|
237
|
+
# After calling this method, this AbstractServerCollection object will become
|
238
|
+
# unusable.
|
239
|
+
#
|
240
|
+
# Precondition: this method must *NOT* be called within a #synchronize block.
|
241
|
+
def cleanup
|
242
|
+
@cleanup_lock.synchronize do
|
243
|
+
return if @done
|
244
|
+
@lock.synchronize do
|
245
|
+
@done = true
|
246
|
+
@cond.signal
|
247
|
+
end
|
248
|
+
@cleaner_thread.join
|
249
|
+
clear
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
private
|
254
|
+
def cleaner_thread_main
|
255
|
+
while !@done
|
256
|
+
current_time = Time.now
|
257
|
+
# We add a 0.2 seconds delay to the sleep time because system
|
258
|
+
# timers are not entirely accurate.
|
259
|
+
sleep_time = (@next_cleaning_time - current_time).to_f + 0.2
|
260
|
+
if sleep_time > 0 && @cond.timed_wait(@lock, sleep_time)
|
261
|
+
next
|
262
|
+
else
|
263
|
+
keys_to_delete = nil
|
264
|
+
@next_cleaning_time = nil
|
265
|
+
@collection.each_pair do |key, server|
|
266
|
+
if eligable_for_cleanup?(server)
|
267
|
+
# Cleanup this server if its idle timeout has expired.
|
268
|
+
if server.next_cleaning_time <= current_time
|
269
|
+
keys_to_delete ||= []
|
270
|
+
keys_to_delete << key
|
271
|
+
if server.started?
|
272
|
+
server.stop
|
273
|
+
end
|
274
|
+
# If not, then calculate the next cleaning time because
|
275
|
+
# we're iterating the collection anyway.
|
276
|
+
elsif @next_cleaning_time.nil? ||
|
277
|
+
server.next_cleaning_time < @next_cleaning_time
|
278
|
+
@next_cleaning_time = server.next_cleaning_time
|
279
|
+
end
|
280
|
+
end
|
281
|
+
end
|
282
|
+
if keys_to_delete
|
283
|
+
keys_to_delete.each do |key|
|
284
|
+
@collection.delete(key)
|
285
|
+
end
|
286
|
+
end
|
287
|
+
if @next_cleaning_time.nil?
|
288
|
+
# There are no servers in the collection with an idle timeout.
|
289
|
+
@next_cleaning_time = Time.now + 60 * 60
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
# Checks whether the given server is eligible for being idle cleaned.
|
296
|
+
def eligable_for_cleanup?(server)
|
297
|
+
return server.max_idle_time && server.max_idle_time != 0
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
end # module PhusionPassenger
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module PhusionPassenger
|
2
|
+
|
3
|
+
module AdminTools
|
4
|
+
def self.tmpdir
|
5
|
+
["PASSENGER_TMPDIR", "TMPDIR"].each do |name|
|
6
|
+
if ENV.has_key?(name) && !ENV[name].empty?
|
7
|
+
return ENV[name]
|
8
|
+
end
|
9
|
+
end
|
10
|
+
return "/tmp"
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.process_is_alive?(pid)
|
14
|
+
begin
|
15
|
+
Process.kill(0, pid)
|
16
|
+
return true
|
17
|
+
rescue Errno::ESRCH
|
18
|
+
return false
|
19
|
+
rescue SystemCallError => e
|
20
|
+
return true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end # module AdminTools
|
24
|
+
|
25
|
+
end # module PhusionPassenger
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'phusion_passenger/admin_tools'
|
4
|
+
require 'phusion_passenger/message_channel'
|
5
|
+
|
6
|
+
module PhusionPassenger
|
7
|
+
module AdminTools
|
8
|
+
|
9
|
+
class ControlProcess
|
10
|
+
class Instance
|
11
|
+
attr_accessor :pid, :socket_name, :socket_type, :sessions, :uptime
|
12
|
+
INT_PROPERTIES = [:pid, :sessions]
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_accessor :path
|
16
|
+
attr_accessor :pid
|
17
|
+
|
18
|
+
def self.list(clean_stale = true)
|
19
|
+
results = []
|
20
|
+
Dir["#{AdminTools.tmpdir}/passenger.*"].each do |dir|
|
21
|
+
dir =~ /passenger.(\d+)\Z/
|
22
|
+
next if !$1
|
23
|
+
pid = $1.to_i
|
24
|
+
begin
|
25
|
+
results << ControlProcess.new(pid, dir)
|
26
|
+
rescue ArgumentError
|
27
|
+
# Stale Passenger temp folder. Clean it up if instructed.
|
28
|
+
if clean_stale
|
29
|
+
puts "*** Cleaning stale folder #{dir}"
|
30
|
+
FileUtils.rm_rf(dir)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
return results
|
35
|
+
end
|
36
|
+
|
37
|
+
def initialize(pid, path = nil)
|
38
|
+
if !AdminTools.process_is_alive?(pid)
|
39
|
+
raise ArgumentError, "There is no control process with PID #{pid}."
|
40
|
+
end
|
41
|
+
@pid = pid
|
42
|
+
if path
|
43
|
+
@path = path
|
44
|
+
else
|
45
|
+
@path = "#{AdminTools.tmpdir}/passenger.#{pid}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def status
|
50
|
+
reload
|
51
|
+
return @status
|
52
|
+
end
|
53
|
+
|
54
|
+
def xml
|
55
|
+
reload
|
56
|
+
return @xml
|
57
|
+
end
|
58
|
+
|
59
|
+
def domains
|
60
|
+
reload
|
61
|
+
return @domains
|
62
|
+
end
|
63
|
+
|
64
|
+
def instances
|
65
|
+
return domains.map do |domain|
|
66
|
+
domain[:instances]
|
67
|
+
end.flatten
|
68
|
+
end
|
69
|
+
|
70
|
+
private
|
71
|
+
def reload
|
72
|
+
return if @status
|
73
|
+
File.open("#{path}/status.fifo", 'r') do |f|
|
74
|
+
channel = MessageChannel.new(f)
|
75
|
+
@status = channel.read_scalar
|
76
|
+
@xml = channel.read_scalar
|
77
|
+
end
|
78
|
+
doc = REXML::Document.new(@xml)
|
79
|
+
|
80
|
+
@domains = []
|
81
|
+
doc.elements.each("info/domains/domain") do |domain|
|
82
|
+
instances = []
|
83
|
+
d = {
|
84
|
+
:name => domain.elements["name"].text,
|
85
|
+
:instances => instances
|
86
|
+
}
|
87
|
+
domain.elements.each("instances/instance") do |instance|
|
88
|
+
i = Instance.new
|
89
|
+
instance.elements.each do |element|
|
90
|
+
if i.respond_to?("#{element.name}=")
|
91
|
+
if Instance::INT_PROPERTIES.include?(element.name.to_sym)
|
92
|
+
value = element.text.to_i
|
93
|
+
else
|
94
|
+
value = element.text
|
95
|
+
end
|
96
|
+
i.send("#{element.name}=", value)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
instances << i
|
100
|
+
end
|
101
|
+
@domains << d
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end # module AdminTools
|
107
|
+
end # module PhusionPassenger
|
@@ -17,8 +17,8 @@
|
|
17
17
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
18
18
|
|
19
19
|
require 'rubygems'
|
20
|
-
require '
|
21
|
-
module
|
20
|
+
require 'phusion_passenger/exceptions'
|
21
|
+
module PhusionPassenger
|
22
22
|
|
23
23
|
# Represents a single application instance.
|
24
24
|
class Application
|
@@ -29,10 +29,16 @@ class Application
|
|
29
29
|
# The process ID of this application instance.
|
30
30
|
attr_reader :pid
|
31
31
|
|
32
|
-
# The name of the
|
33
|
-
# new connections.
|
32
|
+
# The name of the socket on which the application instance will accept
|
33
|
+
# new connections. See #listen_socket_type on how one should interpret
|
34
|
+
# this value.
|
34
35
|
attr_reader :listen_socket_name
|
35
36
|
|
37
|
+
# The type of socket that #listen_socket_name refers to. Currently this
|
38
|
+
# is always 'unix', which means that #listen_socket_name refers to the
|
39
|
+
# filename of a Unix domain socket.
|
40
|
+
attr_reader :listen_socket_type
|
41
|
+
|
36
42
|
# The owner pipe of the application instance (an IO object). Please see
|
37
43
|
# RequestHandler for a description of the owner pipe.
|
38
44
|
attr_reader :owner_pipe
|
@@ -81,23 +87,14 @@ class Application
|
|
81
87
|
|
82
88
|
# Creates a new instance of Application. The parameters correspond with the attributes
|
83
89
|
# of the same names. No exceptions will be thrown.
|
84
|
-
def initialize(app_root, pid, listen_socket_name,
|
90
|
+
def initialize(app_root, pid, listen_socket_name, listen_socket_type, owner_pipe)
|
85
91
|
@app_root = app_root
|
86
92
|
@pid = pid
|
87
93
|
@listen_socket_name = listen_socket_name
|
88
|
-
@
|
94
|
+
@listen_socket_type = listen_socket_type
|
89
95
|
@owner_pipe = owner_pipe
|
90
96
|
end
|
91
97
|
|
92
|
-
# Whether _listen_socket_name_ refers to a Unix socket in the abstract namespace.
|
93
|
-
# In any case, _listen_socket_name_ does *not* contain the leading null byte.
|
94
|
-
#
|
95
|
-
# Note that at the moment, only Linux seems to support abstract namespace Unix
|
96
|
-
# sockets.
|
97
|
-
def using_abstract_namespace?
|
98
|
-
return @using_abstract_namespace
|
99
|
-
end
|
100
|
-
|
101
98
|
# Close the connection with the application instance. If there are no other
|
102
99
|
# processes that have connections to this application instance, then it will
|
103
100
|
# shutdown as soon as possible.
|
@@ -108,4 +105,4 @@ class Application
|
|
108
105
|
end
|
109
106
|
end
|
110
107
|
|
111
|
-
end # module
|
108
|
+
end # module PhusionPassenger
|