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.

Files changed (550) hide show
  1. checksums.yaml +8 -8
  2. checksums.yaml.gz.asc +7 -7
  3. data.tar.gz.asc +7 -7
  4. data/.editorconfig +10 -0
  5. data/CHANGELOG +21 -0
  6. data/build/agents.rb +2 -2
  7. data/build/apache2.rb +6 -5
  8. data/build/common_library.rb +22 -7
  9. data/build/cxx_tests.rb +0 -3
  10. data/build/misc.rb +1 -1
  11. data/dev/parse_file_descriptor_log +119 -0
  12. data/doc/CloudLicensingConfiguration.html +387 -0
  13. data/doc/Design and Architecture.html +2430 -0
  14. data/doc/Packaging.html +488 -0
  15. data/doc/Security of user switching support.html +1833 -0
  16. data/doc/ServerOptimizationGuide.html +659 -0
  17. data/doc/ServerOptimizationGuide.txt.md +8 -0
  18. data/doc/Users guide Apache.html +9116 -0
  19. data/doc/Users guide Apache.idmap.txt +6 -2
  20. data/doc/Users guide Apache.txt +26 -7
  21. data/doc/Users guide Nginx.html +9025 -0
  22. data/doc/Users guide Nginx.idmap.txt +7 -3
  23. data/doc/Users guide Nginx.txt +29 -6
  24. data/doc/Users guide Standalone.html +3983 -0
  25. data/doc/Users guide.html +1748 -0
  26. data/doc/users_guide_snippets/installation.txt +4 -4
  27. data/ext/apache2/Configuration.cpp +16 -5
  28. data/ext/apache2/Configuration.hpp +4 -2
  29. data/ext/apache2/Hooks.cpp +44 -19
  30. data/ext/boost/libs/thread/src/pthread/once.cpp +2 -0
  31. data/ext/boost/libs/thread/src/pthread/once_atomic.cpp +6 -0
  32. data/ext/common/AgentsStarter.h +3 -2
  33. data/ext/common/ApplicationPool2/DirectSpawner.h +14 -4
  34. data/ext/common/ApplicationPool2/DummySpawner.h +12 -7
  35. data/ext/common/ApplicationPool2/Implementation.cpp +1 -1
  36. data/ext/common/ApplicationPool2/Process.h +2 -1
  37. data/ext/common/ApplicationPool2/Session.h +6 -6
  38. data/ext/common/ApplicationPool2/SmartSpawner.h +19 -4
  39. data/ext/common/ApplicationPool2/Socket.h +59 -27
  40. data/ext/common/ApplicationPool2/Spawner.h +2 -2
  41. data/ext/common/BackgroundEventLoop.cpp +6 -1
  42. data/ext/common/Constants.h +1 -1
  43. data/ext/common/EventedClient.h +1 -1
  44. data/ext/common/EventedServer.h +2 -2
  45. data/ext/common/FileDescriptor.h +25 -6
  46. data/ext/common/Logging.cpp +107 -52
  47. data/ext/common/Logging.h +146 -19
  48. data/ext/common/MessageClient.h +2 -2
  49. data/ext/common/MessageServer.h +3 -2
  50. data/ext/common/RandomGenerator.h +8 -7
  51. data/ext/common/SafeLibev.h +5 -1
  52. data/ext/common/ServerKit/AcceptLoadBalancer.h +9 -4
  53. data/ext/common/ServerKit/FdSinkChannel.h +5 -2
  54. data/ext/common/ServerKit/FdSourceChannel.h +5 -2
  55. data/ext/common/ServerKit/FileBufferedChannel.h +2 -0
  56. data/ext/common/ServerKit/FileBufferedFdSinkChannel.h +7 -2
  57. data/ext/common/ServerKit/HttpServer.h +6 -0
  58. data/ext/common/ServerKit/Server.h +40 -3
  59. data/ext/common/StaticString.h +20 -0
  60. data/ext/common/UnionStation/Connection.h +3 -1
  61. data/ext/common/UnionStation/Core.h +6 -4
  62. data/ext/common/Utils.cpp +4 -3
  63. data/ext/common/Utils/DateParsing.h +19 -5
  64. data/ext/common/Utils/FastStringStream.h +183 -0
  65. data/ext/common/Utils/IOUtils.cpp +47 -28
  66. data/ext/common/Utils/IOUtils.h +56 -12
  67. data/ext/common/Utils/MessagePassing.h +3 -3
  68. data/ext/common/Utils/ProcessMetricsCollector.h +2 -2
  69. data/ext/common/Utils/ScopeGuard.h +16 -5
  70. data/ext/common/Utils/SpeedMeter.h +2 -2
  71. data/ext/common/Utils/StrIntUtils.cpp +6 -6
  72. data/ext/common/Utils/StrIntUtils.h +2 -1
  73. data/ext/common/agents/Base.cpp +56 -4
  74. data/ext/common/agents/Base.h +2 -1
  75. data/ext/common/agents/HelperAgent/AdminServer.h +122 -11
  76. data/ext/common/agents/HelperAgent/Main.cpp +16 -5
  77. data/ext/common/agents/HelperAgent/OptionParser.h +7 -1
  78. data/ext/common/agents/HelperAgent/RequestHandler.h +1 -1
  79. data/ext/common/agents/HelperAgent/RequestHandler/Hooks.cpp +10 -1
  80. data/ext/common/agents/HelperAgent/RequestHandler/Request.h +8 -0
  81. data/ext/common/agents/HelperAgent/RequestHandler/TurboCaching.h +4 -3
  82. data/ext/common/agents/LoggingAgent/AdminServer.h +57 -11
  83. data/ext/common/agents/LoggingAgent/LoggingServer.h +3 -3
  84. data/ext/common/agents/LoggingAgent/Main.cpp +11 -3
  85. data/ext/common/agents/Watchdog/AdminServer.h +53 -11
  86. data/ext/common/agents/Watchdog/AgentWatcher.cpp +3 -3
  87. data/ext/common/agents/Watchdog/Main.cpp +13 -6
  88. data/ext/libeio/ecb.h +1 -1
  89. data/ext/libev/ev.c +13 -1
  90. data/ext/libev/ev.h +3 -0
  91. data/ext/nginx/Configuration.c +28 -6
  92. data/ext/nginx/Configuration.h +2 -1
  93. data/ext/nginx/ngx_http_passenger_module.c +5 -4
  94. data/ext/oxt/dynamic_thread_group.hpp +38 -5
  95. data/lib/phusion_passenger.rb +1 -1
  96. data/lib/phusion_passenger/common_library.rb +9 -5
  97. data/lib/phusion_passenger/config/reopen_logs_command.rb +2 -2
  98. data/lib/phusion_passenger/packaging.rb +23 -37
  99. data/passenger.gemspec +21 -21
  100. metadata +4 -453
  101. metadata.gz.asc +7 -7
  102. data/.gitignore +0 -68
  103. data/.travis.yml +0 -16
  104. data/Gemfile +0 -17
  105. data/Gemfile.lock +0 -39
  106. data/Vagrantfile +0 -54
  107. data/debian.template/README.Debian +0 -15
  108. data/debian.template/changelog +0 -316
  109. data/debian.template/compat +0 -1
  110. data/debian.template/control.erb +0 -91
  111. data/debian.template/copyright +0 -385
  112. data/debian.template/libapache2-mod-passenger.install +0 -3
  113. data/debian.template/libapache2-mod-passenger.postinst +0 -36
  114. data/debian.template/libapache2-mod-passenger.prerm +0 -15
  115. data/debian.template/locations.ini.erb +0 -14
  116. data/debian.template/passenger-dev.install.erb +0 -3
  117. data/debian.template/passenger-doc.install.erb +0 -2
  118. data/debian.template/passenger.conf +0 -6
  119. data/debian.template/passenger.docs +0 -4
  120. data/debian.template/passenger.install.erb +0 -14
  121. data/debian.template/passenger.load +0 -3
  122. data/debian.template/passenger.manpages +0 -3
  123. data/debian.template/patches/series +0 -0
  124. data/debian.template/rules.erb +0 -76
  125. data/debian.template/source/format +0 -1
  126. data/ext/common/EventedBufferedInput.h +0 -458
  127. data/packaging/rpm/LICENSE.txt +0 -19
  128. data/packaging/rpm/Makefile +0 -13
  129. data/packaging/rpm/README.md +0 -41
  130. data/packaging/rpm/Vagrantfile +0 -38
  131. data/packaging/rpm/Vagrantfile.centos +0 -30
  132. data/packaging/rpm/build +0 -170
  133. data/packaging/rpm/create_project +0 -41
  134. data/packaging/rpm/git_update +0 -88
  135. data/packaging/rpm/image/Dockerfile +0 -37
  136. data/packaging/rpm/image/Gemfile +0 -3
  137. data/packaging/rpm/image/Gemfile.lock +0 -12
  138. data/packaging/rpm/image/RPM-GPG-KEY-amazon-ga +0 -19
  139. data/packaging/rpm/image/amazon2014-i386.cfg +0 -96
  140. data/packaging/rpm/image/amazon2014-x86_64.cfg +0 -96
  141. data/packaging/rpm/image/site-defaults.cfg +0 -168
  142. data/packaging/rpm/internal/build_tasks.rb +0 -238
  143. data/packaging/rpm/internal/dummygpg +0 -11
  144. data/packaging/rpm/internal/exec_build +0 -42
  145. data/packaging/rpm/internal/get_distro_arch +0 -14
  146. data/packaging/rpm/internal/get_distro_id +0 -10
  147. data/packaging/rpm/internal/git_update +0 -27
  148. data/packaging/rpm/internal/inituidgid +0 -17
  149. data/packaging/rpm/internal/my_init +0 -344
  150. data/packaging/rpm/internal/python27 +0 -3
  151. data/packaging/rpm/internal/repo_update +0 -46
  152. data/packaging/rpm/internal/setuser +0 -26
  153. data/packaging/rpm/internal/tracking_helper +0 -40
  154. data/packaging/rpm/jenkins_release +0 -99
  155. data/packaging/rpm/lib/build_tasks_support.rb +0 -402
  156. data/packaging/rpm/lib/preprocessor.rb +0 -341
  157. data/packaging/rpm/nginx_spec/404.html +0 -119
  158. data/packaging/rpm/nginx_spec/50x.html +0 -119
  159. data/packaging/rpm/nginx_spec/index.html +0 -116
  160. data/packaging/rpm/nginx_spec/nginx-auto-cc-gcc.patch +0 -13
  161. data/packaging/rpm/nginx_spec/nginx-logo.png +0 -0
  162. data/packaging/rpm/nginx_spec/nginx-upgrade +0 -13
  163. data/packaging/rpm/nginx_spec/nginx-upgrade.8 +0 -151
  164. data/packaging/rpm/nginx_spec/nginx.conf +0 -131
  165. data/packaging/rpm/nginx_spec/nginx.init +0 -144
  166. data/packaging/rpm/nginx_spec/nginx.logrotate +0 -13
  167. data/packaging/rpm/nginx_spec/nginx.service +0 -15
  168. data/packaging/rpm/nginx_spec/nginx.spec.template +0 -560
  169. data/packaging/rpm/nginx_spec/nginx.sysconfig +0 -4
  170. data/packaging/rpm/nginx_spec/passenger.conf +0 -9
  171. data/packaging/rpm/nginx_spec/poweredby.png +0 -0
  172. data/packaging/rpm/passenger_spec/apache-passenger.conf.in +0 -26
  173. data/packaging/rpm/passenger_spec/config.json +0 -30
  174. data/packaging/rpm/passenger_spec/passenger.logrotate +0 -7
  175. data/packaging/rpm/passenger_spec/passenger.spec.template +0 -478
  176. data/packaging/rpm/passenger_spec/passenger_dynamic_thread_group.patch +0 -16
  177. data/packaging/rpm/passenger_spec/passenger_tests_default_config_example.patch +0 -44
  178. data/packaging/rpm/passenger_spec/rubygem-passenger-4.0.18-GLIBC_HAVE_LONG_LONG.patch +0 -21
  179. data/packaging/rpm/repo_update +0 -114
  180. data/packaging/rpm/setup-system +0 -61
  181. data/packaging/rpm/shell +0 -10
  182. data/test/.rspec +0 -4
  183. data/test/config.json.example +0 -42
  184. data/test/config.json.rpm-automation +0 -15
  185. data/test/config.json.travis +0 -15
  186. data/test/config.json.vagrant +0 -30
  187. data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +0 -124
  188. data/test/cxx/ApplicationPool2/OptionsTest.cpp +0 -30
  189. data/test/cxx/ApplicationPool2/PoolTest.cpp +0 -2062
  190. data/test/cxx/ApplicationPool2/ProcessTest.cpp +0 -130
  191. data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +0 -243
  192. data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +0 -823
  193. data/test/cxx/BufferedIOTest.cpp +0 -364
  194. data/test/cxx/CachedFileStatTest.cpp +0 -402
  195. data/test/cxx/CxxTestMain.cpp +0 -181
  196. data/test/cxx/DataStructures/LStringTest.cpp +0 -275
  197. data/test/cxx/DataStructures/StringKeyTableTest.cpp +0 -199
  198. data/test/cxx/DateParsingTest.cpp +0 -75
  199. data/test/cxx/DechunkerTest.cpp +0 -250
  200. data/test/cxx/EventedBufferedInputTest.cpp +0 -758
  201. data/test/cxx/EventedClientTest.cpp +0 -523
  202. data/test/cxx/FileChangeCheckerTest.cpp +0 -331
  203. data/test/cxx/FileDescriptorTest.cpp +0 -69
  204. data/test/cxx/FilterSupportTest.cpp +0 -433
  205. data/test/cxx/IOUtilsTest.cpp +0 -861
  206. data/test/cxx/MemoryKit/MbufTest.cpp +0 -213
  207. data/test/cxx/MessageIOTest.cpp +0 -360
  208. data/test/cxx/MessagePassingTest.cpp +0 -81
  209. data/test/cxx/MessageReadersWritersTest.cpp +0 -576
  210. data/test/cxx/MessageServerTest.cpp +0 -393
  211. data/test/cxx/ProcessMetricsCollectorTest.cpp +0 -123
  212. data/test/cxx/RequestHandlerTest.cpp +0 -1463
  213. data/test/cxx/ResponseCacheTest.cpp +0 -322
  214. data/test/cxx/ServerKit/ChannelTest.cpp +0 -1467
  215. data/test/cxx/ServerKit/CookieUtilsTest.cpp +0 -274
  216. data/test/cxx/ServerKit/FileBufferedChannelTest.cpp +0 -992
  217. data/test/cxx/ServerKit/HeaderTableTest.cpp +0 -177
  218. data/test/cxx/ServerKit/HttpServerTest.cpp +0 -1580
  219. data/test/cxx/ServerKit/ServerTest.cpp +0 -408
  220. data/test/cxx/StaticStringTest.cpp +0 -220
  221. data/test/cxx/StringMapTest.cpp +0 -131
  222. data/test/cxx/SystemTimeTest.cpp +0 -37
  223. data/test/cxx/TemplateTest.cpp +0 -118
  224. data/test/cxx/TestSupport.cpp +0 -207
  225. data/test/cxx/TestSupport.h +0 -333
  226. data/test/cxx/UnionStationTest.cpp +0 -741
  227. data/test/cxx/Utils/StrIntUtilsTest.cpp +0 -39
  228. data/test/cxx/UtilsTest.cpp +0 -672
  229. data/test/cxx/VariantMapTest.cpp +0 -191
  230. data/test/gdbinit.example +0 -34
  231. data/test/integration_tests/apache2_tests.rb +0 -585
  232. data/test/integration_tests/downloaded_binaries_tests.rb +0 -185
  233. data/test/integration_tests/native_packaging_spec.rb +0 -368
  234. data/test/integration_tests/nginx_tests.rb +0 -402
  235. data/test/integration_tests/shared/example_webapp_tests.rb +0 -289
  236. data/test/integration_tests/source_packaging_test.rb +0 -201
  237. data/test/integration_tests/spec_helper.rb +0 -22
  238. data/test/integration_tests/standalone_tests.rb +0 -392
  239. data/test/node/line_reader_spec.js +0 -338
  240. data/test/node/spec_helper.js +0 -65
  241. data/test/oxt/backtrace_test.cpp +0 -88
  242. data/test/oxt/counter.hpp +0 -55
  243. data/test/oxt/dynamic_thread_group_test.cpp +0 -131
  244. data/test/oxt/oxt_test_main.cpp +0 -27
  245. data/test/oxt/spin_lock_test.cpp +0 -59
  246. data/test/oxt/syscall_interruption_test.cpp +0 -39
  247. data/test/ruby/debug_logging_spec.rb +0 -145
  248. data/test/ruby/message_channel_spec.rb +0 -196
  249. data/test/ruby/rack/loader_spec.rb +0 -42
  250. data/test/ruby/rack/preloader_spec.rb +0 -48
  251. data/test/ruby/rails3.0/loader_spec.rb +0 -26
  252. data/test/ruby/rails3.0/preloader_spec.rb +0 -32
  253. data/test/ruby/rails3.1/loader_spec.rb +0 -26
  254. data/test/ruby/rails3.1/preloader_spec.rb +0 -32
  255. data/test/ruby/rails3.2/loader_spec.rb +0 -26
  256. data/test/ruby/rails3.2/preloader_spec.rb +0 -32
  257. data/test/ruby/rails4.0/loader_spec.rb +0 -28
  258. data/test/ruby/rails4.0/preloader_spec.rb +0 -34
  259. data/test/ruby/rails4.1/loader_spec.rb +0 -28
  260. data/test/ruby/rails4.1/preloader_spec.rb +0 -34
  261. data/test/ruby/request_handler_spec.rb +0 -747
  262. data/test/ruby/shared/loader_sharedspec.rb +0 -247
  263. data/test/ruby/shared/rails/union_station_extensions_sharedspec.rb +0 -357
  264. data/test/ruby/shared/ruby_loader_sharedspec.rb +0 -55
  265. data/test/ruby/spec_helper.rb +0 -114
  266. data/test/ruby/standalone/runtime_installer_spec.rb +0 -402
  267. data/test/ruby/union_station_spec.rb +0 -288
  268. data/test/ruby/utils/file_system_watcher_spec.rb +0 -229
  269. data/test/ruby/utils/hosts_file_parser.rb +0 -258
  270. data/test/ruby/utils/tee_input_spec.rb +0 -235
  271. data/test/ruby/utils/unseekable_socket_spec.rb +0 -66
  272. data/test/ruby/utils_spec.rb +0 -41
  273. data/test/stub/apache2/httpd.conf.erb +0 -122
  274. data/test/stub/apache2/mime.types +0 -748
  275. data/test/stub/garbage1.dat +0 -0
  276. data/test/stub/garbage2.dat +0 -0
  277. data/test/stub/garbage3.dat +0 -0
  278. data/test/stub/http_request.yml +0 -23
  279. data/test/stub/index.html +0 -1
  280. data/test/stub/nginx/koi-utf +0 -109
  281. data/test/stub/nginx/koi-win +0 -103
  282. data/test/stub/nginx/mime.types +0 -70
  283. data/test/stub/nginx/nginx.conf.erb +0 -70
  284. data/test/stub/nginx/win-utf +0 -126
  285. data/test/stub/node/app.js +0 -133
  286. data/test/stub/node/public/.gitignore +0 -0
  287. data/test/stub/node/tmp/.gitignore +0 -0
  288. data/test/stub/rack/config.ru +0 -95
  289. data/test/stub/rack/library.rb +0 -16
  290. data/test/stub/rack/public/.gitignore +0 -0
  291. data/test/stub/rack/start.rb +0 -52
  292. data/test/stub/rack/tmp/.gitignore +0 -0
  293. data/test/stub/rails3.0/.gitignore +0 -4
  294. data/test/stub/rails3.0/Gemfile +0 -22
  295. data/test/stub/rails3.0/Gemfile.lock +0 -80
  296. data/test/stub/rails3.0/Rakefile +0 -10
  297. data/test/stub/rails3.0/app/controllers/application_controller.rb +0 -4
  298. data/test/stub/rails3.0/app/helpers/application_helper.rb +0 -2
  299. data/test/stub/rails3.0/app/views/layouts/application.html.erb +0 -14
  300. data/test/stub/rails3.0/config.ru +0 -4
  301. data/test/stub/rails3.0/config/application.rb +0 -48
  302. data/test/stub/rails3.0/config/boot.rb +0 -13
  303. data/test/stub/rails3.0/config/database.yml +0 -22
  304. data/test/stub/rails3.0/config/environment.rb +0 -5
  305. data/test/stub/rails3.0/config/environments/development.rb +0 -19
  306. data/test/stub/rails3.0/config/environments/production.rb +0 -48
  307. data/test/stub/rails3.0/config/environments/test.rb +0 -32
  308. data/test/stub/rails3.0/config/initializers/backtrace_silencers.rb +0 -7
  309. data/test/stub/rails3.0/config/initializers/inflections.rb +0 -10
  310. data/test/stub/rails3.0/config/initializers/mime_types.rb +0 -5
  311. data/test/stub/rails3.0/config/initializers/passenger.rb +0 -2
  312. data/test/stub/rails3.0/config/initializers/secret_token.rb +0 -7
  313. data/test/stub/rails3.0/config/initializers/session_store.rb +0 -8
  314. data/test/stub/rails3.0/config/locales/en.yml +0 -5
  315. data/test/stub/rails3.0/config/routes.rb +0 -58
  316. data/test/stub/rails3.0/db/seeds.rb +0 -7
  317. data/test/stub/rails3.0/doc/README_FOR_APP +0 -2
  318. data/test/stub/rails3.0/lib/tasks/.gitkeep +0 -0
  319. data/test/stub/rails3.0/log/.gitignore +0 -0
  320. data/test/stub/rails3.0/public/404.html +0 -26
  321. data/test/stub/rails3.0/public/422.html +0 -26
  322. data/test/stub/rails3.0/public/500.html +0 -26
  323. data/test/stub/rails3.0/public/favicon.ico +0 -0
  324. data/test/stub/rails3.0/public/index.html +0 -279
  325. data/test/stub/rails3.0/public/robots.txt +0 -5
  326. data/test/stub/rails3.0/public/stylesheets/.gitkeep +0 -0
  327. data/test/stub/rails3.0/script/rails +0 -9
  328. data/test/stub/rails3.0/test/performance/browsing_test.rb +0 -9
  329. data/test/stub/rails3.0/test/test_helper.rb +0 -13
  330. data/test/stub/rails3.0/vendor/plugins/.gitkeep +0 -0
  331. data/test/stub/rails3.1/.gitignore +0 -15
  332. data/test/stub/rails3.1/Gemfile +0 -37
  333. data/test/stub/rails3.1/Gemfile.lock +0 -115
  334. data/test/stub/rails3.1/README +0 -261
  335. data/test/stub/rails3.1/Rakefile +0 -7
  336. data/test/stub/rails3.1/app/assets/images/rails.png +0 -0
  337. data/test/stub/rails3.1/app/assets/stylesheets/application.css +0 -7
  338. data/test/stub/rails3.1/app/controllers/application_controller.rb +0 -3
  339. data/test/stub/rails3.1/app/helpers/application_helper.rb +0 -2
  340. data/test/stub/rails3.1/app/mailers/.gitkeep +0 -0
  341. data/test/stub/rails3.1/app/models/.gitkeep +0 -0
  342. data/test/stub/rails3.1/app/views/layouts/application.html.erb +0 -14
  343. data/test/stub/rails3.1/config.ru +0 -4
  344. data/test/stub/rails3.1/config/application.rb +0 -48
  345. data/test/stub/rails3.1/config/boot.rb +0 -6
  346. data/test/stub/rails3.1/config/database.yml +0 -25
  347. data/test/stub/rails3.1/config/environment.rb +0 -5
  348. data/test/stub/rails3.1/config/environments/development.rb +0 -30
  349. data/test/stub/rails3.1/config/environments/production.rb +0 -60
  350. data/test/stub/rails3.1/config/environments/test.rb +0 -39
  351. data/test/stub/rails3.1/config/initializers/backtrace_silencers.rb +0 -7
  352. data/test/stub/rails3.1/config/initializers/inflections.rb +0 -10
  353. data/test/stub/rails3.1/config/initializers/mime_types.rb +0 -5
  354. data/test/stub/rails3.1/config/initializers/passenger.rb +0 -2
  355. data/test/stub/rails3.1/config/initializers/secret_token.rb +0 -7
  356. data/test/stub/rails3.1/config/initializers/session_store.rb +0 -8
  357. data/test/stub/rails3.1/config/initializers/wrap_parameters.rb +0 -14
  358. data/test/stub/rails3.1/config/locales/en.yml +0 -5
  359. data/test/stub/rails3.1/config/routes.rb +0 -58
  360. data/test/stub/rails3.1/db/seeds.rb +0 -7
  361. data/test/stub/rails3.1/doc/README_FOR_APP +0 -2
  362. data/test/stub/rails3.1/lib/assets/.gitkeep +0 -0
  363. data/test/stub/rails3.1/lib/tasks/.gitkeep +0 -0
  364. data/test/stub/rails3.1/log/.gitkeep +0 -0
  365. data/test/stub/rails3.1/public/404.html +0 -26
  366. data/test/stub/rails3.1/public/422.html +0 -26
  367. data/test/stub/rails3.1/public/500.html +0 -26
  368. data/test/stub/rails3.1/public/favicon.ico +0 -0
  369. data/test/stub/rails3.1/public/index.html +0 -241
  370. data/test/stub/rails3.1/public/robots.txt +0 -5
  371. data/test/stub/rails3.1/script/rails +0 -6
  372. data/test/stub/rails3.1/test/fixtures/.gitkeep +0 -0
  373. data/test/stub/rails3.1/test/functional/.gitkeep +0 -0
  374. data/test/stub/rails3.1/test/integration/.gitkeep +0 -0
  375. data/test/stub/rails3.1/test/performance/browsing_test.rb +0 -12
  376. data/test/stub/rails3.1/test/test_helper.rb +0 -13
  377. data/test/stub/rails3.1/test/unit/.gitkeep +0 -0
  378. data/test/stub/rails3.1/vendor/assets/stylesheets/.gitkeep +0 -0
  379. data/test/stub/rails3.1/vendor/plugins/.gitkeep +0 -0
  380. data/test/stub/rails3.2/.gitignore +0 -15
  381. data/test/stub/rails3.2/Gemfile +0 -39
  382. data/test/stub/rails3.2/Gemfile.lock +0 -113
  383. data/test/stub/rails3.2/Rakefile +0 -7
  384. data/test/stub/rails3.2/app/assets/images/rails.png +0 -0
  385. data/test/stub/rails3.2/app/assets/stylesheets/application.css +0 -13
  386. data/test/stub/rails3.2/app/controllers/application_controller.rb +0 -3
  387. data/test/stub/rails3.2/app/helpers/application_helper.rb +0 -2
  388. data/test/stub/rails3.2/app/mailers/.gitkeep +0 -0
  389. data/test/stub/rails3.2/app/models/.gitkeep +0 -0
  390. data/test/stub/rails3.2/app/views/layouts/application.html.erb +0 -14
  391. data/test/stub/rails3.2/config.ru +0 -4
  392. data/test/stub/rails3.2/config/application.rb +0 -62
  393. data/test/stub/rails3.2/config/boot.rb +0 -6
  394. data/test/stub/rails3.2/config/database.yml +0 -25
  395. data/test/stub/rails3.2/config/environment.rb +0 -5
  396. data/test/stub/rails3.2/config/environments/development.rb +0 -37
  397. data/test/stub/rails3.2/config/environments/production.rb +0 -67
  398. data/test/stub/rails3.2/config/environments/test.rb +0 -37
  399. data/test/stub/rails3.2/config/initializers/backtrace_silencers.rb +0 -7
  400. data/test/stub/rails3.2/config/initializers/inflections.rb +0 -15
  401. data/test/stub/rails3.2/config/initializers/mime_types.rb +0 -5
  402. data/test/stub/rails3.2/config/initializers/passenger.rb +0 -2
  403. data/test/stub/rails3.2/config/initializers/secret_token.rb +0 -7
  404. data/test/stub/rails3.2/config/initializers/session_store.rb +0 -8
  405. data/test/stub/rails3.2/config/initializers/wrap_parameters.rb +0 -14
  406. data/test/stub/rails3.2/config/locales/en.yml +0 -5
  407. data/test/stub/rails3.2/config/routes.rb +0 -58
  408. data/test/stub/rails3.2/db/seeds.rb +0 -7
  409. data/test/stub/rails3.2/doc/README_FOR_APP +0 -2
  410. data/test/stub/rails3.2/lib/assets/.gitkeep +0 -0
  411. data/test/stub/rails3.2/lib/tasks/.gitkeep +0 -0
  412. data/test/stub/rails3.2/log/.gitkeep +0 -0
  413. data/test/stub/rails3.2/public/404.html +0 -26
  414. data/test/stub/rails3.2/public/422.html +0 -26
  415. data/test/stub/rails3.2/public/500.html +0 -25
  416. data/test/stub/rails3.2/public/favicon.ico +0 -0
  417. data/test/stub/rails3.2/public/index.html +0 -241
  418. data/test/stub/rails3.2/public/robots.txt +0 -5
  419. data/test/stub/rails3.2/script/rails +0 -6
  420. data/test/stub/rails3.2/test/fixtures/.gitkeep +0 -0
  421. data/test/stub/rails3.2/test/functional/.gitkeep +0 -0
  422. data/test/stub/rails3.2/test/integration/.gitkeep +0 -0
  423. data/test/stub/rails3.2/test/performance/browsing_test.rb +0 -12
  424. data/test/stub/rails3.2/test/test_helper.rb +0 -13
  425. data/test/stub/rails3.2/test/unit/.gitkeep +0 -0
  426. data/test/stub/rails3.2/vendor/assets/stylesheets/.gitkeep +0 -0
  427. data/test/stub/rails3.2/vendor/plugins/.gitkeep +0 -0
  428. data/test/stub/rails4.0/.gitignore +0 -16
  429. data/test/stub/rails4.0/Gemfile +0 -45
  430. data/test/stub/rails4.0/Gemfile.lock +0 -126
  431. data/test/stub/rails4.0/README.rdoc +0 -28
  432. data/test/stub/rails4.0/Rakefile +0 -6
  433. data/test/stub/rails4.0/app/assets/images/.keep +0 -0
  434. data/test/stub/rails4.0/app/assets/javascripts/application.js +0 -16
  435. data/test/stub/rails4.0/app/assets/stylesheets/application.css +0 -13
  436. data/test/stub/rails4.0/app/controllers/application_controller.rb +0 -5
  437. data/test/stub/rails4.0/app/controllers/concerns/.keep +0 -0
  438. data/test/stub/rails4.0/app/helpers/application_helper.rb +0 -2
  439. data/test/stub/rails4.0/app/mailers/.keep +0 -0
  440. data/test/stub/rails4.0/app/models/.keep +0 -0
  441. data/test/stub/rails4.0/app/models/concerns/.keep +0 -0
  442. data/test/stub/rails4.0/app/views/layouts/application.html.erb +0 -14
  443. data/test/stub/rails4.0/bin/bundle +0 -3
  444. data/test/stub/rails4.0/bin/rails +0 -4
  445. data/test/stub/rails4.0/bin/rake +0 -4
  446. data/test/stub/rails4.0/config.ru +0 -4
  447. data/test/stub/rails4.0/config/application.rb +0 -23
  448. data/test/stub/rails4.0/config/boot.rb +0 -4
  449. data/test/stub/rails4.0/config/database.yml +0 -25
  450. data/test/stub/rails4.0/config/environment.rb +0 -5
  451. data/test/stub/rails4.0/config/environments/development.rb +0 -29
  452. data/test/stub/rails4.0/config/environments/production.rb +0 -80
  453. data/test/stub/rails4.0/config/environments/test.rb +0 -36
  454. data/test/stub/rails4.0/config/initializers/backtrace_silencers.rb +0 -7
  455. data/test/stub/rails4.0/config/initializers/filter_parameter_logging.rb +0 -4
  456. data/test/stub/rails4.0/config/initializers/inflections.rb +0 -16
  457. data/test/stub/rails4.0/config/initializers/mime_types.rb +0 -5
  458. data/test/stub/rails4.0/config/initializers/passenger.rb +0 -2
  459. data/test/stub/rails4.0/config/initializers/secret_token.rb +0 -12
  460. data/test/stub/rails4.0/config/initializers/session_store.rb +0 -3
  461. data/test/stub/rails4.0/config/initializers/wrap_parameters.rb +0 -14
  462. data/test/stub/rails4.0/config/locales/en.yml +0 -23
  463. data/test/stub/rails4.0/config/routes.rb +0 -57
  464. data/test/stub/rails4.0/db/seeds.rb +0 -7
  465. data/test/stub/rails4.0/lib/assets/.keep +0 -0
  466. data/test/stub/rails4.0/lib/tasks/.keep +0 -0
  467. data/test/stub/rails4.0/log/.keep +0 -0
  468. data/test/stub/rails4.0/public/404.html +0 -58
  469. data/test/stub/rails4.0/public/422.html +0 -58
  470. data/test/stub/rails4.0/public/500.html +0 -57
  471. data/test/stub/rails4.0/public/favicon.ico +0 -0
  472. data/test/stub/rails4.0/public/robots.txt +0 -5
  473. data/test/stub/rails4.0/test/controllers/.keep +0 -0
  474. data/test/stub/rails4.0/test/fixtures/.keep +0 -0
  475. data/test/stub/rails4.0/test/helpers/.keep +0 -0
  476. data/test/stub/rails4.0/test/integration/.keep +0 -0
  477. data/test/stub/rails4.0/test/mailers/.keep +0 -0
  478. data/test/stub/rails4.0/test/models/.keep +0 -0
  479. data/test/stub/rails4.0/test/test_helper.rb +0 -15
  480. data/test/stub/rails4.0/vendor/assets/javascripts/.keep +0 -0
  481. data/test/stub/rails4.0/vendor/assets/stylesheets/.keep +0 -0
  482. data/test/stub/rails4.1/.gitignore +0 -16
  483. data/test/stub/rails4.1/Gemfile +0 -45
  484. data/test/stub/rails4.1/Gemfile.lock +0 -129
  485. data/test/stub/rails4.1/README.rdoc +0 -28
  486. data/test/stub/rails4.1/Rakefile +0 -6
  487. data/test/stub/rails4.1/app/assets/images/.keep +0 -0
  488. data/test/stub/rails4.1/app/assets/javascripts/application.js +0 -16
  489. data/test/stub/rails4.1/app/assets/stylesheets/application.css +0 -13
  490. data/test/stub/rails4.1/app/controllers/application_controller.rb +0 -5
  491. data/test/stub/rails4.1/app/controllers/concerns/.keep +0 -0
  492. data/test/stub/rails4.1/app/helpers/application_helper.rb +0 -2
  493. data/test/stub/rails4.1/app/mailers/.keep +0 -0
  494. data/test/stub/rails4.1/app/models/.keep +0 -0
  495. data/test/stub/rails4.1/app/models/concerns/.keep +0 -0
  496. data/test/stub/rails4.1/app/views/layouts/application.html.erb +0 -14
  497. data/test/stub/rails4.1/bin/bundle +0 -3
  498. data/test/stub/rails4.1/bin/rails +0 -4
  499. data/test/stub/rails4.1/bin/rake +0 -4
  500. data/test/stub/rails4.1/config.ru +0 -4
  501. data/test/stub/rails4.1/config/application.rb +0 -23
  502. data/test/stub/rails4.1/config/boot.rb +0 -4
  503. data/test/stub/rails4.1/config/database.yml +0 -25
  504. data/test/stub/rails4.1/config/environment.rb +0 -5
  505. data/test/stub/rails4.1/config/environments/development.rb +0 -29
  506. data/test/stub/rails4.1/config/environments/production.rb +0 -80
  507. data/test/stub/rails4.1/config/environments/test.rb +0 -36
  508. data/test/stub/rails4.1/config/initializers/backtrace_silencers.rb +0 -7
  509. data/test/stub/rails4.1/config/initializers/filter_parameter_logging.rb +0 -4
  510. data/test/stub/rails4.1/config/initializers/inflections.rb +0 -16
  511. data/test/stub/rails4.1/config/initializers/mime_types.rb +0 -5
  512. data/test/stub/rails4.1/config/initializers/passenger.rb +0 -5
  513. data/test/stub/rails4.1/config/initializers/secret_token.rb +0 -12
  514. data/test/stub/rails4.1/config/initializers/session_store.rb +0 -3
  515. data/test/stub/rails4.1/config/initializers/wrap_parameters.rb +0 -14
  516. data/test/stub/rails4.1/config/locales/en.yml +0 -23
  517. data/test/stub/rails4.1/config/routes.rb +0 -57
  518. data/test/stub/rails4.1/db/seeds.rb +0 -7
  519. data/test/stub/rails4.1/lib/assets/.keep +0 -0
  520. data/test/stub/rails4.1/lib/tasks/.keep +0 -0
  521. data/test/stub/rails4.1/log/.keep +0 -0
  522. data/test/stub/rails4.1/public/404.html +0 -58
  523. data/test/stub/rails4.1/public/422.html +0 -58
  524. data/test/stub/rails4.1/public/500.html +0 -57
  525. data/test/stub/rails4.1/public/favicon.ico +0 -0
  526. data/test/stub/rails4.1/public/robots.txt +0 -5
  527. data/test/stub/rails4.1/test/controllers/.keep +0 -0
  528. data/test/stub/rails4.1/test/fixtures/.keep +0 -0
  529. data/test/stub/rails4.1/test/helpers/.keep +0 -0
  530. data/test/stub/rails4.1/test/integration/.keep +0 -0
  531. data/test/stub/rails4.1/test/mailers/.keep +0 -0
  532. data/test/stub/rails4.1/test/models/.keep +0 -0
  533. data/test/stub/rails4.1/test/test_helper.rb +0 -15
  534. data/test/stub/rails4.1/vendor/assets/javascripts/.keep +0 -0
  535. data/test/stub/rails4.1/vendor/assets/stylesheets/.keep +0 -0
  536. data/test/stub/start_error.pl +0 -24
  537. data/test/stub/upload_data.txt +0 -494
  538. data/test/stub/wsgi/passenger_wsgi.py +0 -212
  539. data/test/stub/wsgi/public/.gitignore +0 -0
  540. data/test/stub/wsgi/tmp/.gitignore +0 -0
  541. data/test/support/allocate_memory.c +0 -14
  542. data/test/support/apache2_controller.rb +0 -258
  543. data/test/support/multipart.rb +0 -62
  544. data/test/support/nginx_controller.rb +0 -97
  545. data/test/support/placebo-preloader.rb +0 -88
  546. data/test/support/test_helper.rb +0 -455
  547. data/test/support/valgrind.h +0 -2539
  548. data/test/tut/tut.h +0 -1310
  549. data/test/tut/tut_reporter.h +0 -256
  550. 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-2014 Phusion
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 persistent: 1;
50
+ bool wantKeepAlive: 1;
51
51
  bool fail: 1;
52
52
  bool blocking: 1;
53
53
 
54
54
  Connection()
55
55
  : fd(-1),
56
- persistent(false),
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
- persistent = false;
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.persistent = false;
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 totalActiveConnections;
106
+ int totalConnections;
107
+ int totalIdleConnections;
104
108
 
105
109
  /** Invariant: sessions >= 0 */
106
110
  int sessions;
107
111
 
108
112
  Socket()
109
- : concurrency(0)
113
+ : pid(-1),
114
+ concurrency(0)
110
115
  { }
111
116
 
112
- Socket(const StaticString &_name, const StaticString &_address, const StaticString &_protocol, int _concurrency)
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
- totalActiveConnections(0),
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
- totalActiveConnections(other.totalActiveConnections),
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
- totalActiveConnections = other.totalActiveConnections;
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 active connections: " << totalActiveConnections);
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 if (totalActiveConnections < connectionPoolLimit()) {
171
+ } else {
159
172
  Connection connection = connect();
160
- totalActiveConnections++;
173
+ totalConnections++;
161
174
  P_TRACE(3, "Socket " << address << ": there are now " <<
162
- totalActiveConnections << " active connections");
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.persistent) {
175
- totalActiveConnections--;
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 " << totalActiveConnections <<
178
- " active connections");
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
- idleConnections.size() << " -> " << (idleConnections.size() + 1) <<
184
- " items). Current active connections: " << totalActiveConnections);
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(const StaticString &name, const StaticString &address, const StaticString &protocol, int concurrency) {
230
- push_back(Socket(name, address, protocol, concurrency));
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-2014 Phusion
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, 2012 Phusion
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;
@@ -114,7 +114,7 @@
114
114
 
115
115
  #define NGINX_DOC_URL "https://www.phusionpassenger.com/documentation/Users%20guide%20Nginx.html"
116
116
 
117
- #define PASSENGER_VERSION "5.0.4"
117
+ #define PASSENGER_VERSION "5.0.5"
118
118
 
119
119
  #define POOL_HELPER_THREAD_STACK_SIZE 262144
120
120
 
@@ -689,7 +689,7 @@ public:
689
689
  state = EC_DISCONNECTED;
690
690
  watchReadEvents(false);
691
691
  watchWriteEvents(false);
692
- fd = -1;
692
+ fd.assign(-1, __FILE__, __LINE__);
693
693
  emitEvent(onDetach);
694
694
  return oldFd;
695
695
  }
@@ -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);
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  * Phusion Passenger - https://www.phusionpassenger.com/
3
- * Copyright (c) 2010, 2011, 2012 Phusion
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
- FileDescriptor &operator=(int fd) {
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 = open(...);
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() {
@@ -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
- static char *logFile = NULL;
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 char *path) {
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
- char *newLogFile = strdup(path);
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
- string getLogFile() {
78
- if (logFile == NULL) {
79
- return string();
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
- return string(logFile);
116
+ if (errcode != NULL) {
117
+ *errcode = errno;
118
+ }
119
+ return false;
82
120
  }
83
121
  }
84
122
 
85
123
  void
86
- _prepareLogEntry(std::stringstream &sstream, const char *file, unsigned int line) {
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[60];
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 << "." << std::setfill('0') << std::setw(4) <<
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
- _writeLogEntry(const StaticString &str) {
122
- try {
123
- writeExact(STDERR_FILENO, str.data(), str.size());
124
- } catch (const SystemException &) {
125
- /* The most likely reason why this fails is when the user has setup
126
- * Apache to log to a pipe (e.g. to a log rotation script). Upon
127
- * restarting the web server, the process that reads from the pipe
128
- * shuts down, so we can't write to it anymore. That's why we
129
- * just ignore write errors. It doesn't make sense to abort for
130
- * something like this.
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 std::string &str) {
137
- _writeLogEntry(StaticString(str));
192
+ _writeLogEntry(const char *str, unsigned int size) {
193
+ writeExactWithoutOXT(STDERR_FILENO, str, size);
138
194
  }
139
195
 
140
196
  void
141
- _writeLogEntry(const char *str, unsigned int size) {
142
- _writeLogEntry(StaticString(str, size));
197
+ _writeFileDescriptorLogEntry(const char *str, unsigned int size) {
198
+ writeExactWithoutOXT(fileDescriptorLog, str, size);
143
199
  }
144
200
 
145
201
  const char *
146
- _strdupStringStream(const std::stringstream &stream) {
147
- string str = stream.str();
148
- char *buf = (char *) malloc(str.size() + 1);
149
- memcpy(buf, str.data(), str.size());
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(StaticString(buf, pos - buf));
225
+ _writeLogEntry(buf, pos - buf);
171
226
  }
172
227
 
173
228
  void