passenger 5.0.4 → 5.0.5
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- checksums.yaml +8 -8
- checksums.yaml.gz.asc +7 -7
- data.tar.gz.asc +7 -7
- data/.editorconfig +10 -0
- data/CHANGELOG +21 -0
- data/build/agents.rb +2 -2
- data/build/apache2.rb +6 -5
- data/build/common_library.rb +22 -7
- data/build/cxx_tests.rb +0 -3
- data/build/misc.rb +1 -1
- data/dev/parse_file_descriptor_log +119 -0
- data/doc/CloudLicensingConfiguration.html +387 -0
- data/doc/Design and Architecture.html +2430 -0
- data/doc/Packaging.html +488 -0
- data/doc/Security of user switching support.html +1833 -0
- data/doc/ServerOptimizationGuide.html +659 -0
- data/doc/ServerOptimizationGuide.txt.md +8 -0
- data/doc/Users guide Apache.html +9116 -0
- data/doc/Users guide Apache.idmap.txt +6 -2
- data/doc/Users guide Apache.txt +26 -7
- data/doc/Users guide Nginx.html +9025 -0
- data/doc/Users guide Nginx.idmap.txt +7 -3
- data/doc/Users guide Nginx.txt +29 -6
- data/doc/Users guide Standalone.html +3983 -0
- data/doc/Users guide.html +1748 -0
- data/doc/users_guide_snippets/installation.txt +4 -4
- data/ext/apache2/Configuration.cpp +16 -5
- data/ext/apache2/Configuration.hpp +4 -2
- data/ext/apache2/Hooks.cpp +44 -19
- data/ext/boost/libs/thread/src/pthread/once.cpp +2 -0
- data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +6 -0
- data/ext/common/AgentsStarter.h +3 -2
- data/ext/common/ApplicationPool2/DirectSpawner.h +14 -4
- data/ext/common/ApplicationPool2/DummySpawner.h +12 -7
- data/ext/common/ApplicationPool2/Implementation.cpp +1 -1
- data/ext/common/ApplicationPool2/Process.h +2 -1
- data/ext/common/ApplicationPool2/Session.h +6 -6
- data/ext/common/ApplicationPool2/SmartSpawner.h +19 -4
- data/ext/common/ApplicationPool2/Socket.h +59 -27
- data/ext/common/ApplicationPool2/Spawner.h +2 -2
- data/ext/common/BackgroundEventLoop.cpp +6 -1
- data/ext/common/Constants.h +1 -1
- data/ext/common/EventedClient.h +1 -1
- data/ext/common/EventedServer.h +2 -2
- data/ext/common/FileDescriptor.h +25 -6
- data/ext/common/Logging.cpp +107 -52
- data/ext/common/Logging.h +146 -19
- data/ext/common/MessageClient.h +2 -2
- data/ext/common/MessageServer.h +3 -2
- data/ext/common/RandomGenerator.h +8 -7
- data/ext/common/SafeLibev.h +5 -1
- data/ext/common/ServerKit/AcceptLoadBalancer.h +9 -4
- data/ext/common/ServerKit/FdSinkChannel.h +5 -2
- data/ext/common/ServerKit/FdSourceChannel.h +5 -2
- data/ext/common/ServerKit/FileBufferedChannel.h +2 -0
- data/ext/common/ServerKit/FileBufferedFdSinkChannel.h +7 -2
- data/ext/common/ServerKit/HttpServer.h +6 -0
- data/ext/common/ServerKit/Server.h +40 -3
- data/ext/common/StaticString.h +20 -0
- data/ext/common/UnionStation/Connection.h +3 -1
- data/ext/common/UnionStation/Core.h +6 -4
- data/ext/common/Utils.cpp +4 -3
- data/ext/common/Utils/DateParsing.h +19 -5
- data/ext/common/Utils/FastStringStream.h +183 -0
- data/ext/common/Utils/IOUtils.cpp +47 -28
- data/ext/common/Utils/IOUtils.h +56 -12
- data/ext/common/Utils/MessagePassing.h +3 -3
- data/ext/common/Utils/ProcessMetricsCollector.h +2 -2
- data/ext/common/Utils/ScopeGuard.h +16 -5
- data/ext/common/Utils/SpeedMeter.h +2 -2
- data/ext/common/Utils/StrIntUtils.cpp +6 -6
- data/ext/common/Utils/StrIntUtils.h +2 -1
- data/ext/common/agents/Base.cpp +56 -4
- data/ext/common/agents/Base.h +2 -1
- data/ext/common/agents/HelperAgent/AdminServer.h +122 -11
- data/ext/common/agents/HelperAgent/Main.cpp +16 -5
- data/ext/common/agents/HelperAgent/OptionParser.h +7 -1
- data/ext/common/agents/HelperAgent/RequestHandler.h +1 -1
- data/ext/common/agents/HelperAgent/RequestHandler/Hooks.cpp +10 -1
- data/ext/common/agents/HelperAgent/RequestHandler/Request.h +8 -0
- data/ext/common/agents/HelperAgent/RequestHandler/TurboCaching.h +4 -3
- data/ext/common/agents/LoggingAgent/AdminServer.h +57 -11
- data/ext/common/agents/LoggingAgent/LoggingServer.h +3 -3
- data/ext/common/agents/LoggingAgent/Main.cpp +11 -3
- data/ext/common/agents/Watchdog/AdminServer.h +53 -11
- data/ext/common/agents/Watchdog/AgentWatcher.cpp +3 -3
- data/ext/common/agents/Watchdog/Main.cpp +13 -6
- data/ext/libeio/ecb.h +1 -1
- data/ext/libev/ev.c +13 -1
- data/ext/libev/ev.h +3 -0
- data/ext/nginx/Configuration.c +28 -6
- data/ext/nginx/Configuration.h +2 -1
- data/ext/nginx/ngx_http_passenger_module.c +5 -4
- data/ext/oxt/dynamic_thread_group.hpp +38 -5
- data/lib/phusion_passenger.rb +1 -1
- data/lib/phusion_passenger/common_library.rb +9 -5
- data/lib/phusion_passenger/config/reopen_logs_command.rb +2 -2
- data/lib/phusion_passenger/packaging.rb +23 -37
- data/passenger.gemspec +21 -21
- metadata +4 -453
- metadata.gz.asc +7 -7
- data/.gitignore +0 -68
- data/.travis.yml +0 -16
- data/Gemfile +0 -17
- data/Gemfile.lock +0 -39
- data/Vagrantfile +0 -54
- data/debian.template/README.Debian +0 -15
- data/debian.template/changelog +0 -316
- data/debian.template/compat +0 -1
- data/debian.template/control.erb +0 -91
- data/debian.template/copyright +0 -385
- data/debian.template/libapache2-mod-passenger.install +0 -3
- data/debian.template/libapache2-mod-passenger.postinst +0 -36
- data/debian.template/libapache2-mod-passenger.prerm +0 -15
- data/debian.template/locations.ini.erb +0 -14
- data/debian.template/passenger-dev.install.erb +0 -3
- data/debian.template/passenger-doc.install.erb +0 -2
- data/debian.template/passenger.conf +0 -6
- data/debian.template/passenger.docs +0 -4
- data/debian.template/passenger.install.erb +0 -14
- data/debian.template/passenger.load +0 -3
- data/debian.template/passenger.manpages +0 -3
- data/debian.template/patches/series +0 -0
- data/debian.template/rules.erb +0 -76
- data/debian.template/source/format +0 -1
- data/ext/common/EventedBufferedInput.h +0 -458
- data/packaging/rpm/LICENSE.txt +0 -19
- data/packaging/rpm/Makefile +0 -13
- data/packaging/rpm/README.md +0 -41
- data/packaging/rpm/Vagrantfile +0 -38
- data/packaging/rpm/Vagrantfile.centos +0 -30
- data/packaging/rpm/build +0 -170
- data/packaging/rpm/create_project +0 -41
- data/packaging/rpm/git_update +0 -88
- data/packaging/rpm/image/Dockerfile +0 -37
- data/packaging/rpm/image/Gemfile +0 -3
- data/packaging/rpm/image/Gemfile.lock +0 -12
- data/packaging/rpm/image/RPM-GPG-KEY-amazon-ga +0 -19
- data/packaging/rpm/image/amazon2014-i386.cfg +0 -96
- data/packaging/rpm/image/amazon2014-x86_64.cfg +0 -96
- data/packaging/rpm/image/site-defaults.cfg +0 -168
- data/packaging/rpm/internal/build_tasks.rb +0 -238
- data/packaging/rpm/internal/dummygpg +0 -11
- data/packaging/rpm/internal/exec_build +0 -42
- data/packaging/rpm/internal/get_distro_arch +0 -14
- data/packaging/rpm/internal/get_distro_id +0 -10
- data/packaging/rpm/internal/git_update +0 -27
- data/packaging/rpm/internal/inituidgid +0 -17
- data/packaging/rpm/internal/my_init +0 -344
- data/packaging/rpm/internal/python27 +0 -3
- data/packaging/rpm/internal/repo_update +0 -46
- data/packaging/rpm/internal/setuser +0 -26
- data/packaging/rpm/internal/tracking_helper +0 -40
- data/packaging/rpm/jenkins_release +0 -99
- data/packaging/rpm/lib/build_tasks_support.rb +0 -402
- data/packaging/rpm/lib/preprocessor.rb +0 -341
- data/packaging/rpm/nginx_spec/404.html +0 -119
- data/packaging/rpm/nginx_spec/50x.html +0 -119
- data/packaging/rpm/nginx_spec/index.html +0 -116
- data/packaging/rpm/nginx_spec/nginx-auto-cc-gcc.patch +0 -13
- data/packaging/rpm/nginx_spec/nginx-logo.png +0 -0
- data/packaging/rpm/nginx_spec/nginx-upgrade +0 -13
- data/packaging/rpm/nginx_spec/nginx-upgrade.8 +0 -151
- data/packaging/rpm/nginx_spec/nginx.conf +0 -131
- data/packaging/rpm/nginx_spec/nginx.init +0 -144
- data/packaging/rpm/nginx_spec/nginx.logrotate +0 -13
- data/packaging/rpm/nginx_spec/nginx.service +0 -15
- data/packaging/rpm/nginx_spec/nginx.spec.template +0 -560
- data/packaging/rpm/nginx_spec/nginx.sysconfig +0 -4
- data/packaging/rpm/nginx_spec/passenger.conf +0 -9
- data/packaging/rpm/nginx_spec/poweredby.png +0 -0
- data/packaging/rpm/passenger_spec/apache-passenger.conf.in +0 -26
- data/packaging/rpm/passenger_spec/config.json +0 -30
- data/packaging/rpm/passenger_spec/passenger.logrotate +0 -7
- data/packaging/rpm/passenger_spec/passenger.spec.template +0 -478
- data/packaging/rpm/passenger_spec/passenger_dynamic_thread_group.patch +0 -16
- data/packaging/rpm/passenger_spec/passenger_tests_default_config_example.patch +0 -44
- data/packaging/rpm/passenger_spec/rubygem-passenger-4.0.18-GLIBC_HAVE_LONG_LONG.patch +0 -21
- data/packaging/rpm/repo_update +0 -114
- data/packaging/rpm/setup-system +0 -61
- data/packaging/rpm/shell +0 -10
- data/test/.rspec +0 -4
- data/test/config.json.example +0 -42
- data/test/config.json.rpm-automation +0 -15
- data/test/config.json.travis +0 -15
- data/test/config.json.vagrant +0 -30
- data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +0 -124
- data/test/cxx/ApplicationPool2/OptionsTest.cpp +0 -30
- data/test/cxx/ApplicationPool2/PoolTest.cpp +0 -2062
- data/test/cxx/ApplicationPool2/ProcessTest.cpp +0 -130
- data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +0 -243
- data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +0 -823
- data/test/cxx/BufferedIOTest.cpp +0 -364
- data/test/cxx/CachedFileStatTest.cpp +0 -402
- data/test/cxx/CxxTestMain.cpp +0 -181
- data/test/cxx/DataStructures/LStringTest.cpp +0 -275
- data/test/cxx/DataStructures/StringKeyTableTest.cpp +0 -199
- data/test/cxx/DateParsingTest.cpp +0 -75
- data/test/cxx/DechunkerTest.cpp +0 -250
- data/test/cxx/EventedBufferedInputTest.cpp +0 -758
- data/test/cxx/EventedClientTest.cpp +0 -523
- data/test/cxx/FileChangeCheckerTest.cpp +0 -331
- data/test/cxx/FileDescriptorTest.cpp +0 -69
- data/test/cxx/FilterSupportTest.cpp +0 -433
- data/test/cxx/IOUtilsTest.cpp +0 -861
- data/test/cxx/MemoryKit/MbufTest.cpp +0 -213
- data/test/cxx/MessageIOTest.cpp +0 -360
- data/test/cxx/MessagePassingTest.cpp +0 -81
- data/test/cxx/MessageReadersWritersTest.cpp +0 -576
- data/test/cxx/MessageServerTest.cpp +0 -393
- data/test/cxx/ProcessMetricsCollectorTest.cpp +0 -123
- data/test/cxx/RequestHandlerTest.cpp +0 -1463
- data/test/cxx/ResponseCacheTest.cpp +0 -322
- data/test/cxx/ServerKit/ChannelTest.cpp +0 -1467
- data/test/cxx/ServerKit/CookieUtilsTest.cpp +0 -274
- data/test/cxx/ServerKit/FileBufferedChannelTest.cpp +0 -992
- data/test/cxx/ServerKit/HeaderTableTest.cpp +0 -177
- data/test/cxx/ServerKit/HttpServerTest.cpp +0 -1580
- data/test/cxx/ServerKit/ServerTest.cpp +0 -408
- data/test/cxx/StaticStringTest.cpp +0 -220
- data/test/cxx/StringMapTest.cpp +0 -131
- data/test/cxx/SystemTimeTest.cpp +0 -37
- data/test/cxx/TemplateTest.cpp +0 -118
- data/test/cxx/TestSupport.cpp +0 -207
- data/test/cxx/TestSupport.h +0 -333
- data/test/cxx/UnionStationTest.cpp +0 -741
- data/test/cxx/Utils/StrIntUtilsTest.cpp +0 -39
- data/test/cxx/UtilsTest.cpp +0 -672
- data/test/cxx/VariantMapTest.cpp +0 -191
- data/test/gdbinit.example +0 -34
- data/test/integration_tests/apache2_tests.rb +0 -585
- data/test/integration_tests/downloaded_binaries_tests.rb +0 -185
- data/test/integration_tests/native_packaging_spec.rb +0 -368
- data/test/integration_tests/nginx_tests.rb +0 -402
- data/test/integration_tests/shared/example_webapp_tests.rb +0 -289
- data/test/integration_tests/source_packaging_test.rb +0 -201
- data/test/integration_tests/spec_helper.rb +0 -22
- data/test/integration_tests/standalone_tests.rb +0 -392
- data/test/node/line_reader_spec.js +0 -338
- data/test/node/spec_helper.js +0 -65
- data/test/oxt/backtrace_test.cpp +0 -88
- data/test/oxt/counter.hpp +0 -55
- data/test/oxt/dynamic_thread_group_test.cpp +0 -131
- data/test/oxt/oxt_test_main.cpp +0 -27
- data/test/oxt/spin_lock_test.cpp +0 -59
- data/test/oxt/syscall_interruption_test.cpp +0 -39
- data/test/ruby/debug_logging_spec.rb +0 -145
- data/test/ruby/message_channel_spec.rb +0 -196
- data/test/ruby/rack/loader_spec.rb +0 -42
- data/test/ruby/rack/preloader_spec.rb +0 -48
- data/test/ruby/rails3.0/loader_spec.rb +0 -26
- data/test/ruby/rails3.0/preloader_spec.rb +0 -32
- data/test/ruby/rails3.1/loader_spec.rb +0 -26
- data/test/ruby/rails3.1/preloader_spec.rb +0 -32
- data/test/ruby/rails3.2/loader_spec.rb +0 -26
- data/test/ruby/rails3.2/preloader_spec.rb +0 -32
- data/test/ruby/rails4.0/loader_spec.rb +0 -28
- data/test/ruby/rails4.0/preloader_spec.rb +0 -34
- data/test/ruby/rails4.1/loader_spec.rb +0 -28
- data/test/ruby/rails4.1/preloader_spec.rb +0 -34
- data/test/ruby/request_handler_spec.rb +0 -747
- data/test/ruby/shared/loader_sharedspec.rb +0 -247
- data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +0 -357
- data/test/ruby/shared/ruby_loader_sharedspec.rb +0 -55
- data/test/ruby/spec_helper.rb +0 -114
- data/test/ruby/standalone/runtime_installer_spec.rb +0 -402
- data/test/ruby/union_station_spec.rb +0 -288
- data/test/ruby/utils/file_system_watcher_spec.rb +0 -229
- data/test/ruby/utils/hosts_file_parser.rb +0 -258
- data/test/ruby/utils/tee_input_spec.rb +0 -235
- data/test/ruby/utils/unseekable_socket_spec.rb +0 -66
- data/test/ruby/utils_spec.rb +0 -41
- data/test/stub/apache2/httpd.conf.erb +0 -122
- data/test/stub/apache2/mime.types +0 -748
- data/test/stub/garbage1.dat +0 -0
- data/test/stub/garbage2.dat +0 -0
- data/test/stub/garbage3.dat +0 -0
- data/test/stub/http_request.yml +0 -23
- data/test/stub/index.html +0 -1
- data/test/stub/nginx/koi-utf +0 -109
- data/test/stub/nginx/koi-win +0 -103
- data/test/stub/nginx/mime.types +0 -70
- data/test/stub/nginx/nginx.conf.erb +0 -70
- data/test/stub/nginx/win-utf +0 -126
- data/test/stub/node/app.js +0 -133
- data/test/stub/node/public/.gitignore +0 -0
- data/test/stub/node/tmp/.gitignore +0 -0
- data/test/stub/rack/config.ru +0 -95
- data/test/stub/rack/library.rb +0 -16
- data/test/stub/rack/public/.gitignore +0 -0
- data/test/stub/rack/start.rb +0 -52
- data/test/stub/rack/tmp/.gitignore +0 -0
- data/test/stub/rails3.0/.gitignore +0 -4
- data/test/stub/rails3.0/Gemfile +0 -22
- data/test/stub/rails3.0/Gemfile.lock +0 -80
- data/test/stub/rails3.0/Rakefile +0 -10
- data/test/stub/rails3.0/app/controllers/application_controller.rb +0 -4
- data/test/stub/rails3.0/app/helpers/application_helper.rb +0 -2
- data/test/stub/rails3.0/app/views/layouts/application.html.erb +0 -14
- data/test/stub/rails3.0/config.ru +0 -4
- data/test/stub/rails3.0/config/application.rb +0 -48
- data/test/stub/rails3.0/config/boot.rb +0 -13
- data/test/stub/rails3.0/config/database.yml +0 -22
- data/test/stub/rails3.0/config/environment.rb +0 -5
- data/test/stub/rails3.0/config/environments/development.rb +0 -19
- data/test/stub/rails3.0/config/environments/production.rb +0 -48
- data/test/stub/rails3.0/config/environments/test.rb +0 -32
- data/test/stub/rails3.0/config/initializers/backtrace_silencers.rb +0 -7
- data/test/stub/rails3.0/config/initializers/inflections.rb +0 -10
- data/test/stub/rails3.0/config/initializers/mime_types.rb +0 -5
- data/test/stub/rails3.0/config/initializers/passenger.rb +0 -2
- data/test/stub/rails3.0/config/initializers/secret_token.rb +0 -7
- data/test/stub/rails3.0/config/initializers/session_store.rb +0 -8
- data/test/stub/rails3.0/config/locales/en.yml +0 -5
- data/test/stub/rails3.0/config/routes.rb +0 -58
- data/test/stub/rails3.0/db/seeds.rb +0 -7
- data/test/stub/rails3.0/doc/README_FOR_APP +0 -2
- data/test/stub/rails3.0/lib/tasks/.gitkeep +0 -0
- data/test/stub/rails3.0/log/.gitignore +0 -0
- data/test/stub/rails3.0/public/404.html +0 -26
- data/test/stub/rails3.0/public/422.html +0 -26
- data/test/stub/rails3.0/public/500.html +0 -26
- data/test/stub/rails3.0/public/favicon.ico +0 -0
- data/test/stub/rails3.0/public/index.html +0 -279
- data/test/stub/rails3.0/public/robots.txt +0 -5
- data/test/stub/rails3.0/public/stylesheets/.gitkeep +0 -0
- data/test/stub/rails3.0/script/rails +0 -9
- data/test/stub/rails3.0/test/performance/browsing_test.rb +0 -9
- data/test/stub/rails3.0/test/test_helper.rb +0 -13
- data/test/stub/rails3.0/vendor/plugins/.gitkeep +0 -0
- data/test/stub/rails3.1/.gitignore +0 -15
- data/test/stub/rails3.1/Gemfile +0 -37
- data/test/stub/rails3.1/Gemfile.lock +0 -115
- data/test/stub/rails3.1/README +0 -261
- data/test/stub/rails3.1/Rakefile +0 -7
- data/test/stub/rails3.1/app/assets/images/rails.png +0 -0
- data/test/stub/rails3.1/app/assets/stylesheets/application.css +0 -7
- data/test/stub/rails3.1/app/controllers/application_controller.rb +0 -3
- data/test/stub/rails3.1/app/helpers/application_helper.rb +0 -2
- data/test/stub/rails3.1/app/mailers/.gitkeep +0 -0
- data/test/stub/rails3.1/app/models/.gitkeep +0 -0
- data/test/stub/rails3.1/app/views/layouts/application.html.erb +0 -14
- data/test/stub/rails3.1/config.ru +0 -4
- data/test/stub/rails3.1/config/application.rb +0 -48
- data/test/stub/rails3.1/config/boot.rb +0 -6
- data/test/stub/rails3.1/config/database.yml +0 -25
- data/test/stub/rails3.1/config/environment.rb +0 -5
- data/test/stub/rails3.1/config/environments/development.rb +0 -30
- data/test/stub/rails3.1/config/environments/production.rb +0 -60
- data/test/stub/rails3.1/config/environments/test.rb +0 -39
- data/test/stub/rails3.1/config/initializers/backtrace_silencers.rb +0 -7
- data/test/stub/rails3.1/config/initializers/inflections.rb +0 -10
- data/test/stub/rails3.1/config/initializers/mime_types.rb +0 -5
- data/test/stub/rails3.1/config/initializers/passenger.rb +0 -2
- data/test/stub/rails3.1/config/initializers/secret_token.rb +0 -7
- data/test/stub/rails3.1/config/initializers/session_store.rb +0 -8
- data/test/stub/rails3.1/config/initializers/wrap_parameters.rb +0 -14
- data/test/stub/rails3.1/config/locales/en.yml +0 -5
- data/test/stub/rails3.1/config/routes.rb +0 -58
- data/test/stub/rails3.1/db/seeds.rb +0 -7
- data/test/stub/rails3.1/doc/README_FOR_APP +0 -2
- data/test/stub/rails3.1/lib/assets/.gitkeep +0 -0
- data/test/stub/rails3.1/lib/tasks/.gitkeep +0 -0
- data/test/stub/rails3.1/log/.gitkeep +0 -0
- data/test/stub/rails3.1/public/404.html +0 -26
- data/test/stub/rails3.1/public/422.html +0 -26
- data/test/stub/rails3.1/public/500.html +0 -26
- data/test/stub/rails3.1/public/favicon.ico +0 -0
- data/test/stub/rails3.1/public/index.html +0 -241
- data/test/stub/rails3.1/public/robots.txt +0 -5
- data/test/stub/rails3.1/script/rails +0 -6
- data/test/stub/rails3.1/test/fixtures/.gitkeep +0 -0
- data/test/stub/rails3.1/test/functional/.gitkeep +0 -0
- data/test/stub/rails3.1/test/integration/.gitkeep +0 -0
- data/test/stub/rails3.1/test/performance/browsing_test.rb +0 -12
- data/test/stub/rails3.1/test/test_helper.rb +0 -13
- data/test/stub/rails3.1/test/unit/.gitkeep +0 -0
- data/test/stub/rails3.1/vendor/assets/stylesheets/.gitkeep +0 -0
- data/test/stub/rails3.1/vendor/plugins/.gitkeep +0 -0
- data/test/stub/rails3.2/.gitignore +0 -15
- data/test/stub/rails3.2/Gemfile +0 -39
- data/test/stub/rails3.2/Gemfile.lock +0 -113
- data/test/stub/rails3.2/Rakefile +0 -7
- data/test/stub/rails3.2/app/assets/images/rails.png +0 -0
- data/test/stub/rails3.2/app/assets/stylesheets/application.css +0 -13
- data/test/stub/rails3.2/app/controllers/application_controller.rb +0 -3
- data/test/stub/rails3.2/app/helpers/application_helper.rb +0 -2
- data/test/stub/rails3.2/app/mailers/.gitkeep +0 -0
- data/test/stub/rails3.2/app/models/.gitkeep +0 -0
- data/test/stub/rails3.2/app/views/layouts/application.html.erb +0 -14
- data/test/stub/rails3.2/config.ru +0 -4
- data/test/stub/rails3.2/config/application.rb +0 -62
- data/test/stub/rails3.2/config/boot.rb +0 -6
- data/test/stub/rails3.2/config/database.yml +0 -25
- data/test/stub/rails3.2/config/environment.rb +0 -5
- data/test/stub/rails3.2/config/environments/development.rb +0 -37
- data/test/stub/rails3.2/config/environments/production.rb +0 -67
- data/test/stub/rails3.2/config/environments/test.rb +0 -37
- data/test/stub/rails3.2/config/initializers/backtrace_silencers.rb +0 -7
- data/test/stub/rails3.2/config/initializers/inflections.rb +0 -15
- data/test/stub/rails3.2/config/initializers/mime_types.rb +0 -5
- data/test/stub/rails3.2/config/initializers/passenger.rb +0 -2
- data/test/stub/rails3.2/config/initializers/secret_token.rb +0 -7
- data/test/stub/rails3.2/config/initializers/session_store.rb +0 -8
- data/test/stub/rails3.2/config/initializers/wrap_parameters.rb +0 -14
- data/test/stub/rails3.2/config/locales/en.yml +0 -5
- data/test/stub/rails3.2/config/routes.rb +0 -58
- data/test/stub/rails3.2/db/seeds.rb +0 -7
- data/test/stub/rails3.2/doc/README_FOR_APP +0 -2
- data/test/stub/rails3.2/lib/assets/.gitkeep +0 -0
- data/test/stub/rails3.2/lib/tasks/.gitkeep +0 -0
- data/test/stub/rails3.2/log/.gitkeep +0 -0
- data/test/stub/rails3.2/public/404.html +0 -26
- data/test/stub/rails3.2/public/422.html +0 -26
- data/test/stub/rails3.2/public/500.html +0 -25
- data/test/stub/rails3.2/public/favicon.ico +0 -0
- data/test/stub/rails3.2/public/index.html +0 -241
- data/test/stub/rails3.2/public/robots.txt +0 -5
- data/test/stub/rails3.2/script/rails +0 -6
- data/test/stub/rails3.2/test/fixtures/.gitkeep +0 -0
- data/test/stub/rails3.2/test/functional/.gitkeep +0 -0
- data/test/stub/rails3.2/test/integration/.gitkeep +0 -0
- data/test/stub/rails3.2/test/performance/browsing_test.rb +0 -12
- data/test/stub/rails3.2/test/test_helper.rb +0 -13
- data/test/stub/rails3.2/test/unit/.gitkeep +0 -0
- data/test/stub/rails3.2/vendor/assets/stylesheets/.gitkeep +0 -0
- data/test/stub/rails3.2/vendor/plugins/.gitkeep +0 -0
- data/test/stub/rails4.0/.gitignore +0 -16
- data/test/stub/rails4.0/Gemfile +0 -45
- data/test/stub/rails4.0/Gemfile.lock +0 -126
- data/test/stub/rails4.0/README.rdoc +0 -28
- data/test/stub/rails4.0/Rakefile +0 -6
- data/test/stub/rails4.0/app/assets/images/.keep +0 -0
- data/test/stub/rails4.0/app/assets/javascripts/application.js +0 -16
- data/test/stub/rails4.0/app/assets/stylesheets/application.css +0 -13
- data/test/stub/rails4.0/app/controllers/application_controller.rb +0 -5
- data/test/stub/rails4.0/app/controllers/concerns/.keep +0 -0
- data/test/stub/rails4.0/app/helpers/application_helper.rb +0 -2
- data/test/stub/rails4.0/app/mailers/.keep +0 -0
- data/test/stub/rails4.0/app/models/.keep +0 -0
- data/test/stub/rails4.0/app/models/concerns/.keep +0 -0
- data/test/stub/rails4.0/app/views/layouts/application.html.erb +0 -14
- data/test/stub/rails4.0/bin/bundle +0 -3
- data/test/stub/rails4.0/bin/rails +0 -4
- data/test/stub/rails4.0/bin/rake +0 -4
- data/test/stub/rails4.0/config.ru +0 -4
- data/test/stub/rails4.0/config/application.rb +0 -23
- data/test/stub/rails4.0/config/boot.rb +0 -4
- data/test/stub/rails4.0/config/database.yml +0 -25
- data/test/stub/rails4.0/config/environment.rb +0 -5
- data/test/stub/rails4.0/config/environments/development.rb +0 -29
- data/test/stub/rails4.0/config/environments/production.rb +0 -80
- data/test/stub/rails4.0/config/environments/test.rb +0 -36
- data/test/stub/rails4.0/config/initializers/backtrace_silencers.rb +0 -7
- data/test/stub/rails4.0/config/initializers/filter_parameter_logging.rb +0 -4
- data/test/stub/rails4.0/config/initializers/inflections.rb +0 -16
- data/test/stub/rails4.0/config/initializers/mime_types.rb +0 -5
- data/test/stub/rails4.0/config/initializers/passenger.rb +0 -2
- data/test/stub/rails4.0/config/initializers/secret_token.rb +0 -12
- data/test/stub/rails4.0/config/initializers/session_store.rb +0 -3
- data/test/stub/rails4.0/config/initializers/wrap_parameters.rb +0 -14
- data/test/stub/rails4.0/config/locales/en.yml +0 -23
- data/test/stub/rails4.0/config/routes.rb +0 -57
- data/test/stub/rails4.0/db/seeds.rb +0 -7
- data/test/stub/rails4.0/lib/assets/.keep +0 -0
- data/test/stub/rails4.0/lib/tasks/.keep +0 -0
- data/test/stub/rails4.0/log/.keep +0 -0
- data/test/stub/rails4.0/public/404.html +0 -58
- data/test/stub/rails4.0/public/422.html +0 -58
- data/test/stub/rails4.0/public/500.html +0 -57
- data/test/stub/rails4.0/public/favicon.ico +0 -0
- data/test/stub/rails4.0/public/robots.txt +0 -5
- data/test/stub/rails4.0/test/controllers/.keep +0 -0
- data/test/stub/rails4.0/test/fixtures/.keep +0 -0
- data/test/stub/rails4.0/test/helpers/.keep +0 -0
- data/test/stub/rails4.0/test/integration/.keep +0 -0
- data/test/stub/rails4.0/test/mailers/.keep +0 -0
- data/test/stub/rails4.0/test/models/.keep +0 -0
- data/test/stub/rails4.0/test/test_helper.rb +0 -15
- data/test/stub/rails4.0/vendor/assets/javascripts/.keep +0 -0
- data/test/stub/rails4.0/vendor/assets/stylesheets/.keep +0 -0
- data/test/stub/rails4.1/.gitignore +0 -16
- data/test/stub/rails4.1/Gemfile +0 -45
- data/test/stub/rails4.1/Gemfile.lock +0 -129
- data/test/stub/rails4.1/README.rdoc +0 -28
- data/test/stub/rails4.1/Rakefile +0 -6
- data/test/stub/rails4.1/app/assets/images/.keep +0 -0
- data/test/stub/rails4.1/app/assets/javascripts/application.js +0 -16
- data/test/stub/rails4.1/app/assets/stylesheets/application.css +0 -13
- data/test/stub/rails4.1/app/controllers/application_controller.rb +0 -5
- data/test/stub/rails4.1/app/controllers/concerns/.keep +0 -0
- data/test/stub/rails4.1/app/helpers/application_helper.rb +0 -2
- data/test/stub/rails4.1/app/mailers/.keep +0 -0
- data/test/stub/rails4.1/app/models/.keep +0 -0
- data/test/stub/rails4.1/app/models/concerns/.keep +0 -0
- data/test/stub/rails4.1/app/views/layouts/application.html.erb +0 -14
- data/test/stub/rails4.1/bin/bundle +0 -3
- data/test/stub/rails4.1/bin/rails +0 -4
- data/test/stub/rails4.1/bin/rake +0 -4
- data/test/stub/rails4.1/config.ru +0 -4
- data/test/stub/rails4.1/config/application.rb +0 -23
- data/test/stub/rails4.1/config/boot.rb +0 -4
- data/test/stub/rails4.1/config/database.yml +0 -25
- data/test/stub/rails4.1/config/environment.rb +0 -5
- data/test/stub/rails4.1/config/environments/development.rb +0 -29
- data/test/stub/rails4.1/config/environments/production.rb +0 -80
- data/test/stub/rails4.1/config/environments/test.rb +0 -36
- data/test/stub/rails4.1/config/initializers/backtrace_silencers.rb +0 -7
- data/test/stub/rails4.1/config/initializers/filter_parameter_logging.rb +0 -4
- data/test/stub/rails4.1/config/initializers/inflections.rb +0 -16
- data/test/stub/rails4.1/config/initializers/mime_types.rb +0 -5
- data/test/stub/rails4.1/config/initializers/passenger.rb +0 -5
- data/test/stub/rails4.1/config/initializers/secret_token.rb +0 -12
- data/test/stub/rails4.1/config/initializers/session_store.rb +0 -3
- data/test/stub/rails4.1/config/initializers/wrap_parameters.rb +0 -14
- data/test/stub/rails4.1/config/locales/en.yml +0 -23
- data/test/stub/rails4.1/config/routes.rb +0 -57
- data/test/stub/rails4.1/db/seeds.rb +0 -7
- data/test/stub/rails4.1/lib/assets/.keep +0 -0
- data/test/stub/rails4.1/lib/tasks/.keep +0 -0
- data/test/stub/rails4.1/log/.keep +0 -0
- data/test/stub/rails4.1/public/404.html +0 -58
- data/test/stub/rails4.1/public/422.html +0 -58
- data/test/stub/rails4.1/public/500.html +0 -57
- data/test/stub/rails4.1/public/favicon.ico +0 -0
- data/test/stub/rails4.1/public/robots.txt +0 -5
- data/test/stub/rails4.1/test/controllers/.keep +0 -0
- data/test/stub/rails4.1/test/fixtures/.keep +0 -0
- data/test/stub/rails4.1/test/helpers/.keep +0 -0
- data/test/stub/rails4.1/test/integration/.keep +0 -0
- data/test/stub/rails4.1/test/mailers/.keep +0 -0
- data/test/stub/rails4.1/test/models/.keep +0 -0
- data/test/stub/rails4.1/test/test_helper.rb +0 -15
- data/test/stub/rails4.1/vendor/assets/javascripts/.keep +0 -0
- data/test/stub/rails4.1/vendor/assets/stylesheets/.keep +0 -0
- data/test/stub/start_error.pl +0 -24
- data/test/stub/upload_data.txt +0 -494
- data/test/stub/wsgi/passenger_wsgi.py +0 -212
- data/test/stub/wsgi/public/.gitignore +0 -0
- data/test/stub/wsgi/tmp/.gitignore +0 -0
- data/test/support/allocate_memory.c +0 -14
- data/test/support/apache2_controller.rb +0 -258
- data/test/support/multipart.rb +0 -62
- data/test/support/nginx_controller.rb +0 -97
- data/test/support/placebo-preloader.rb +0 -88
- data/test/support/test_helper.rb +0 -455
- data/test/support/valgrind.h +0 -2539
- data/test/tut/tut.h +0 -1310
- data/test/tut/tut_reporter.h +0 -256
- data/test/valgrind-osx.supp +0 -7
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Phusion Passenger - https://www.phusionpassenger.com/
|
3
|
-
* Copyright (c) 2011-
|
3
|
+
* Copyright (c) 2011-2015 Phusion
|
4
4
|
*
|
5
5
|
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
6
|
*
|
@@ -47,13 +47,13 @@ using namespace boost;
|
|
47
47
|
|
48
48
|
struct Connection {
|
49
49
|
int fd;
|
50
|
-
bool
|
50
|
+
bool wantKeepAlive: 1;
|
51
51
|
bool fail: 1;
|
52
52
|
bool blocking: 1;
|
53
53
|
|
54
54
|
Connection()
|
55
55
|
: fd(-1),
|
56
|
-
|
56
|
+
wantKeepAlive(false),
|
57
57
|
fail(false),
|
58
58
|
blocking(true)
|
59
59
|
{ }
|
@@ -62,8 +62,9 @@ struct Connection {
|
|
62
62
|
if (fd != -1) {
|
63
63
|
int fd2 = fd;
|
64
64
|
fd = -1;
|
65
|
-
|
65
|
+
wantKeepAlive = false;
|
66
66
|
safelyClose(fd2);
|
67
|
+
P_LOG_FILE_DESCRIPTOR_CLOSE(fd2);
|
67
68
|
}
|
68
69
|
}
|
69
70
|
};
|
@@ -85,10 +86,11 @@ private:
|
|
85
86
|
Connection connect() const {
|
86
87
|
Connection connection;
|
87
88
|
P_TRACE(3, "Connecting to " << address);
|
88
|
-
connection.fd = connectToServer(address);
|
89
|
+
connection.fd = connectToServer(address, __FILE__, __LINE__);
|
89
90
|
connection.fail = true;
|
90
|
-
connection.
|
91
|
+
connection.wantKeepAlive = false;
|
91
92
|
connection.blocking = true;
|
93
|
+
P_LOG_FILE_DESCRIPTOR_PURPOSE(connection.fd, "App " << pid << " connection");
|
92
94
|
return connection;
|
93
95
|
}
|
94
96
|
|
@@ -97,24 +99,30 @@ public:
|
|
97
99
|
StaticString name;
|
98
100
|
StaticString address;
|
99
101
|
StaticString protocol;
|
102
|
+
pid_t pid;
|
100
103
|
int concurrency;
|
101
104
|
|
102
105
|
// Private. In public section as alignment optimization.
|
103
|
-
int
|
106
|
+
int totalConnections;
|
107
|
+
int totalIdleConnections;
|
104
108
|
|
105
109
|
/** Invariant: sessions >= 0 */
|
106
110
|
int sessions;
|
107
111
|
|
108
112
|
Socket()
|
109
|
-
:
|
113
|
+
: pid(-1),
|
114
|
+
concurrency(0)
|
110
115
|
{ }
|
111
116
|
|
112
|
-
Socket(
|
117
|
+
Socket(pid_t _pid, const StaticString &_name, const StaticString &_address,
|
118
|
+
const StaticString &_protocol, int _concurrency)
|
113
119
|
: name(_name),
|
114
120
|
address(_address),
|
115
121
|
protocol(_protocol),
|
122
|
+
pid(_pid),
|
116
123
|
concurrency(_concurrency),
|
117
|
-
|
124
|
+
totalConnections(0),
|
125
|
+
totalIdleConnections(0),
|
118
126
|
sessions(0)
|
119
127
|
{ }
|
120
128
|
|
@@ -123,17 +131,21 @@ public:
|
|
123
131
|
name(other.name),
|
124
132
|
address(other.address),
|
125
133
|
protocol(other.protocol),
|
134
|
+
pid(other.pid),
|
126
135
|
concurrency(other.concurrency),
|
127
|
-
|
136
|
+
totalConnections(other.totalConnections),
|
137
|
+
totalIdleConnections(other.totalIdleConnections),
|
128
138
|
sessions(other.sessions)
|
129
139
|
{ }
|
130
140
|
|
131
141
|
Socket &operator=(const Socket &other) {
|
132
|
-
|
142
|
+
totalConnections = other.totalConnections;
|
143
|
+
totalIdleConnections = other.totalIdleConnections;
|
133
144
|
idleConnections = other.idleConnections;
|
134
145
|
name = other.name;
|
135
146
|
address = other.address;
|
136
147
|
protocol = other.protocol;
|
148
|
+
pid = other.pid;
|
137
149
|
concurrency = other.concurrency;
|
138
150
|
sessions = other.sessions;
|
139
151
|
return *this;
|
@@ -151,41 +163,59 @@ public:
|
|
151
163
|
if (!idleConnections.empty()) {
|
152
164
|
P_TRACE(3, "Socket " << address << ": checking out connection from connection pool (" <<
|
153
165
|
idleConnections.size() << " -> " << (idleConnections.size() - 1) <<
|
154
|
-
" items). Current
|
166
|
+
" items). Current total number of connections: " << totalConnections);
|
155
167
|
Connection connection = idleConnections.back();
|
156
168
|
idleConnections.pop_back();
|
169
|
+
totalIdleConnections--;
|
157
170
|
return connection;
|
158
|
-
} else
|
171
|
+
} else {
|
159
172
|
Connection connection = connect();
|
160
|
-
|
173
|
+
totalConnections++;
|
161
174
|
P_TRACE(3, "Socket " << address << ": there are now " <<
|
162
|
-
|
175
|
+
totalConnections << " total connections");
|
163
176
|
l.unlock();
|
164
177
|
return connection;
|
165
|
-
} else {
|
166
|
-
l.unlock();
|
167
|
-
return connect();
|
168
178
|
}
|
169
179
|
}
|
170
180
|
|
171
181
|
void checkinConnection(Connection &connection) {
|
172
182
|
boost::unique_lock<boost::mutex> l(connectionPoolLock);
|
173
183
|
|
174
|
-
if (connection.fail || !connection.
|
175
|
-
|
184
|
+
if (connection.fail || !connection.wantKeepAlive || totalIdleConnections >= connectionPoolLimit()) {
|
185
|
+
totalConnections--;
|
186
|
+
assert(totalConnections >= 0);
|
176
187
|
P_TRACE(3, "Socket " << address << ": connection not checked back into "
|
177
|
-
"connection pool. There are now " <<
|
178
|
-
"
|
188
|
+
"connection pool. There are now " << totalConnections <<
|
189
|
+
" connections in total");
|
179
190
|
l.unlock();
|
180
191
|
connection.close();
|
181
192
|
} else {
|
182
193
|
P_TRACE(3, "Socket " << address << ": checking in connection into connection pool (" <<
|
183
|
-
|
184
|
-
" items). Current
|
194
|
+
totalIdleConnections << " -> " << (totalIdleConnections + 1) <<
|
195
|
+
" items). Current total number of connections: " << totalConnections);
|
196
|
+
totalIdleConnections++;
|
185
197
|
idleConnections.push_back(connection);
|
186
198
|
}
|
187
199
|
}
|
188
200
|
|
201
|
+
void closeAllConnections() {
|
202
|
+
boost::unique_lock<boost::mutex> l(connectionPoolLock);
|
203
|
+
assert(sessions == 0);
|
204
|
+
assert(totalConnections == totalIdleConnections);
|
205
|
+
vector<Connection>::iterator it, end = idleConnections.end();
|
206
|
+
|
207
|
+
for (it = idleConnections.begin(); it != end; it++) {
|
208
|
+
try {
|
209
|
+
it->close();
|
210
|
+
} catch (const SystemException &e) {
|
211
|
+
P_ERROR("Cannot close a connection with socket " << address << ": " << e.what());
|
212
|
+
}
|
213
|
+
}
|
214
|
+
idleConnections.clear();
|
215
|
+
totalConnections = 0;
|
216
|
+
totalIdleConnections = 0;
|
217
|
+
}
|
218
|
+
|
189
219
|
|
190
220
|
bool isIdle() const {
|
191
221
|
return sessions == 0;
|
@@ -226,8 +256,10 @@ public:
|
|
226
256
|
|
227
257
|
class SocketList: public SmallVector<Socket, 1> {
|
228
258
|
public:
|
229
|
-
void add(
|
230
|
-
|
259
|
+
void add(pid_t pid, const StaticString &name, const StaticString &address,
|
260
|
+
const StaticString &protocol, int concurrency)
|
261
|
+
{
|
262
|
+
push_back(Socket(pid, name, address, protocol, concurrency));
|
231
263
|
}
|
232
264
|
|
233
265
|
const Socket *findSocketWithName(const StaticString &name) const {
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Phusion Passenger - https://www.phusionpassenger.com/
|
3
|
-
* Copyright (c) 2011-
|
3
|
+
* Copyright (c) 2011-2015 Phusion
|
4
4
|
*
|
5
5
|
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
6
|
*
|
@@ -496,7 +496,7 @@ private:
|
|
496
496
|
fixupSocketAddress(*details.options, args[1]));
|
497
497
|
StaticString protocol = psg_pstrdup(result.pool, args[2]);
|
498
498
|
|
499
|
-
sockets.add(name, address, protocol, atoi(args[3]));
|
499
|
+
sockets.add(details.pid, name, address, protocol, atoi(args[3]));
|
500
500
|
} else {
|
501
501
|
throwAppSpawnException("An error occurred while starting the "
|
502
502
|
"web application. It reported a wrongly formatted 'socket'"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Phusion Passenger - https://www.phusionpassenger.com/
|
3
|
-
* Copyright (c) 2011
|
3
|
+
* Copyright (c) 2011-2015 Phusion
|
4
4
|
*
|
5
5
|
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
6
|
*
|
@@ -29,6 +29,7 @@
|
|
29
29
|
#include <ev++.h>
|
30
30
|
#include <eio.h>
|
31
31
|
#include <BackgroundEventLoop.h>
|
32
|
+
#include <Logging.h>
|
32
33
|
#include <Exceptions.h>
|
33
34
|
#include <SafeLibev.h>
|
34
35
|
|
@@ -107,10 +108,14 @@ BackgroundEventLoop::BackgroundEventLoop(bool scalable, bool useLibeio) {
|
|
107
108
|
throw RuntimeException("Cannot create an event loop");
|
108
109
|
}
|
109
110
|
|
111
|
+
P_LOG_FILE_DESCRIPTOR_OPEN2(ev_backend_fd(loop), "libev event loop: backend FD");
|
112
|
+
|
110
113
|
async = (ev_async *) malloc(sizeof(ev_async));
|
111
114
|
async->data = this;
|
112
115
|
ev_async_init(async, signalBackgroundEventLoopExit);
|
113
116
|
ev_async_start(loop, async);
|
117
|
+
P_LOG_FILE_DESCRIPTOR_OPEN2(ev_loop_get_pipe(loop, 0), "libev event loop: async pipe 0");
|
118
|
+
P_LOG_FILE_DESCRIPTOR_OPEN2(ev_loop_get_pipe(loop, 1), "libev event loop: async pipe 1");
|
114
119
|
safe = boost::make_shared<SafeLibev>(loop);
|
115
120
|
priv = new BackgroundEventLoopPrivate();
|
116
121
|
priv->thr = NULL;
|
data/ext/common/Constants.h
CHANGED
data/ext/common/EventedClient.h
CHANGED
data/ext/common/EventedServer.h
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Phusion Passenger - https://www.phusionpassenger.com/
|
3
|
-
* Copyright (c) 2010 Phusion
|
3
|
+
* Copyright (c) 2010-2015 Phusion
|
4
4
|
*
|
5
5
|
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
6
|
*
|
@@ -221,7 +221,7 @@ private:
|
|
221
221
|
}
|
222
222
|
done = true;
|
223
223
|
} else {
|
224
|
-
FileDescriptor clientfdGuard(clientfd);
|
224
|
+
FileDescriptor clientfdGuard(clientfd, __FILE__, __LINE__, "EventedClient");
|
225
225
|
int optval = 1;
|
226
226
|
|
227
227
|
setNonBlocking(clientfdGuard);
|
data/ext/common/FileDescriptor.h
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Phusion Passenger - https://www.phusionpassenger.com/
|
3
|
-
* Copyright (c) 2010
|
3
|
+
* Copyright (c) 2010-2015 Phusion
|
4
4
|
*
|
5
5
|
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
6
|
*
|
@@ -34,6 +34,7 @@
|
|
34
34
|
#include <unistd.h>
|
35
35
|
#include <cerrno>
|
36
36
|
|
37
|
+
#include <Logging.h>
|
37
38
|
#include <Exceptions.h>
|
38
39
|
|
39
40
|
namespace Passenger {
|
@@ -79,6 +80,7 @@ private:
|
|
79
80
|
if (fd >= 0 && autoClose) {
|
80
81
|
this_thread::disable_syscall_interruption dsi;
|
81
82
|
syscalls::close(fd);
|
83
|
+
P_LOG_FILE_DESCRIPTOR_CLOSE(fd);
|
82
84
|
}
|
83
85
|
}
|
84
86
|
|
@@ -88,6 +90,7 @@ private:
|
|
88
90
|
int theFd = fd;
|
89
91
|
fd = -1;
|
90
92
|
safelyClose(theFd, !checkErrors);
|
93
|
+
P_LOG_FILE_DESCRIPTOR_CLOSE(theFd);
|
91
94
|
}
|
92
95
|
}
|
93
96
|
|
@@ -99,6 +102,15 @@ private:
|
|
99
102
|
/** Shared pointer for reference counting on this file descriptor */
|
100
103
|
boost::shared_ptr<SharedData> data;
|
101
104
|
|
105
|
+
/**
|
106
|
+
* Calling FileDescriptor(otherFileDescriptorObject, __FILE__, __LINE__)
|
107
|
+
* is always a mistake, so we declare the corresponding constructor as
|
108
|
+
* private in order to enforce a compiler error.
|
109
|
+
*/
|
110
|
+
FileDescriptor(const FileDescriptor &other, const char *file, unsigned int line, bool autoClose = true) {
|
111
|
+
throw "never reached";
|
112
|
+
}
|
113
|
+
|
102
114
|
public:
|
103
115
|
/**
|
104
116
|
* Creates a new empty FileDescriptor instance that has no underlying
|
@@ -113,7 +125,7 @@ public:
|
|
113
125
|
*
|
114
126
|
* @post *this == fd
|
115
127
|
*/
|
116
|
-
explicit FileDescriptor(int fd, bool autoClose = true) {
|
128
|
+
explicit FileDescriptor(int fd, const char *file, unsigned int line, bool autoClose = true) {
|
117
129
|
if (fd >= 0) {
|
118
130
|
/* Make sure that the 'new' operator doesn't overwrite
|
119
131
|
* errno so that we can write code like this:
|
@@ -126,6 +138,7 @@ public:
|
|
126
138
|
int e = errno;
|
127
139
|
data = boost::make_shared<SharedData>(fd, autoClose);
|
128
140
|
errno = e;
|
141
|
+
P_LOG_FILE_DESCRIPTOR_OPEN3(fd, file, line);
|
129
142
|
}
|
130
143
|
}
|
131
144
|
|
@@ -182,12 +195,12 @@ public:
|
|
182
195
|
}
|
183
196
|
}
|
184
197
|
|
185
|
-
|
198
|
+
void assign(int fd, const char *file, unsigned int line) {
|
186
199
|
/* Make sure that the 'new' and 'delete' operators don't
|
187
200
|
* overwrite errno so that we can write code like this:
|
188
201
|
*
|
189
202
|
* FileDescriptor fd;
|
190
|
-
* fd
|
203
|
+
* fd.assign(open(...));
|
191
204
|
* if (fd == -1) {
|
192
205
|
* print_error(errno);
|
193
206
|
* }
|
@@ -195,11 +208,13 @@ public:
|
|
195
208
|
int e = errno;
|
196
209
|
if (fd >= 0) {
|
197
210
|
data = boost::make_shared<SharedData>(fd, true);
|
211
|
+
if (file != NULL) {
|
212
|
+
P_LOG_FILE_DESCRIPTOR_OPEN3(fd, file, line);
|
213
|
+
}
|
198
214
|
} else {
|
199
215
|
data.reset();
|
200
216
|
}
|
201
217
|
errno = e;
|
202
|
-
return *this;
|
203
218
|
}
|
204
219
|
|
205
220
|
FileDescriptor &operator=(const FileDescriptor &other) {
|
@@ -260,7 +275,7 @@ private:
|
|
260
275
|
int writer;
|
261
276
|
|
262
277
|
public:
|
263
|
-
EventFd() {
|
278
|
+
EventFd(const char *file, unsigned int line, const char *purpose) {
|
264
279
|
int fds[2];
|
265
280
|
|
266
281
|
if (syscalls::pipe(fds) == -1) {
|
@@ -269,12 +284,16 @@ public:
|
|
269
284
|
}
|
270
285
|
reader = fds[0];
|
271
286
|
writer = fds[1];
|
287
|
+
P_LOG_FILE_DESCRIPTOR_OPEN4(fds[0], file, line, purpose);
|
288
|
+
P_LOG_FILE_DESCRIPTOR_OPEN4(fds[1], file, line, purpose);
|
272
289
|
}
|
273
290
|
|
274
291
|
~EventFd() {
|
275
292
|
this_thread::disable_syscall_interruption dsi;
|
276
293
|
syscalls::close(reader);
|
277
294
|
syscalls::close(writer);
|
295
|
+
P_LOG_FILE_DESCRIPTOR_CLOSE(reader);
|
296
|
+
P_LOG_FILE_DESCRIPTOR_CLOSE(writer);
|
278
297
|
}
|
279
298
|
|
280
299
|
void notify() {
|
data/ext/common/Logging.cpp
CHANGED
@@ -28,6 +28,7 @@
|
|
28
28
|
#include <fcntl.h>
|
29
29
|
#include <unistd.h>
|
30
30
|
|
31
|
+
#include <boost/thread.hpp>
|
31
32
|
#include <boost/atomic.hpp>
|
32
33
|
#include <Logging.h>
|
33
34
|
#include <Constants.h>
|
@@ -40,114 +41,168 @@ namespace Passenger {
|
|
40
41
|
volatile sig_atomic_t _logLevel = DEFAULT_LOG_LEVEL;
|
41
42
|
AssertionFailureInfo lastAssertionFailure;
|
42
43
|
static bool printAppOutputAsDebuggingMessages = false;
|
43
|
-
|
44
|
+
|
45
|
+
static boost::mutex logFileMutex;
|
46
|
+
static string logFile;
|
47
|
+
|
48
|
+
static int fileDescriptorLog = -1;
|
49
|
+
static string fileDescriptorLogFile;
|
44
50
|
|
45
51
|
#define TRUNCATE_LOGPATHS_TO_MAXCHARS 3 // set to 0 to disable truncation
|
46
52
|
|
53
|
+
|
47
54
|
void
|
48
55
|
setLogLevel(int value) {
|
49
56
|
_logLevel = value;
|
50
57
|
boost::atomic_signal_fence(boost::memory_order_seq_cst);
|
51
58
|
}
|
52
59
|
|
60
|
+
string getLogFile() {
|
61
|
+
boost::lock_guard<boost::mutex> l(logFileMutex);
|
62
|
+
return logFile;
|
63
|
+
}
|
64
|
+
|
53
65
|
bool
|
54
|
-
setLogFile(const
|
55
|
-
int fd = open(path, O_WRONLY | O_CREAT | O_APPEND, 0644);
|
66
|
+
setLogFile(const string &path, int *errcode) {
|
67
|
+
int fd = open(path.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0644);
|
56
68
|
if (fd != -1) {
|
57
|
-
|
58
|
-
if (newLogFile == NULL) {
|
59
|
-
P_CRITICAL("Cannot allocate memory");
|
60
|
-
abort();
|
61
|
-
}
|
62
|
-
|
69
|
+
boost::lock_guard<boost::mutex> l(logFileMutex);
|
63
70
|
dup2(fd, STDOUT_FILENO);
|
64
71
|
dup2(fd, STDERR_FILENO);
|
65
72
|
close(fd);
|
66
|
-
|
67
|
-
if (logFile != NULL) {
|
68
|
-
free(logFile);
|
69
|
-
}
|
70
|
-
logFile = newLogFile;
|
73
|
+
logFile = path;
|
71
74
|
return true;
|
72
75
|
} else {
|
76
|
+
if (errcode != NULL) {
|
77
|
+
*errcode = errno;
|
78
|
+
}
|
73
79
|
return false;
|
74
80
|
}
|
75
81
|
}
|
76
82
|
|
77
|
-
|
78
|
-
|
79
|
-
|
83
|
+
bool
|
84
|
+
hasFileDescriptorLogFile() {
|
85
|
+
return fileDescriptorLog != -1;
|
86
|
+
}
|
87
|
+
|
88
|
+
string
|
89
|
+
getFileDescriptorLogFile() {
|
90
|
+
return fileDescriptorLogFile;
|
91
|
+
}
|
92
|
+
|
93
|
+
int
|
94
|
+
getFileDescriptorLogFileFd() {
|
95
|
+
return fileDescriptorLog;
|
96
|
+
}
|
97
|
+
|
98
|
+
bool
|
99
|
+
setFileDescriptorLogFile(const string &path, int *errcode) {
|
100
|
+
int fd = open(path.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0644);
|
101
|
+
if (fd != -1) {
|
102
|
+
if (fileDescriptorLog == -1) {
|
103
|
+
fileDescriptorLog = fd;
|
104
|
+
} else {
|
105
|
+
dup2(fd, fileDescriptorLog);
|
106
|
+
close(fd);
|
107
|
+
}
|
108
|
+
if (fileDescriptorLogFile != path) {
|
109
|
+
// Do not mutate `fileDescriptorLogFile` if the path
|
110
|
+
// hasn't changed. This allows `setFileDescriptorLogFile()`
|
111
|
+
// to be thread-safe within the documented constraints.
|
112
|
+
fileDescriptorLogFile = path;
|
113
|
+
}
|
114
|
+
return true;
|
80
115
|
} else {
|
81
|
-
|
116
|
+
if (errcode != NULL) {
|
117
|
+
*errcode = errno;
|
118
|
+
}
|
119
|
+
return false;
|
82
120
|
}
|
83
121
|
}
|
84
122
|
|
85
123
|
void
|
86
|
-
_prepareLogEntry(
|
87
|
-
time_t the_time;
|
124
|
+
_prepareLogEntry(FastStringStream<> &sstream, const char *file, unsigned int line) {
|
88
125
|
struct tm the_tm;
|
89
|
-
char datetime_buf[
|
126
|
+
char datetime_buf[32];
|
127
|
+
int datetime_size;
|
90
128
|
struct timeval tv;
|
91
129
|
|
92
|
-
the_time = time(NULL);
|
93
|
-
localtime_r(&the_time, &the_tm);
|
94
|
-
strftime(datetime_buf, sizeof(datetime_buf) - 1, "%F %H:%M:%S", &the_tm);
|
95
130
|
gettimeofday(&tv, NULL);
|
131
|
+
localtime_r(&tv.tv_sec, &the_tm);
|
132
|
+
datetime_size = snprintf(datetime_buf, sizeof(datetime_buf),
|
133
|
+
"%d-%02d-%02d %02d:%02d:%02d.%04u",
|
134
|
+
the_tm.tm_year + 1900, the_tm.tm_mon + 1, the_tm.tm_mday,
|
135
|
+
the_tm.tm_hour, the_tm.tm_min, the_tm.tm_sec,
|
136
|
+
tv.tv_usec / 100);
|
96
137
|
sstream <<
|
97
|
-
"[ " << datetime_buf
|
98
|
-
(unsigned long) (tv.tv_usec / 100) <<
|
138
|
+
"[ " << StaticString(datetime_buf, datetime_size) <<
|
99
139
|
" " << std::dec << getpid() << "/" <<
|
100
140
|
std::hex << pthread_self() << std::dec <<
|
101
141
|
" ";
|
102
142
|
|
103
|
-
if (startsWith(file, "ext/")) { // special reduncancy filter because most code resides in these paths
|
143
|
+
if (startsWith(file, P_STATIC_STRING("ext/"))) { // special reduncancy filter because most code resides in these paths
|
104
144
|
file += sizeof("ext/") - 1;
|
105
|
-
if (startsWith(file, "common/")) {
|
145
|
+
if (startsWith(file, P_STATIC_STRING("common/"))) {
|
106
146
|
file += sizeof("common/") - 1;
|
107
147
|
}
|
108
148
|
}
|
109
149
|
|
110
150
|
if (TRUNCATE_LOGPATHS_TO_MAXCHARS > 0) {
|
111
|
-
truncateBeforeTokens(file, "/\\", TRUNCATE_LOGPATHS_TO_MAXCHARS, sstream);
|
151
|
+
truncateBeforeTokens(file, P_STATIC_STRING("/\\"), TRUNCATE_LOGPATHS_TO_MAXCHARS, sstream);
|
112
152
|
} else {
|
113
153
|
sstream << file;
|
114
154
|
}
|
115
155
|
|
116
|
-
sstream << ":" << line <<
|
117
|
-
" ]: ";
|
156
|
+
sstream << ":" << line << " ]: ";
|
118
157
|
}
|
119
158
|
|
120
159
|
static void
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
160
|
+
writeExactWithoutOXT(int fd, const char *str, unsigned int size) {
|
161
|
+
/* We do not use writeExact() here because writeExact()
|
162
|
+
* uses oxt::syscalls::write(), which is an interruption point and
|
163
|
+
* which is slightly more expensive than a plain write().
|
164
|
+
* Logging may block, but in most cases not indefinitely,
|
165
|
+
* so we don't care if the write() here is not an interruption
|
166
|
+
* point. If the write does block indefinitely then it's
|
167
|
+
* probably a FIFO that is not opened on the other side.
|
168
|
+
* In that case we can blame the user.
|
169
|
+
*/
|
170
|
+
ssize_t ret;
|
171
|
+
unsigned int written = 0;
|
172
|
+
while (written < size) {
|
173
|
+
do {
|
174
|
+
ret = write(fd, str + written, size - written);
|
175
|
+
} while (ret == -1 && errno == EINTR);
|
176
|
+
if (ret == -1) {
|
177
|
+
/* The most likely reason why this fails is when the user has setup
|
178
|
+
* Apache to log to a pipe (e.g. to a log rotation script). Upon
|
179
|
+
* restarting the web server, the process that reads from the pipe
|
180
|
+
* shuts down, so we can't write to it anymore. That's why we
|
181
|
+
* just ignore write errors. It doesn't make sense to abort for
|
182
|
+
* something like this.
|
183
|
+
*/
|
184
|
+
break;
|
185
|
+
} else {
|
186
|
+
written += ret;
|
187
|
+
}
|
132
188
|
}
|
133
189
|
}
|
134
190
|
|
135
191
|
void
|
136
|
-
_writeLogEntry(const
|
137
|
-
|
192
|
+
_writeLogEntry(const char *str, unsigned int size) {
|
193
|
+
writeExactWithoutOXT(STDERR_FILENO, str, size);
|
138
194
|
}
|
139
195
|
|
140
196
|
void
|
141
|
-
|
142
|
-
|
197
|
+
_writeFileDescriptorLogEntry(const char *str, unsigned int size) {
|
198
|
+
writeExactWithoutOXT(fileDescriptorLog, str, size);
|
143
199
|
}
|
144
200
|
|
145
201
|
const char *
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
buf[str.size()] = '\0';
|
202
|
+
_strdupFastStringStream(const FastStringStream<> &stream) {
|
203
|
+
char *buf = (char *) malloc(stream.size() + 1);
|
204
|
+
memcpy(buf, stream.data(), stream.size());
|
205
|
+
buf[stream.size()] = '\0';
|
151
206
|
return buf;
|
152
207
|
}
|
153
208
|
|
@@ -167,7 +222,7 @@ realPrintAppOutput(char *buf, unsigned int bufSize,
|
|
167
222
|
pos = appendData(pos, end, ": ");
|
168
223
|
pos = appendData(pos, end, message, messageLen);
|
169
224
|
pos = appendData(pos, end, "\n");
|
170
|
-
_writeLogEntry(
|
225
|
+
_writeLogEntry(buf, pos - buf);
|
171
226
|
}
|
172
227
|
|
173
228
|
void
|