passenger 3.0.21 → 3.9.1.beta
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of passenger might be problematic. Click here for more details.
- data/DEVELOPERS.TXT +4 -10
- data/NEWS +19 -27
- data/Rakefile +20 -19
- data/bin/passenger +3 -2
- data/bin/passenger-config +35 -5
- data/bin/passenger-install-apache2-module +12 -12
- data/bin/passenger-install-nginx-module +55 -38
- data/bin/passenger-memory-stats +3 -1
- data/bin/passenger-status +7 -35
- data/build/agents.rb +107 -21
- data/build/apache2.rb +11 -46
- data/build/basics.rb +61 -9
- data/build/common_library.rb +59 -142
- data/build/cxx_tests.rb +111 -110
- data/build/documentation.rb +33 -0
- data/build/misc.rb +30 -12
- data/build/nginx.rb +10 -39
- data/build/oxt_tests.rb +1 -0
- data/build/ruby_extension.rb +1 -5
- data/build/test_basics.rb +3 -2
- data/dev/copy_boost_headers.rb +2 -1
- data/doc/Architectural overview.html +49 -90
- data/doc/DebuggingAndStressTesting.txt.md +49 -0
- data/doc/Packaging.txt.md +254 -0
- data/doc/Security of user switching support.html +35 -66
- data/doc/Users guide Apache.html +588 -758
- data/doc/Users guide Apache.idmap.txt +253 -136
- data/doc/Users guide Apache.txt +154 -109
- data/doc/Users guide Nginx.html +544 -660
- data/doc/Users guide Nginx.idmap.txt +179 -91
- data/doc/Users guide Nginx.txt +192 -118
- data/doc/Users guide Standalone.html +65 -48
- data/doc/Users guide Standalone.idmap.txt +10 -2
- data/doc/Users guide Standalone.txt +4 -0
- data/doc/images/glyphicons-halflings-white.png +0 -0
- data/doc/images/glyphicons-halflings.png +0 -0
- data/doc/images/phusion_banner_small.png +0 -0
- data/doc/images/{smart-lv2.png → smart.png} +0 -0
- data/doc/images/{smart-lv2.svg → smart.svg} +0 -0
- data/doc/templates/bootstrap.min.css +397 -0
- data/doc/templates/markdown.html.erb +117 -0
- data/doc/users_guide_snippets/analysis_and_system_maintenance.txt +2 -1
- data/doc/users_guide_snippets/appendix_c_spawning_methods.txt +26 -48
- data/doc/users_guide_snippets/passenger_spawn_method.txt +18 -30
- data/doc/users_guide_snippets/support_information.txt +30 -0
- data/ext/apache2/Bucket.cpp +9 -26
- data/ext/apache2/Bucket.h +13 -10
- data/ext/apache2/Configuration.cpp +70 -58
- data/ext/apache2/Configuration.hpp +19 -47
- data/ext/apache2/DirectoryMapper.h +7 -7
- data/ext/apache2/Hooks.cpp +150 -313
- data/ext/boost/algorithm/string/detail/case_conv.hpp +4 -2
- data/ext/boost/algorithm/string/detail/find_format.hpp +20 -20
- data/ext/boost/algorithm/string/detail/find_format_all.hpp +23 -23
- data/ext/boost/algorithm/string/detail/find_format_store.hpp +2 -2
- data/ext/boost/algorithm/string/detail/formatter.hpp +25 -0
- data/ext/boost/algorithm/string/formatter.hpp +20 -3
- data/ext/boost/assert.hpp +85 -4
- data/ext/boost/bind/bind.hpp +1 -1
- data/ext/boost/concept/detail/backward_compatibility.hpp +1 -1
- data/ext/boost/concept_check.hpp +140 -64
- data/ext/boost/config.hpp +1 -1
- data/ext/boost/config/auto_link.hpp +8 -6
- data/ext/boost/config/compiler/borland.hpp +12 -2
- data/ext/boost/config/compiler/clang.hpp +89 -30
- data/ext/boost/config/compiler/codegear.hpp +3 -2
- data/ext/boost/config/compiler/common_edg.hpp +7 -5
- data/ext/boost/config/compiler/cray.hpp +61 -0
- data/ext/boost/config/compiler/digitalmars.hpp +9 -1
- data/ext/boost/config/compiler/gcc.hpp +33 -24
- data/ext/boost/config/compiler/gcc_xml.hpp +4 -0
- data/ext/boost/config/compiler/hp_acc.hpp +12 -1
- data/ext/boost/config/compiler/intel.hpp +78 -4
- data/ext/boost/config/compiler/metrowerks.hpp +4 -1
- data/ext/boost/config/compiler/mpw.hpp +4 -1
- data/ext/boost/config/compiler/nvcc.hpp +8 -66
- data/ext/boost/config/compiler/pathscale.hpp +80 -0
- data/ext/boost/config/compiler/pgi.hpp +5 -5
- data/ext/boost/config/compiler/sunpro_cc.hpp +4 -1
- data/ext/boost/config/compiler/vacpp.hpp +37 -13
- data/ext/boost/config/compiler/visualc.hpp +24 -11
- data/ext/boost/config/platform/bsd.hpp +1 -1
- data/ext/boost/config/platform/cray.hpp +18 -0
- data/ext/boost/config/platform/cygwin.hpp +10 -0
- data/ext/boost/config/platform/linux.hpp +5 -0
- data/ext/boost/config/platform/macos.hpp +5 -4
- data/ext/boost/config/platform/symbian.hpp +5 -2
- data/ext/boost/config/platform/vms.hpp +25 -0
- data/ext/boost/config/platform/win32.hpp +7 -1
- data/ext/boost/config/select_compiler_config.hpp +8 -25
- data/ext/boost/config/select_platform_config.hpp +8 -1
- data/ext/boost/config/select_stdlib_config.hpp +9 -1
- data/ext/boost/config/stdlib/dinkumware.hpp +6 -9
- data/ext/boost/config/stdlib/libcomo.hpp +1 -4
- data/ext/boost/config/stdlib/libcpp.hpp +36 -0
- data/ext/boost/config/stdlib/libstdcpp3.hpp +37 -11
- data/ext/boost/config/stdlib/modena.hpp +1 -4
- data/ext/boost/config/stdlib/msl.hpp +1 -4
- data/ext/boost/config/stdlib/roguewave.hpp +9 -6
- data/ext/boost/config/stdlib/sgi.hpp +12 -4
- data/ext/boost/config/stdlib/stlport.hpp +11 -4
- data/ext/boost/config/stdlib/vacpp.hpp +11 -4
- data/ext/boost/config/suffix.hpp +71 -6
- data/ext/boost/config/warning_disable.hpp +1 -1
- data/ext/boost/container/container_fwd.hpp +177 -0
- data/ext/boost/cstdint.hpp +17 -12
- data/ext/boost/current_function.hpp +2 -1
- data/ext/boost/date_time/c_time.hpp +17 -1
- data/ext/boost/date_time/compiler_config.hpp +13 -15
- data/ext/boost/date_time/date_formatting.hpp +7 -1
- data/ext/boost/date_time/filetime_functions.hpp +4 -4
- data/ext/boost/date_time/gregorian_calendar.ipp +2 -2
- data/ext/boost/date_time/strings_from_facet.hpp +3 -3
- data/ext/boost/date_time/time_facet.hpp +101 -101
- data/ext/boost/detail/endian.hpp +4 -2
- data/ext/boost/detail/fenv.hpp +74 -0
- data/ext/boost/detail/sp_typeinfo.hpp +6 -0
- data/ext/boost/exception/detail/clone_current_exception.hpp +47 -0
- data/ext/boost/exception/detail/exception_ptr.hpp +194 -122
- data/ext/boost/exception/detail/type_info.hpp +3 -3
- data/ext/boost/exception/diagnostic_information.hpp +37 -21
- data/ext/boost/exception/exception.hpp +21 -1
- data/ext/boost/exception/info.hpp +0 -1
- data/ext/boost/function.hpp +2 -2
- data/ext/boost/function/function_base.hpp +15 -9
- data/ext/boost/function/function_template.hpp +26 -48
- data/ext/boost/integer_fwd.hpp +0 -16
- data/ext/boost/integer_traits.hpp +2 -2
- data/ext/boost/iterator.hpp +1 -1
- data/ext/boost/iterator/iterator_adaptor.hpp +1 -7
- data/ext/boost/iterator/iterator_facade.hpp +13 -13
- data/ext/boost/iterator/transform_iterator.hpp +5 -20
- data/ext/boost/lexical_cast.hpp +1655 -673
- data/ext/boost/math/policies/policy.hpp +982 -0
- data/ext/boost/math/special_functions/detail/fp_traits.hpp +570 -0
- data/ext/boost/math/special_functions/detail/round_fwd.hpp +80 -0
- data/ext/boost/math/special_functions/fpclassify.hpp +533 -0
- data/ext/boost/math/special_functions/math_fwd.hpp +1070 -0
- data/ext/boost/math/special_functions/sign.hpp +145 -0
- data/ext/boost/math/tools/config.hpp +321 -0
- data/ext/boost/math/tools/promotion.hpp +150 -0
- data/ext/boost/math/tools/real_cast.hpp +29 -0
- data/ext/boost/math/tools/user.hpp +97 -0
- data/ext/boost/move/move.hpp +1222 -0
- data/ext/boost/mpl/O1_size.hpp +40 -0
- data/ext/boost/mpl/O1_size_fwd.hpp +24 -0
- data/ext/boost/mpl/advance.hpp +76 -0
- data/ext/boost/mpl/advance_fwd.hpp +28 -0
- data/ext/boost/mpl/at.hpp +52 -0
- data/ext/boost/mpl/at_fwd.hpp +24 -0
- data/ext/boost/mpl/aux_/O1_size_impl.hpp +87 -0
- data/ext/boost/mpl/aux_/advance_backward.hpp +128 -0
- data/ext/boost/mpl/aux_/advance_forward.hpp +127 -0
- data/ext/boost/mpl/aux_/arithmetic_op.hpp +92 -0
- data/ext/boost/mpl/aux_/at_impl.hpp +45 -0
- data/ext/boost/mpl/aux_/begin_end_impl.hpp +101 -0
- data/ext/boost/mpl/aux_/clear_impl.hpp +35 -0
- data/ext/boost/mpl/aux_/comparison_op.hpp +83 -0
- data/ext/boost/mpl/aux_/config/forwarding.hpp +27 -0
- data/ext/boost/mpl/aux_/config/typeof.hpp +38 -0
- data/ext/boost/mpl/aux_/contains_impl.hpp +61 -0
- data/ext/boost/mpl/aux_/find_if_pred.hpp +31 -0
- data/ext/boost/mpl/aux_/fold_impl.hpp +43 -0
- data/ext/boost/mpl/aux_/has_begin.hpp +23 -0
- data/ext/boost/mpl/aux_/has_size.hpp +23 -0
- data/ext/boost/mpl/aux_/has_tag.hpp +23 -0
- data/ext/boost/mpl/aux_/inserter_algorithm.hpp +159 -0
- data/ext/boost/mpl/aux_/is_msvc_eti_arg.hpp +64 -0
- data/ext/boost/mpl/aux_/iter_apply.hpp +47 -0
- data/ext/boost/mpl/aux_/iter_fold_if_impl.hpp +210 -0
- data/ext/boost/mpl/aux_/iter_fold_impl.hpp +42 -0
- data/ext/boost/mpl/aux_/lambda_spec.hpp +49 -0
- data/ext/boost/mpl/aux_/largest_int.hpp +63 -0
- data/ext/boost/mpl/aux_/msvc_eti_base.hpp +77 -0
- data/ext/boost/mpl/aux_/msvc_type.hpp +62 -0
- data/ext/boost/mpl/aux_/numeric_cast_utils.hpp +77 -0
- data/ext/boost/mpl/aux_/numeric_op.hpp +315 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/advance_backward.hpp +97 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/advance_forward.hpp +97 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/equal_to.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/fold_impl.hpp +180 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/greater.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/greater_equal.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_if_impl.hpp +133 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/iter_fold_impl.hpp +180 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/less.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/less_equal.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/list.hpp +323 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/minus.hpp +146 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/not_equal_to.hpp +94 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/plus.hpp +146 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/reverse_fold_impl.hpp +231 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/times.hpp +146 -0
- data/ext/boost/mpl/aux_/preprocessed/gcc/vector.hpp +323 -0
- data/ext/boost/mpl/aux_/preprocessor/default_params.hpp +67 -0
- data/ext/boost/mpl/aux_/push_back_impl.hpp +70 -0
- data/ext/boost/mpl/aux_/push_front_impl.hpp +71 -0
- data/ext/boost/mpl/aux_/reverse_fold_impl.hpp +44 -0
- data/ext/boost/mpl/aux_/size_impl.hpp +52 -0
- data/ext/boost/mpl/aux_/traits_lambda_spec.hpp +63 -0
- data/ext/boost/mpl/back_fwd.hpp +24 -0
- data/ext/boost/mpl/back_inserter.hpp +34 -0
- data/ext/boost/mpl/begin_end.hpp +57 -0
- data/ext/boost/mpl/begin_end_fwd.hpp +27 -0
- data/ext/boost/mpl/clear.hpp +39 -0
- data/ext/boost/mpl/clear_fwd.hpp +24 -0
- data/ext/boost/mpl/comparison.hpp +24 -0
- data/ext/boost/mpl/contains.hpp +41 -0
- data/ext/boost/mpl/contains_fwd.hpp +25 -0
- data/ext/boost/mpl/deref.hpp +41 -0
- data/ext/boost/mpl/distance.hpp +78 -0
- data/ext/boost/mpl/distance_fwd.hpp +28 -0
- data/ext/boost/mpl/empty_fwd.hpp +24 -0
- data/ext/boost/mpl/equal_to.hpp +21 -0
- data/ext/boost/mpl/find.hpp +38 -0
- data/ext/boost/mpl/find_if.hpp +50 -0
- data/ext/boost/mpl/fold.hpp +48 -0
- data/ext/boost/mpl/front_fwd.hpp +24 -0
- data/ext/boost/mpl/front_inserter.hpp +33 -0
- data/ext/boost/mpl/greater.hpp +21 -0
- data/ext/boost/mpl/greater_equal.hpp +21 -0
- data/ext/boost/mpl/inserter.hpp +32 -0
- data/ext/boost/mpl/iter_fold.hpp +49 -0
- data/ext/boost/mpl/iter_fold_if.hpp +117 -0
- data/ext/boost/mpl/iterator_range.hpp +42 -0
- data/ext/boost/mpl/iterator_tags.hpp +27 -0
- data/ext/boost/mpl/less.hpp +21 -0
- data/ext/boost/mpl/less_equal.hpp +21 -0
- data/ext/boost/mpl/limits/list.hpp +21 -0
- data/ext/boost/mpl/limits/vector.hpp +21 -0
- data/ext/boost/mpl/list.hpp +57 -0
- data/ext/boost/mpl/list/aux_/O1_size.hpp +33 -0
- data/ext/boost/mpl/list/aux_/begin_end.hpp +44 -0
- data/ext/boost/mpl/list/aux_/clear.hpp +34 -0
- data/ext/boost/mpl/list/aux_/empty.hpp +34 -0
- data/ext/boost/mpl/list/aux_/front.hpp +33 -0
- data/ext/boost/mpl/list/aux_/include_preprocessed.hpp +35 -0
- data/ext/boost/mpl/list/aux_/item.hpp +55 -0
- data/ext/boost/mpl/list/aux_/iterator.hpp +76 -0
- data/ext/boost/mpl/list/aux_/pop_front.hpp +34 -0
- data/ext/boost/mpl/list/aux_/preprocessed/plain/list10.hpp +149 -0
- data/ext/boost/mpl/list/aux_/preprocessed/plain/list20.hpp +169 -0
- data/ext/boost/mpl/list/aux_/push_back.hpp +36 -0
- data/ext/boost/mpl/list/aux_/push_front.hpp +39 -0
- data/ext/boost/mpl/list/aux_/size.hpp +33 -0
- data/ext/boost/mpl/list/aux_/tag.hpp +24 -0
- data/ext/boost/mpl/list/list0.hpp +42 -0
- data/ext/boost/mpl/list/list10.hpp +43 -0
- data/ext/boost/mpl/list/list20.hpp +43 -0
- data/ext/boost/mpl/long.hpp +22 -0
- data/ext/boost/mpl/long_fwd.hpp +27 -0
- data/ext/boost/mpl/minus.hpp +21 -0
- data/ext/boost/mpl/multiplies.hpp +53 -0
- data/ext/boost/mpl/negate.hpp +81 -0
- data/ext/boost/mpl/not_equal_to.hpp +21 -0
- data/ext/boost/mpl/numeric_cast.hpp +41 -0
- data/ext/boost/mpl/pair.hpp +70 -0
- data/ext/boost/mpl/plus.hpp +21 -0
- data/ext/boost/mpl/pop_back_fwd.hpp +24 -0
- data/ext/boost/mpl/pop_front_fwd.hpp +24 -0
- data/ext/boost/mpl/prior.hpp +19 -0
- data/ext/boost/mpl/push_back.hpp +53 -0
- data/ext/boost/mpl/push_back_fwd.hpp +24 -0
- data/ext/boost/mpl/push_front.hpp +52 -0
- data/ext/boost/mpl/push_front_fwd.hpp +24 -0
- data/ext/boost/mpl/remove_if.hpp +83 -0
- data/ext/boost/mpl/reverse_fold.hpp +50 -0
- data/ext/boost/mpl/same_as.hpp +55 -0
- data/ext/boost/mpl/sequence_tag.hpp +124 -0
- data/ext/boost/mpl/sequence_tag_fwd.hpp +26 -0
- data/ext/boost/mpl/size.hpp +42 -0
- data/ext/boost/mpl/size_fwd.hpp +24 -0
- data/ext/boost/mpl/tag.hpp +52 -0
- data/ext/boost/mpl/times.hpp +21 -0
- data/ext/boost/mpl/vector.hpp +57 -0
- data/ext/boost/mpl/vector/aux_/O1_size.hpp +56 -0
- data/ext/boost/mpl/vector/aux_/at.hpp +116 -0
- data/ext/boost/mpl/vector/aux_/back.hpp +59 -0
- data/ext/boost/mpl/vector/aux_/begin_end.hpp +49 -0
- data/ext/boost/mpl/vector/aux_/clear.hpp +55 -0
- data/ext/boost/mpl/vector/aux_/empty.hpp +68 -0
- data/ext/boost/mpl/vector/aux_/front.hpp +56 -0
- data/ext/boost/mpl/vector/aux_/include_preprocessed.hpp +55 -0
- data/ext/boost/mpl/vector/aux_/item.hpp +103 -0
- data/ext/boost/mpl/vector/aux_/iterator.hpp +130 -0
- data/ext/boost/mpl/vector/aux_/pop_back.hpp +40 -0
- data/ext/boost/mpl/vector/aux_/pop_front.hpp +40 -0
- data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector10.hpp +829 -0
- data/ext/boost/mpl/vector/aux_/preprocessed/plain/vector20.hpp +1144 -0
- data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector10.hpp +139 -0
- data/ext/boost/mpl/vector/aux_/preprocessed/typeof_based/vector20.hpp +159 -0
- data/ext/boost/mpl/vector/aux_/push_back.hpp +40 -0
- data/ext/boost/mpl/vector/aux_/push_front.hpp +40 -0
- data/ext/boost/mpl/vector/aux_/size.hpp +49 -0
- data/ext/boost/mpl/vector/aux_/tag.hpp +32 -0
- data/ext/boost/mpl/vector/aux_/vector0.hpp +52 -0
- data/ext/boost/mpl/vector/vector0.hpp +34 -0
- data/ext/boost/mpl/vector/vector10.hpp +45 -0
- data/ext/boost/mpl/vector/vector20.hpp +45 -0
- data/ext/boost/none.hpp +1 -1
- data/ext/boost/numeric/conversion/bounds.hpp +24 -0
- data/ext/boost/numeric/conversion/cast.hpp +61 -0
- data/ext/boost/numeric/conversion/conversion_traits.hpp +39 -0
- data/ext/boost/numeric/conversion/converter.hpp +68 -0
- data/ext/boost/numeric/conversion/converter_policies.hpp +186 -0
- data/ext/boost/numeric/conversion/detail/bounds.hpp +58 -0
- data/ext/boost/numeric/conversion/detail/conversion_traits.hpp +97 -0
- data/ext/boost/numeric/conversion/detail/converter.hpp +602 -0
- data/ext/boost/numeric/conversion/detail/int_float_mixture.hpp +72 -0
- data/ext/boost/numeric/conversion/detail/is_subranged.hpp +234 -0
- data/ext/boost/numeric/conversion/detail/meta.hpp +120 -0
- data/ext/boost/numeric/conversion/detail/numeric_cast_traits.hpp +138 -0
- data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_common.hpp +1741 -0
- data/ext/boost/numeric/conversion/detail/preprocessed/numeric_cast_traits_long_long.hpp +347 -0
- data/ext/boost/numeric/conversion/detail/sign_mixture.hpp +72 -0
- data/ext/boost/numeric/conversion/detail/udt_builtin_mixture.hpp +69 -0
- data/ext/boost/numeric/conversion/int_float_mixture_enum.hpp +29 -0
- data/ext/boost/numeric/conversion/numeric_cast_traits.hpp +31 -0
- data/ext/boost/numeric/conversion/sign_mixture_enum.hpp +29 -0
- data/ext/boost/numeric/conversion/udt_builtin_mixture_enum.hpp +26 -0
- data/ext/boost/operators.hpp +3 -1
- data/ext/boost/optional/optional.hpp +146 -79
- data/ext/boost/optional/optional_fwd.hpp +8 -1
- data/ext/boost/preprocessor/cat.hpp +2 -2
- data/ext/boost/preprocessor/config/config.hpp +39 -4
- data/ext/boost/preprocessor/facilities/intercept.hpp +277 -0
- data/ext/boost/preprocessor/facilities/overload.hpp +25 -0
- data/ext/boost/preprocessor/iteration/detail/iter/forward1.hpp +3 -3
- data/ext/boost/preprocessor/iteration/iterate.hpp +3 -3
- data/ext/boost/preprocessor/punctuation/paren.hpp +23 -0
- data/ext/boost/preprocessor/repetition/enum_shifted_params.hpp +44 -0
- data/ext/boost/preprocessor/seq/cat.hpp +5 -4
- data/ext/boost/preprocessor/seq/size.hpp +0 -1
- data/ext/boost/preprocessor/tuple/eat.hpp +83 -34
- data/ext/boost/preprocessor/tuple/elem.hpp +161 -355
- data/ext/boost/preprocessor/tuple/rem.hpp +110 -48
- data/ext/boost/preprocessor/tuple/to_list.hpp +90 -36
- data/ext/boost/preprocessor/variadic/elem.hpp +94 -0
- data/ext/boost/preprocessor/variadic/size.hpp +30 -0
- data/ext/boost/range/begin.hpp +17 -6
- data/ext/boost/range/concepts.hpp +37 -2
- data/ext/boost/range/detail/safe_bool.hpp +72 -0
- data/ext/boost/range/end.hpp +14 -9
- data/ext/boost/range/iterator_range_core.hpp +120 -12
- data/ext/boost/range/size.hpp +21 -5
- data/ext/boost/smart_ptr/detail/shared_count.hpp +88 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base.hpp +3 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_aix.hpp +142 -0
- data/ext/boost/smart_ptr/detail/sp_counted_base_gcc_mips.hpp +9 -0
- data/ext/boost/smart_ptr/detail/sp_counted_impl.hpp +10 -2
- data/ext/boost/smart_ptr/detail/sp_has_sync.hpp +5 -1
- data/ext/boost/smart_ptr/detail/spinlock.hpp +4 -1
- data/ext/boost/smart_ptr/detail/spinlock_gcc_arm.hpp +20 -3
- data/ext/boost/smart_ptr/detail/spinlock_pool.hpp +4 -0
- data/ext/boost/smart_ptr/make_shared.hpp +591 -22
- data/ext/boost/smart_ptr/shared_array.hpp +29 -1
- data/ext/boost/smart_ptr/shared_ptr.hpp +29 -13
- data/ext/boost/smart_ptr/weak_ptr.hpp +24 -12
- data/ext/boost/src/pthread/once.cpp +9 -7
- data/ext/boost/src/pthread/thread.cpp +32 -28
- data/ext/boost/src/pthread/timeconv.inl +4 -5
- data/ext/boost/src/tss_null.cpp +5 -1
- data/ext/boost/static_assert.hpp +8 -2
- data/ext/boost/thread/detail/config.hpp +19 -4
- data/ext/boost/thread/detail/move.hpp +11 -5
- data/ext/boost/thread/detail/thread.hpp +59 -43
- data/ext/boost/thread/exceptions.hpp +9 -9
- data/ext/boost/thread/future.hpp +150 -82
- data/ext/boost/thread/locks.hpp +101 -60
- data/ext/boost/thread/pthread/condition_variable.hpp +79 -32
- data/ext/boost/thread/pthread/condition_variable_fwd.hpp +12 -3
- data/ext/boost/thread/pthread/mutex.hpp +17 -14
- data/ext/boost/thread/pthread/once.hpp +3 -4
- data/ext/boost/thread/pthread/pthread_mutex_scoped_lock.hpp +12 -2
- data/ext/boost/thread/pthread/recursive_mutex.hpp +19 -19
- data/ext/boost/thread/pthread/shared_mutex.hpp +13 -13
- data/ext/boost/thread/pthread/thread_data.hpp +40 -12
- data/ext/boost/thread/thread_time.hpp +5 -0
- data/ext/boost/throw_exception.hpp +1 -1
- data/ext/boost/token_functions.hpp +34 -10
- data/ext/boost/type_traits/add_rvalue_reference.hpp +66 -0
- data/ext/boost/type_traits/alignment_of.hpp +1 -1
- data/ext/boost/type_traits/detail/bool_trait_def.hpp +26 -3
- data/ext/boost/type_traits/detail/bool_trait_undef.hpp +3 -2
- data/ext/boost/type_traits/detail/cv_traits_impl.hpp +1 -1
- data/ext/boost/type_traits/detail/size_t_trait_def.hpp +6 -4
- data/ext/boost/type_traits/detail/type_trait_def.hpp +8 -2
- data/ext/boost/type_traits/function_traits.hpp +1 -1
- data/ext/boost/type_traits/has_nothrow_constructor.hpp +53 -0
- data/ext/boost/type_traits/has_nothrow_copy.hpp +19 -5
- data/ext/boost/type_traits/has_trivial_constructor.hpp +51 -0
- data/ext/boost/type_traits/has_trivial_copy.hpp +20 -5
- data/ext/boost/type_traits/has_trivial_destructor.hpp +12 -5
- data/ext/boost/type_traits/intrinsics.hpp +119 -71
- data/ext/boost/type_traits/is_const.hpp +5 -5
- data/ext/boost/type_traits/is_convertible.hpp +14 -13
- data/ext/boost/type_traits/is_enum.hpp +1 -1
- data/ext/boost/type_traits/is_floating_point.hpp +27 -0
- data/ext/boost/type_traits/is_function.hpp +3 -3
- data/ext/boost/type_traits/is_fundamental.hpp +1 -1
- data/ext/boost/type_traits/is_member_function_pointer.hpp +2 -2
- data/ext/boost/type_traits/is_member_pointer.hpp +2 -2
- data/ext/boost/type_traits/is_pod.hpp +11 -3
- data/ext/boost/type_traits/is_pointer.hpp +2 -2
- data/ext/boost/type_traits/is_signed.hpp +8 -3
- data/ext/boost/type_traits/is_union.hpp +8 -0
- data/ext/boost/type_traits/is_unsigned.hpp +9 -4
- data/ext/boost/type_traits/is_volatile.hpp +5 -5
- data/ext/boost/type_traits/remove_cv.hpp +4 -3
- data/ext/boost/type_traits/remove_pointer.hpp +51 -2
- data/ext/boost/type_traits/remove_reference.hpp +2 -2
- data/ext/boost/type_traits/type_with_alignment.hpp +8 -2
- data/ext/boost/utility/declval.hpp +44 -0
- data/ext/boost/utility/detail/in_place_factory_prefix.hpp +36 -0
- data/ext/boost/utility/detail/in_place_factory_suffix.hpp +23 -0
- data/ext/boost/utility/detail/result_of_iterate.hpp +142 -0
- data/ext/boost/utility/in_place_factory.hpp +88 -0
- data/ext/boost/utility/result_of.hpp +103 -0
- data/ext/boost/utility/swap.hpp +55 -0
- data/ext/common/AnsiColorConstants.h +36 -0
- data/ext/common/ApplicationPool2/Common.h +87 -0
- data/ext/common/ApplicationPool2/ComponentInfo.h +53 -0
- data/ext/common/ApplicationPool2/Group.h +648 -0
- data/ext/common/ApplicationPool2/Implementation.cpp +580 -0
- data/ext/common/ApplicationPool2/Options.h +576 -0
- data/ext/common/ApplicationPool2/PipeWatcher.h +61 -0
- data/ext/common/ApplicationPool2/Pool.h +1181 -0
- data/ext/common/ApplicationPool2/Process.h +425 -0
- data/ext/common/ApplicationPool2/README.md +96 -0
- data/ext/common/ApplicationPool2/Session.h +158 -0
- data/ext/common/ApplicationPool2/Socket.h +246 -0
- data/ext/common/ApplicationPool2/Spawner.h +2212 -0
- data/ext/common/ApplicationPool2/SuperGroup.h +749 -0
- data/ext/common/BackgroundEventLoop.cpp +129 -0
- data/ext/common/BackgroundEventLoop.h +61 -0
- data/ext/common/Constants.h +3 -1
- data/ext/common/EventedBufferedInput.h +331 -0
- data/ext/common/EventedMessageServer.h +17 -34
- data/ext/common/EventedServer.h +2 -2
- data/ext/common/Exceptions.h +71 -19
- data/ext/common/FileDescriptor.h +8 -6
- data/ext/common/HttpConstants.h +167 -0
- data/ext/common/IniFile.h +24 -0
- data/ext/common/Logging.h +62 -849
- data/ext/common/MessageReadersWriters.h +19 -0
- data/ext/common/MessageServer.h +11 -14
- data/ext/common/MultiLibeio.cpp +198 -0
- data/ext/common/MultiLibeio.h +67 -0
- data/ext/common/ResourceLocator.h +24 -41
- data/ext/common/SafeLibev.h +186 -14
- data/ext/common/StaticString.h +23 -3
- data/ext/common/UnionStation.h +972 -0
- data/ext/common/Utils.cpp +168 -24
- data/ext/common/Utils.h +25 -3
- data/ext/common/Utils/CachedFileStat.hpp +4 -3
- data/ext/common/Utils/FileChangeChecker.h +2 -2
- data/ext/common/Utils/HashMap.h +50 -0
- data/ext/common/Utils/IOUtils.cpp +229 -68
- data/ext/common/Utils/IOUtils.h +134 -3
- data/ext/common/Utils/Lock.h +28 -0
- data/ext/common/Utils/MemoryBarrier.h +52 -0
- data/ext/common/Utils/PriorityQueue.h +54 -0
- data/ext/common/Utils/ProcessMetricsCollector.h +9 -11
- data/ext/common/Utils/ScopeGuard.h +50 -1
- data/ext/common/Utils/SmallVector.h +653 -0
- data/ext/common/Utils/StrIntUtils.cpp +26 -2
- data/ext/common/Utils/StrIntUtils.h +18 -2
- data/ext/common/Utils/StringMap.h +125 -8
- data/ext/common/Utils/Template.h +212 -0
- data/ext/common/Utils/fib.c +699 -0
- data/ext/common/Utils/fib.h +101 -0
- data/ext/common/Utils/fibpriv.h +67 -0
- data/ext/common/Utils/json-forwards.h +249 -0
- data/ext/common/Utils/json.h +1855 -0
- data/ext/common/Utils/jsoncpp.cpp +4230 -0
- data/ext/common/agents/Base.cpp +1126 -0
- data/ext/common/{AgentBase.h → agents/Base.h} +5 -1
- data/ext/common/agents/EnvPrinter.c +16 -0
- data/ext/common/agents/HelperAgent/AgentOptions.h +81 -0
- data/ext/common/{HelperAgent → agents/HelperAgent}/BacktracesServer.h +3 -2
- data/ext/common/agents/HelperAgent/FileBackedPipe.h +732 -0
- data/ext/common/agents/HelperAgent/Main.cpp +497 -0
- data/ext/common/agents/HelperAgent/RequestHandler.cpp +283 -0
- data/ext/common/agents/HelperAgent/RequestHandler.h +2139 -0
- data/ext/common/agents/HelperAgent/ScgiRequestParser.h +451 -0
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/DataStoreId.h +1 -1
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.cpp +1 -1
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/FilterSupport.h +0 -0
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/LoggingServer.h +18 -16
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/Main.cpp +15 -13
- data/ext/common/{LoggingAgent → agents/LoggingAgent}/RemoteSender.h +6 -6
- data/ext/common/agents/SpawnPreparer.cpp +127 -0
- data/ext/common/{Watchdog.cpp → agents/Watchdog/Main.cpp} +63 -25
- data/ext/libeio/Changes +72 -0
- data/ext/{google/COPYING → libeio/LICENSE} +17 -9
- data/ext/libeio/Makefile.am +15 -0
- data/ext/libeio/Makefile.in +694 -0
- data/ext/libeio/aclocal.m4 +9418 -0
- data/ext/libeio/autogen.sh +3 -0
- data/ext/libeio/config.guess +1501 -0
- data/ext/libeio/config.h.in +136 -0
- data/ext/libeio/config.sub +1705 -0
- data/ext/libeio/configure +14822 -0
- data/ext/libeio/configure.ac +22 -0
- data/ext/libeio/demo.c +194 -0
- data/ext/libeio/ecb.h +457 -0
- data/ext/libeio/eio.c +2816 -0
- data/ext/libeio/eio.h +411 -0
- data/ext/libeio/install-sh +520 -0
- data/ext/libeio/libeio.m4 +211 -0
- data/ext/libeio/ltmain.sh +9636 -0
- data/ext/libeio/missing +376 -0
- data/ext/libeio/xthread.h +166 -0
- data/ext/libev/Changes +125 -7
- data/ext/libev/Makefile.am +5 -3
- data/ext/libev/Makefile.in +209 -120
- data/ext/libev/aclocal.m4 +6027 -4619
- data/ext/libev/autogen.sh +1 -4
- data/ext/libev/config.h.in +11 -7
- data/ext/libev/configure +7312 -14993
- data/ext/libev/configure.ac +12 -5
- data/ext/libev/depcomp +630 -0
- data/ext/libev/ev++.h +48 -32
- data/ext/libev/ev.c +1173 -391
- data/ext/libev/ev.h +315 -181
- data/ext/libev/ev_epoll.c +66 -15
- data/ext/libev/ev_kqueue.c +20 -18
- data/ext/libev/ev_poll.c +27 -23
- data/ext/libev/ev_port.c +39 -19
- data/ext/libev/ev_select.c +23 -17
- data/ext/libev/ev_vars.h +25 -8
- data/ext/libev/ev_win32.c +6 -6
- data/ext/libev/ev_wrap.h +22 -2
- data/ext/libev/event.c +18 -17
- data/ext/libev/event.h +16 -4
- data/ext/libev/libev.m4 +10 -6
- data/ext/libev/ltmain.sh +7353 -5811
- data/ext/nginx/Configuration.c +74 -42
- data/ext/nginx/Configuration.h +3 -5
- data/ext/nginx/ContentHandler.c +26 -83
- data/ext/nginx/ContentHandler.h +1 -1
- data/ext/nginx/config +13 -9
- data/ext/nginx/ngx_http_passenger_module.c +3 -7
- data/ext/oxt/detail/backtrace_enabled.hpp +5 -102
- data/ext/oxt/detail/context.hpp +90 -0
- data/ext/oxt/detail/spin_lock_darwin.hpp +4 -0
- data/ext/oxt/detail/spin_lock_gcc_x86.hpp +4 -0
- data/ext/oxt/detail/spin_lock_pthreads.hpp +14 -0
- data/ext/oxt/detail/tracable_exception_enabled.hpp +2 -2
- data/ext/oxt/dynamic_thread_group.hpp +27 -1
- data/ext/oxt/implementation.cpp +415 -0
- data/ext/oxt/{thread.cpp → initialize.hpp} +13 -6
- data/ext/oxt/macros.hpp +32 -1
- data/ext/oxt/spin_lock.hpp +6 -11
- data/ext/oxt/system_calls.cpp +204 -16
- data/ext/oxt/system_calls.hpp +85 -45
- data/ext/oxt/thread.hpp +13 -117
- data/ext/ruby/passenger_native_support.c +82 -237
- data/helper-scripts/backtrace-sanitizer.rb +114 -0
- data/helper-scripts/classic-rails-loader.rb +135 -0
- data/helper-scripts/classic-rails-preloader.rb +161 -0
- data/helper-scripts/node-loader.js +314 -0
- data/helper-scripts/rack-loader.rb +104 -0
- data/helper-scripts/rack-preloader.rb +132 -0
- data/helper-scripts/wsgi-loader.py +231 -0
- data/helper-scripts/wsgi-preloader.py +1 -0
- data/lib/phusion_passenger.rb +159 -61
- data/lib/phusion_passenger/abstract_installer.rb +182 -87
- data/lib/phusion_passenger/admin_tools/server_instance.rb +25 -19
- data/lib/phusion_passenger/analytics_logger.rb +5 -4
- data/lib/phusion_passenger/classic_rails/{request_handler.rb → thread_handler_extension.rb} +4 -40
- data/lib/phusion_passenger/classic_rails_extensions/init.rb +5 -3
- data/lib/phusion_passenger/common_library.rb +441 -0
- data/lib/phusion_passenger/console_text_template.rb +4 -16
- data/lib/phusion_passenger/constants.rb +1 -8
- data/lib/phusion_passenger/debug_logging.rb +5 -2
- data/lib/phusion_passenger/dependencies.rb +51 -13
- data/lib/phusion_passenger/loader_shared_helpers.rb +318 -0
- data/lib/phusion_passenger/message_channel.rb +3 -47
- data/lib/phusion_passenger/message_client.rb +2 -2
- data/lib/phusion_passenger/native_support.rb +36 -15
- data/lib/phusion_passenger/packaging.rb +8 -11
- data/lib/phusion_passenger/platform_info.rb +25 -17
- data/lib/phusion_passenger/platform_info/apache.rb +10 -7
- data/lib/phusion_passenger/platform_info/binary_compatibility.rb +10 -30
- data/lib/phusion_passenger/platform_info/compiler.rb +93 -34
- data/lib/phusion_passenger/platform_info/ruby.rb +37 -97
- data/lib/phusion_passenger/preloader_shared_helpers.rb +121 -0
- data/lib/phusion_passenger/public_api.rb +1 -4
- data/lib/phusion_passenger/rack/{request_handler.rb → thread_handler_extension.rb} +14 -63
- data/lib/phusion_passenger/rails3_extensions/init.rb +9 -8
- data/lib/phusion_passenger/request_handler.rb +500 -0
- data/lib/phusion_passenger/request_handler/thread_handler.rb +360 -0
- data/lib/phusion_passenger/ruby_core_enhancements.rb +142 -0
- data/lib/phusion_passenger/standalone/command.rb +36 -15
- data/lib/phusion_passenger/standalone/package_runtime_command.rb +16 -8
- data/lib/phusion_passenger/standalone/runtime_installer.rb +169 -72
- data/lib/phusion_passenger/standalone/start_command.rb +44 -39
- data/lib/phusion_passenger/standalone/utils.rb +5 -5
- data/lib/phusion_passenger/utils.rb +35 -914
- data/lib/phusion_passenger/utils/ansi_colors.rb +59 -0
- data/lib/phusion_passenger/utils/file_system_watcher.rb +1 -1
- data/lib/phusion_passenger/utils/robust_interruption.rb +134 -0
- data/lib/phusion_passenger/utils/tee_input.rb +174 -0
- data/lib/phusion_passenger/utils/tmpio.rb +33 -0
- data/lib/phusion_passenger/utils/unseekable_socket.rb +6 -0
- data/resources/mime.types +5 -1
- data/{lib/phusion_passenger/templates → resources}/standalone_default_root/index.html +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/apache_must_be_compiled_with_compatible_mpm.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/config_snippets.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/deployment_example.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/no_write_permission_to_passenger_root.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/run_installer_as_root.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/apache2/welcome.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/error_layout.css +6 -0
- data/resources/templates/error_layout.html.template +89 -0
- data/resources/templates/general_error.html.template +1 -0
- data/resources/templates/general_error_with_html.html.template +1 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/ask_for_extra_configure_flags.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/cannot_write_to_dir.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/config_snippets_inserted.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/confirm_extra_configure_flags.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/deployment_example.txt.erb +0 -0
- data/resources/templates/nginx/not_available_when_natively_packaged.txt.erb +8 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_downloaded.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/pcre_could_not_be_extracted.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_compilation_and_installation_problems.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/query_download_and_install.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/run_installer_as_root.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/nginx/welcome.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/standalone/cannot_write_to_dir.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/standalone/config.erb +26 -5
- data/{lib/phusion_passenger → resources}/templates/standalone/possible_solutions_for_download_and_extraction_problems.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/standalone/run_installer_as_root.txt.erb +0 -0
- data/{lib/phusion_passenger → resources}/templates/standalone/welcome.txt.erb +0 -0
- data/resources/templates/undisclosed_error.html.template +25 -0
- data/test/config.json.example +42 -0
- data/test/cxx/ApplicationPool2/DirectSpawnerTest.cpp +86 -0
- data/test/cxx/ApplicationPool2/OptionsTest.cpp +44 -0
- data/test/cxx/ApplicationPool2/PoolTest.cpp +1234 -0
- data/test/cxx/ApplicationPool2/ProcessTest.cpp +131 -0
- data/test/cxx/ApplicationPool2/SmartSpawnerTest.cpp +229 -0
- data/test/cxx/ApplicationPool2/SpawnerTestCases.cpp +744 -0
- data/test/cxx/BufferedIOTest.cpp +7 -7
- data/test/cxx/CxxTestMain.cpp +65 -2
- data/test/cxx/FileBackedPipeTest.cpp +626 -0
- data/test/cxx/FileChangeCheckerTest.cpp +20 -18
- data/test/cxx/FilterSupportTest.cpp +5 -5
- data/test/cxx/IOUtilsTest.cpp +11 -4
- data/test/cxx/MessageReadersWritersTest.cpp +1 -1
- data/test/cxx/MessageServerTest.cpp +31 -30
- data/test/cxx/RequestHandlerTest.cpp +777 -0
- data/test/cxx/ScgiRequestParserTest.cpp +36 -16
- data/test/cxx/ServerInstanceDirTest.cpp +1 -1
- data/test/cxx/StringMapTest.cpp +61 -0
- data/test/cxx/TemplateTest.cpp +118 -0
- data/test/cxx/TestSupport.cpp +25 -68
- data/test/cxx/TestSupport.h +81 -41
- data/test/cxx/{LoggingTest.cpp → UnionStationTest.cpp} +79 -74
- data/test/cxx/UtilsTest.cpp +59 -5
- data/test/integration_tests/apache2_tests.rb +2 -2
- data/test/integration_tests/nginx_tests.rb +1 -1
- data/test/integration_tests/spec_helper.rb +7 -5
- data/test/oxt/oxt_test_main.cpp +2 -0
- data/test/oxt/syscall_interruption_test.cpp +1 -0
- data/test/ruby/classic_rails/loader_spec.rb +48 -0
- data/test/ruby/classic_rails/preloader_spec.rb +54 -0
- data/test/ruby/rack/loader_spec.rb +62 -0
- data/test/ruby/rack/preloader_spec.rb +74 -0
- data/test/ruby/{abstract_request_handler_spec.rb → request_handler_spec.rb} +31 -68
- data/test/ruby/shared/loader_spec.rb +241 -0
- data/test/ruby/shared/rails/analytics_logging_extensions_spec.rb +141 -182
- data/test/ruby/shared/ruby_loader_spec.rb +55 -0
- data/test/ruby/spec_helper.rb +8 -53
- data/test/ruby/utils/file_system_watcher_spec.rb +9 -1
- data/test/ruby/utils_spec.rb +10 -683
- data/test/stub/rack/config.ru +28 -3
- data/test/stub/rack/start.rb +47 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/Rakefile +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/application_controller.rb +0 -2
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_1.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/bar_controller_2.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/controllers/foo_controller.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/app/helpers/application_helper.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/boot.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/database.yml +3 -3
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environment.rb +5 -2
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/development.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/production.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/environments/staging.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/inflections.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/initializers/mime_types.rb +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/config/routes.rb +1 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/about +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/console +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/dbconsole +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/destroy +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/generate +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/benchmarker +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/profiler +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/performance/request +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/plugin +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/inspector +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/reaper +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/process/spawner +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/runner +0 -0
- data/test/stub/{rails_apps/2.3/foobar → rails2.3}/script/server +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/Gemfile +0 -0
- data/test/stub/rails3.0/Gemfile.lock +80 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/Rakefile +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/controllers/application_controller.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/helpers/application_helper.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/app/views/layouts/application.html.erb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config.ru +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/application.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/boot.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/database.yml +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environment.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/development.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/production.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/environments/test.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/backtrace_silencers.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/inflections.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/mime_types.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/passenger.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/secret_token.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/initializers/session_store.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/locales/en.yml +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/config/routes.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/db/seeds.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/doc/README_FOR_APP +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/404.html +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/422.html +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/500.html +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/favicon.ico +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/index.html +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/public/robots.txt +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/script/rails +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/performance/browsing_test.rb +0 -0
- data/test/stub/{rails_apps/3.0/empty → rails3.0}/test/test_helper.rb +0 -0
- data/test/stub/start_error.pl +24 -0
- data/test/stub/wsgi/passenger_wsgi.py +71 -3
- data/test/support/apache2_controller.rb +2 -2
- data/test/support/placebo-preloader.rb +88 -0
- data/test/support/test_helper.rb +1 -14
- data/test/tut/tut.h +11 -4
- metadata +590 -326
- data.tar.gz.asc +0 -12
- data/PACKAGING.TXT +0 -25
- data/build/config.rb +0 -46
- data/ext/apache2/HelperAgent.cpp +0 -364
- data/ext/boost/call_traits.hpp +0 -24
- data/ext/boost/detail/call_traits.hpp +0 -164
- data/ext/common/AbstractSpawnManager.h +0 -110
- data/ext/common/AgentBase.cpp +0 -432
- data/ext/common/ApplicationPool/Client.h +0 -788
- data/ext/common/ApplicationPool/Interface.h +0 -295
- data/ext/common/ApplicationPool/Pool.h +0 -1327
- data/ext/common/ApplicationPool/Server.h +0 -479
- data/ext/common/MessageChannel.h +0 -494
- data/ext/common/PoolOptions.h +0 -518
- data/ext/common/Process.h +0 -253
- data/ext/common/Session.h +0 -436
- data/ext/common/SpawnManager.h +0 -611
- data/ext/google/ChangeLog +0 -167
- data/ext/google/dense_hash_map +0 -310
- data/ext/google/dense_hash_set +0 -287
- data/ext/google/sparse_hash_map +0 -294
- data/ext/google/sparse_hash_set +0 -275
- data/ext/google/sparsehash/densehashtable.h +0 -1062
- data/ext/google/sparsehash/sparseconfig.h +0 -55
- data/ext/google/sparsehash/sparsehashtable.h +0 -1015
- data/ext/google/sparsetable +0 -1468
- data/ext/google/type_traits.h +0 -250
- data/ext/nginx/HelperAgent.cpp +0 -1355
- data/ext/nginx/ScgiRequestParser.h +0 -375
- data/ext/oxt/backtrace.cpp +0 -185
- data/ext/oxt/tracable_exception.cpp +0 -89
- data/helper-scripts/passenger-spawn-server +0 -106
- data/lib/phusion_passenger/abstract_request_handler.rb +0 -766
- data/lib/phusion_passenger/abstract_server.rb +0 -372
- data/lib/phusion_passenger/abstract_server_collection.rb +0 -335
- data/lib/phusion_passenger/app_process.rb +0 -174
- data/lib/phusion_passenger/classic_rails/application_spawner.rb +0 -344
- data/lib/phusion_passenger/classic_rails/framework_spawner.rb +0 -311
- data/lib/phusion_passenger/exceptions.rb +0 -103
- data/lib/phusion_passenger/html_template.rb +0 -107
- data/lib/phusion_passenger/rack/application_spawner.rb +0 -231
- data/lib/phusion_passenger/spawn_manager.rb +0 -359
- data/lib/phusion_passenger/templates/app_exited_during_initialization.html.erb +0 -38
- data/lib/phusion_passenger/templates/app_init_error.html.erb +0 -64
- data/lib/phusion_passenger/templates/database_error.html.erb +0 -66
- data/lib/phusion_passenger/templates/error_layout.html.erb +0 -39
- data/lib/phusion_passenger/templates/framework_init_error.html.erb +0 -39
- data/lib/phusion_passenger/templates/general_error.html.erb +0 -22
- data/lib/phusion_passenger/templates/load_error.html.erb +0 -46
- data/lib/phusion_passenger/templates/version_not_found.html.erb +0 -34
- data/lib/phusion_passenger/utils/rewindable_input.rb +0 -125
- data/lib/phusion_passenger/wsgi/application_spawner.rb +0 -108
- data/test/config.yml.example +0 -41
- data/test/cxx/ApplicationPool_PoolTest.cpp +0 -33
- data/test/cxx/ApplicationPool_PoolTestCases.cpp +0 -1029
- data/test/cxx/ApplicationPool_ServerTest.cpp +0 -308
- data/test/cxx/ApplicationPool_Server_PoolTest.cpp +0 -80
- data/test/cxx/MessageChannelTest.cpp +0 -557
- data/test/cxx/PoolOptionsTest.cpp +0 -116
- data/test/cxx/SpawnManagerTest.cpp +0 -161
- data/test/ruby/abstract_server_collection_spec.rb +0 -247
- data/test/ruby/abstract_server_spec.rb +0 -61
- data/test/ruby/app_process_spec.rb +0 -43
- data/test/ruby/classic_rails/application_spawner_spec.rb +0 -89
- data/test/ruby/classic_rails/framework_spawner_spec.rb +0 -92
- data/test/ruby/rack/application_spawner_spec.rb +0 -116
- data/test/ruby/shared/abstract_server_spec.rb +0 -23
- data/test/ruby/shared/spawners/classic_rails/framework_spawner_spec.rb +0 -38
- data/test/ruby/shared/spawners/classic_rails/lack_of_rails_gem_version_spec.rb +0 -19
- data/test/ruby/shared/spawners/classic_rails/spawner_spec.rb +0 -15
- data/test/ruby/shared/spawners/non_preloading_spawner_spec.rb +0 -27
- data/test/ruby/shared/spawners/preloading_spawner_spec.rb +0 -29
- data/test/ruby/shared/spawners/reload_all_spec.rb +0 -36
- data/test/ruby/shared/spawners/reload_single_spec.rb +0 -52
- data/test/ruby/shared/spawners/spawn_server_spec.rb +0 -28
- data/test/ruby/shared/spawners/spawner_spec.rb +0 -273
- data/test/ruby/shared/utils/pseudo_io_spec.rb +0 -60
- data/test/ruby/spawn_manager_spec.rb +0 -134
- data/test/ruby/wsgi/application_spawner_spec.rb +0 -50
- data/test/stub/message_channel.rb +0 -11
- data/test/stub/message_channel_2.rb +0 -12
- data/test/stub/message_channel_3.rb +0 -19
- data/test/stub/rails_apps/3.0/empty/Gemfile.lock +0 -73
- data/test/stub/spawn_server.rb +0 -22
- metadata.gz.asc +0 -12
data/ext/common/IniFile.h
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
/*
|
2
|
+
* Phusion Passenger - http://www.modrails.com/
|
3
|
+
* Copyright (c) 2011 Phusion
|
4
|
+
*
|
5
|
+
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
|
+
*
|
7
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
8
|
+
* of this software and associated documentation files (the "Software"), to deal
|
9
|
+
* in the Software without restriction, including without limitation the rights
|
10
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
11
|
+
* copies of the Software, and to permit persons to whom the Software is
|
12
|
+
* furnished to do so, subject to the following conditions:
|
13
|
+
*
|
14
|
+
* The above copyright notice and this permission notice shall be included in
|
15
|
+
* all copies or substantial portions of the Software.
|
16
|
+
*
|
17
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
18
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
19
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
20
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
21
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
22
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
23
|
+
* THE SOFTWARE.
|
24
|
+
*/
|
1
25
|
#ifndef _PASSENGER_INI_FILE_H_
|
2
26
|
#define _PASSENGER_INI_FILE_H_
|
3
27
|
|
data/ext/common/Logging.h
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
* Phusion Passenger - http://www.modrails.com/
|
3
|
-
* Copyright (c) 2010 Phusion
|
3
|
+
* Copyright (c) 2010, 2011, 2012 Phusion
|
4
4
|
*
|
5
5
|
* "Phusion Passenger" is a trademark of Hongli Lai & Ninh Bui.
|
6
6
|
*
|
@@ -25,11 +25,9 @@
|
|
25
25
|
#ifndef _PASSENGER_LOGGING_H_
|
26
26
|
#define _PASSENGER_LOGGING_H_
|
27
27
|
|
28
|
-
#include <boost/shared_ptr.hpp>
|
29
|
-
#include <boost/noncopyable.hpp>
|
30
28
|
#include <oxt/thread.hpp>
|
31
29
|
#include <oxt/system_calls.hpp>
|
32
|
-
#include <oxt/
|
30
|
+
#include <oxt/macros.hpp>
|
33
31
|
|
34
32
|
#include <sys/types.h>
|
35
33
|
#include <sys/time.h>
|
@@ -39,25 +37,15 @@
|
|
39
37
|
#include <fcntl.h>
|
40
38
|
#include <pthread.h>
|
41
39
|
#include <string>
|
42
|
-
#include <
|
40
|
+
#include <exception>
|
43
41
|
#include <stdexcept>
|
42
|
+
#include <iomanip>
|
44
43
|
#include <ostream>
|
45
44
|
#include <sstream>
|
46
45
|
#include <cstdio>
|
47
46
|
#include <ctime>
|
48
47
|
#include <cerrno>
|
49
48
|
|
50
|
-
#include <RandomGenerator.h>
|
51
|
-
#include <FileDescriptor.h>
|
52
|
-
#include <StaticString.h>
|
53
|
-
#include <Exceptions.h>
|
54
|
-
#include <Utils.h>
|
55
|
-
#include <Utils/ScopeGuard.h>
|
56
|
-
#include <Utils/MessageIO.h>
|
57
|
-
#include <Utils/StrIntUtils.h>
|
58
|
-
#include <Utils/MD5.h>
|
59
|
-
#include <Utils/SystemTime.h>
|
60
|
-
|
61
49
|
|
62
50
|
namespace Passenger {
|
63
51
|
|
@@ -92,13 +80,14 @@ void setDebugFile(const char *logFile = NULL);
|
|
92
80
|
\
|
93
81
|
the_time = time(NULL); \
|
94
82
|
localtime_r(&the_time, &the_tm); \
|
95
|
-
strftime(datetime_buf, sizeof(datetime_buf), "%F %H:%M:%S", &the_tm); \
|
83
|
+
strftime(datetime_buf, sizeof(datetime_buf) - 1, "%F %H:%M:%S", &the_tm); \
|
96
84
|
gettimeofday(&tv, NULL); \
|
97
85
|
sstream << \
|
98
86
|
"[ pid=" << ((unsigned long) getpid()) << \
|
99
87
|
" thr=" << pthread_self() << \
|
100
88
|
" file=" << __FILE__ << ":" << (unsigned long) __LINE__ << \
|
101
|
-
" time=" << datetime_buf << "." << (
|
89
|
+
" time=" << datetime_buf << "." << std::setfill('0') << std::setw(4) << \
|
90
|
+
(unsigned long) (tv.tv_usec / 100) << \
|
102
91
|
" ]: " << \
|
103
92
|
expr << std::endl; \
|
104
93
|
*stream << sstream.str(); \
|
@@ -117,6 +106,12 @@ void setDebugFile(const char *logFile = NULL);
|
|
117
106
|
*/
|
118
107
|
#define P_WARN(expr) P_LOG(0, expr)
|
119
108
|
|
109
|
+
/**
|
110
|
+
* Write the given expression, which represents a warning,
|
111
|
+
* to the log stream.
|
112
|
+
*/
|
113
|
+
#define P_INFO(expr) P_LOG(0, expr)
|
114
|
+
|
120
115
|
/**
|
121
116
|
* Write the given expression, which represents an error,
|
122
117
|
* to the log stream.
|
@@ -129,858 +124,76 @@ void setDebugFile(const char *logFile = NULL);
|
|
129
124
|
*/
|
130
125
|
#define P_DEBUG(expr) P_TRACE(1, expr)
|
131
126
|
|
127
|
+
/**
|
128
|
+
* Aborts the current process. At least on OS X, abort() unfortunately sends SIGABRT
|
129
|
+
* to a random thread, causing the original backtrace to be lost when gdb has
|
130
|
+
* detected SIGABRT. We fix that by sending SIGABRT to the calling thread.
|
131
|
+
*/
|
132
|
+
#define P_ABORT() \
|
133
|
+
do { \
|
134
|
+
P_ERROR("Aborting!"); \
|
135
|
+
sigset_t set; \
|
136
|
+
sigemptyset(&set); \
|
137
|
+
sigaddset(&set, SIGABRT); \
|
138
|
+
pthread_sigmask(SIG_UNBLOCK, &set, NULL); \
|
139
|
+
pthread_kill(pthread_self(), SIGABRT); \
|
140
|
+
abort(); \
|
141
|
+
} while (false)
|
142
|
+
|
132
143
|
#ifdef PASSENGER_DEBUG
|
133
144
|
#define P_TRACE(level, expr) P_LOG_TO(level, expr, Passenger::_logStream)
|
134
145
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
return result_if_failed; \
|
140
|
-
} \
|
141
|
-
} while (false)
|
142
|
-
#define P_ASSERT_WITH_VOID_RETURN(expr, message) \
|
146
|
+
/* A version of assert() that works better. We also print the process ID, time
|
147
|
+
* and other stuff that the P_* logging functions normally print.
|
148
|
+
*/
|
149
|
+
#define P_ASSERT(expr) \
|
143
150
|
do { \
|
144
|
-
if (!(expr)) { \
|
145
|
-
P_ERROR("Assertion failed: " <<
|
146
|
-
|
151
|
+
if (OXT_UNLIKELY(!(expr))) { \
|
152
|
+
P_ERROR("Assertion failed: " << #expr); \
|
153
|
+
P_ABORT(); \
|
147
154
|
} \
|
148
155
|
} while (false)
|
149
156
|
#else
|
150
157
|
#define P_TRACE(level, expr) do { /* nothing */ } while (false)
|
151
|
-
|
152
|
-
#define P_ASSERT(expr, result_if_failed, message) do { /* nothing */ } while (false)
|
153
|
-
#define P_ASSERT_WITH_VOID_RETURN(expr, message) do { /* nothing */ } while (false)
|
158
|
+
#define P_ASSERT(expr) ((void) 0)
|
154
159
|
#endif
|
155
160
|
|
156
161
|
|
157
|
-
|
158
|
-
|
159
|
-
// All access to the file descriptor must be synchronized through the lock.
|
160
|
-
struct AnalyticsLoggerConnection {
|
161
|
-
mutable boost::mutex lock;
|
162
|
-
FileDescriptor fd;
|
163
|
-
|
164
|
-
AnalyticsLoggerConnection(FileDescriptor _fd)
|
165
|
-
: fd(_fd)
|
166
|
-
{ }
|
167
|
-
|
168
|
-
bool connected() const {
|
169
|
-
return fd != -1;
|
170
|
-
}
|
171
|
-
|
172
|
-
bool disconnect(string &errorResponse) {
|
173
|
-
if (!connected()) {
|
174
|
-
return false;
|
175
|
-
}
|
176
|
-
|
177
|
-
// The server might send an "error" array message
|
178
|
-
// just before disconnecting. Try to read it.
|
179
|
-
TRACE_POINT();
|
180
|
-
vector<string> response;
|
181
|
-
try {
|
182
|
-
while (true) {
|
183
|
-
unsigned long long timeout = 10000;
|
184
|
-
response = readArrayMessage(fd, &timeout);
|
185
|
-
}
|
186
|
-
} catch (const TimeoutException &) {
|
187
|
-
// This means that the last message isn't an array
|
188
|
-
// message or that the server didn't send it quickly
|
189
|
-
// enough. In any case, discard whatever previous
|
190
|
-
// array messages we were able to read because they're
|
191
|
-
// guaranteed not to be the error message we're expecting.
|
192
|
-
response.clear();
|
193
|
-
} catch (const SystemException &e) {
|
194
|
-
// We treat ECONNRESET the same as EOFException.
|
195
|
-
// Other errors are treated as TimeoutException.
|
196
|
-
if (e.code() != ECONNRESET) {
|
197
|
-
response.clear();
|
198
|
-
}
|
199
|
-
} catch (const EOFException &) {
|
200
|
-
// Do nothing. We've successfully read the last array message.
|
201
|
-
}
|
202
|
-
|
203
|
-
this_thread::disable_interruption di;
|
204
|
-
this_thread::disable_syscall_interruption dsi;
|
205
|
-
UPDATE_TRACE_POINT();
|
206
|
-
fd.close();
|
207
|
-
|
208
|
-
if (response.size() == 2 && response[0] == "error") {
|
209
|
-
errorResponse = response[1];
|
210
|
-
return true;
|
211
|
-
} else {
|
212
|
-
return false;
|
213
|
-
}
|
214
|
-
}
|
215
|
-
|
216
|
-
void disconnect() {
|
217
|
-
fd.close();
|
218
|
-
}
|
219
|
-
};
|
220
|
-
|
221
|
-
typedef shared_ptr<AnalyticsLoggerConnection> AnalyticsLoggerConnectionPtr;
|
222
|
-
|
223
|
-
|
224
|
-
enum ExceptionHandlingMode {
|
225
|
-
PRINT,
|
226
|
-
THROW,
|
227
|
-
IGNORE
|
228
|
-
};
|
229
|
-
|
230
|
-
|
231
|
-
class AnalyticsLog {
|
162
|
+
class NotExpectingExceptions {
|
232
163
|
private:
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
const
|
237
|
-
|
238
|
-
const string groupName;
|
239
|
-
const string category;
|
240
|
-
const string unionStationKey;
|
241
|
-
const ExceptionHandlingMode exceptionHandlingMode;
|
242
|
-
bool shouldFlushToDiskAfterClose;
|
243
|
-
|
244
|
-
/**
|
245
|
-
* Buffer must be at least txnId.size() + 1 + INT64_STR_BUFSIZE + 1 bytes.
|
246
|
-
*/
|
247
|
-
char *insertTxnIdAndTimestamp(char *buffer) {
|
248
|
-
int size;
|
249
|
-
|
250
|
-
// "txn-id-here"
|
251
|
-
memcpy(buffer, txnId.c_str(), txnId.size());
|
252
|
-
buffer += txnId.size();
|
253
|
-
|
254
|
-
// "txn-id-here "
|
255
|
-
*buffer = ' ';
|
256
|
-
buffer++;
|
257
|
-
|
258
|
-
// "txn-id-here 123456"
|
259
|
-
size = snprintf(buffer, INT64_STR_BUFSIZE, "%llu", SystemTime::getUsec());
|
260
|
-
if (size >= INT64_STR_BUFSIZE) {
|
261
|
-
// The buffer is too small.
|
262
|
-
throw IOException("Cannot format a new transaction log message timestamp.");
|
263
|
-
}
|
264
|
-
buffer += size;
|
265
|
-
|
266
|
-
// "txn-id-here 123456 "
|
267
|
-
*buffer = ' ';
|
268
|
-
|
269
|
-
return buffer + 1;
|
270
|
-
}
|
271
|
-
|
272
|
-
template<typename ExceptionType>
|
273
|
-
void handleException(const ExceptionType &e) {
|
274
|
-
switch (exceptionHandlingMode) {
|
275
|
-
case THROW:
|
276
|
-
throw e;
|
277
|
-
case PRINT:
|
278
|
-
try {
|
279
|
-
const tracable_exception &te =
|
280
|
-
dynamic_cast<const tracable_exception &>(e);
|
281
|
-
P_WARN(te.what() << "\n" << te.backtrace());
|
282
|
-
} catch (const bad_cast &) {
|
283
|
-
P_WARN(e.what());
|
284
|
-
}
|
285
|
-
break;
|
286
|
-
default:
|
287
|
-
break;
|
288
|
-
}
|
289
|
-
}
|
290
|
-
|
291
|
-
public:
|
292
|
-
AnalyticsLog()
|
293
|
-
: exceptionHandlingMode(PRINT)
|
294
|
-
{ }
|
295
|
-
|
296
|
-
AnalyticsLog(const AnalyticsLoggerConnectionPtr &_connection,
|
297
|
-
const string &_txnId,
|
298
|
-
const string &_groupName,
|
299
|
-
const string &_category,
|
300
|
-
const string &_unionStationKey,
|
301
|
-
ExceptionHandlingMode _exceptionHandlingMode = PRINT)
|
302
|
-
: connection(_connection),
|
303
|
-
txnId(_txnId),
|
304
|
-
groupName(_groupName),
|
305
|
-
category(_category),
|
306
|
-
unionStationKey(_unionStationKey),
|
307
|
-
exceptionHandlingMode(_exceptionHandlingMode),
|
308
|
-
shouldFlushToDiskAfterClose(false)
|
309
|
-
{ }
|
310
|
-
|
311
|
-
~AnalyticsLog() {
|
312
|
-
TRACE_POINT();
|
313
|
-
if (connection == NULL) {
|
314
|
-
return;
|
315
|
-
}
|
316
|
-
lock_guard<boost::mutex> l(connection->lock);
|
317
|
-
if (!connection->connected()) {
|
318
|
-
return;
|
319
|
-
}
|
320
|
-
|
321
|
-
char timestamp[2 * sizeof(unsigned long long) + 1];
|
322
|
-
integerToHexatri<unsigned long long>(SystemTime::getUsec(),
|
323
|
-
timestamp);
|
324
|
-
|
325
|
-
UPDATE_TRACE_POINT();
|
326
|
-
ScopeGuard guard(boost::bind(&AnalyticsLoggerConnection::disconnect,
|
327
|
-
connection.get()));
|
328
|
-
try {
|
329
|
-
unsigned long long timeout = IO_TIMEOUT;
|
330
|
-
writeArrayMessage(connection->fd, &timeout,
|
331
|
-
"closeTransaction",
|
332
|
-
txnId.c_str(),
|
333
|
-
timestamp,
|
334
|
-
NULL);
|
335
|
-
|
336
|
-
if (shouldFlushToDiskAfterClose) {
|
337
|
-
UPDATE_TRACE_POINT();
|
338
|
-
timeout = IO_TIMEOUT;
|
339
|
-
writeArrayMessage(connection->fd, &timeout,
|
340
|
-
"flush", NULL);
|
341
|
-
readArrayMessage(connection->fd, &timeout);
|
342
|
-
}
|
343
|
-
guard.clear();
|
344
|
-
} catch (const SystemException &e) {
|
345
|
-
string errorResponse;
|
346
|
-
|
347
|
-
UPDATE_TRACE_POINT();
|
348
|
-
guard.clear();
|
349
|
-
if (connection->disconnect(errorResponse)) {
|
350
|
-
handleException(IOException(
|
351
|
-
string("Logging agent disconnected with error: ") +
|
352
|
-
e.what()));
|
353
|
-
} else {
|
354
|
-
handleException(e);
|
355
|
-
}
|
356
|
-
}
|
357
|
-
}
|
358
|
-
|
359
|
-
void message(const StaticString &text) {
|
360
|
-
TRACE_POINT();
|
361
|
-
if (connection == NULL) {
|
362
|
-
return;
|
363
|
-
}
|
364
|
-
lock_guard<boost::mutex> l(connection->lock);
|
365
|
-
if (!connection->connected()) {
|
366
|
-
return;
|
367
|
-
}
|
368
|
-
|
369
|
-
char timestamp[2 * sizeof(unsigned long long) + 1];
|
370
|
-
integerToHexatri<unsigned long long>(SystemTime::getUsec(), timestamp);
|
371
|
-
|
372
|
-
UPDATE_TRACE_POINT();
|
373
|
-
ScopeGuard guard(boost::bind(&AnalyticsLoggerConnection::disconnect,
|
374
|
-
connection.get()));
|
375
|
-
try {
|
376
|
-
unsigned long long timeout = IO_TIMEOUT;
|
377
|
-
writeArrayMessage(connection->fd, &timeout,
|
378
|
-
"log",
|
379
|
-
txnId.c_str(),
|
380
|
-
timestamp,
|
381
|
-
NULL);
|
382
|
-
writeScalarMessage(connection->fd, text, &timeout);
|
383
|
-
guard.clear();
|
384
|
-
} catch (const std::exception &e) {
|
385
|
-
string errorResponse;
|
386
|
-
|
387
|
-
UPDATE_TRACE_POINT();
|
388
|
-
guard.clear();
|
389
|
-
if (connection->disconnect(errorResponse)) {
|
390
|
-
handleException(IOException(
|
391
|
-
string("Logging agent disconnected with error: ") +
|
392
|
-
e.what()));
|
393
|
-
} else {
|
394
|
-
handleException(e);
|
395
|
-
}
|
396
|
-
}
|
397
|
-
}
|
398
|
-
|
399
|
-
void abort(const StaticString &text) {
|
400
|
-
message("ABORT");
|
401
|
-
}
|
402
|
-
|
403
|
-
void flushToDiskAfterClose(bool value) {
|
404
|
-
shouldFlushToDiskAfterClose = value;
|
405
|
-
}
|
406
|
-
|
407
|
-
bool isNull() const {
|
408
|
-
return connection == NULL;
|
409
|
-
}
|
410
|
-
|
411
|
-
string getTxnId() const {
|
412
|
-
return txnId;
|
413
|
-
}
|
414
|
-
|
415
|
-
string getGroupName() const {
|
416
|
-
return groupName;
|
417
|
-
}
|
418
|
-
|
419
|
-
string getCategory() const {
|
420
|
-
return category;
|
421
|
-
}
|
422
|
-
|
423
|
-
string getUnionStationKey() const {
|
424
|
-
return unionStationKey;
|
425
|
-
}
|
426
|
-
};
|
427
|
-
|
428
|
-
typedef shared_ptr<AnalyticsLog> AnalyticsLogPtr;
|
429
|
-
|
164
|
+
this_thread::disable_interruption di;
|
165
|
+
this_thread::disable_syscall_interruption dsi;
|
166
|
+
const char *filename;
|
167
|
+
const char *function;
|
168
|
+
unsigned int line;
|
430
169
|
|
431
|
-
class AnalyticsScopeLog: public boost::noncopyable {
|
432
|
-
private:
|
433
|
-
AnalyticsLog * const log;
|
434
|
-
enum {
|
435
|
-
NAME,
|
436
|
-
GRANULAR
|
437
|
-
} type;
|
438
|
-
union {
|
439
|
-
const char *name;
|
440
|
-
struct {
|
441
|
-
const char *endMessage;
|
442
|
-
const char *abortMessage;
|
443
|
-
} granular;
|
444
|
-
} data;
|
445
|
-
bool ok;
|
446
|
-
|
447
|
-
static string timevalToString(struct timeval &tv) {
|
448
|
-
unsigned long long i = (unsigned long long) tv.tv_sec * 1000000 + tv.tv_usec;
|
449
|
-
return usecToString(i);
|
450
|
-
}
|
451
|
-
|
452
|
-
static string usecToString(unsigned long long usec) {
|
453
|
-
char timestamp[2 * sizeof(unsigned long long) + 1];
|
454
|
-
integerToHexatri<unsigned long long>(usec, timestamp);
|
455
|
-
return timestamp;
|
456
|
-
}
|
457
|
-
|
458
170
|
public:
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
data.name = name;
|
464
|
-
ok = false;
|
465
|
-
if (log != NULL && !log->isNull()) {
|
466
|
-
string message;
|
467
|
-
struct rusage usage;
|
468
|
-
|
469
|
-
message.reserve(150);
|
470
|
-
message.append("BEGIN: ");
|
471
|
-
message.append(name);
|
472
|
-
message.append(" (");
|
473
|
-
message.append(usecToString(SystemTime::getUsec()));
|
474
|
-
message.append(",");
|
475
|
-
if (getrusage(RUSAGE_SELF, &usage) == -1) {
|
476
|
-
int e = errno;
|
477
|
-
throw SystemException("getrusage() failed", e);
|
478
|
-
}
|
479
|
-
message.append(timevalToString(usage.ru_utime));
|
480
|
-
message.append(",");
|
481
|
-
message.append(timevalToString(usage.ru_stime));
|
482
|
-
message.append(") ");
|
483
|
-
log->message(message);
|
484
|
-
}
|
485
|
-
}
|
486
|
-
|
487
|
-
AnalyticsScopeLog(const AnalyticsLogPtr &_log,
|
488
|
-
const char *beginMessage,
|
489
|
-
const char *endMessage,
|
490
|
-
const char *abortMessage = NULL)
|
491
|
-
: log(_log.get())
|
492
|
-
{
|
493
|
-
if (_log != NULL) {
|
494
|
-
type = GRANULAR;
|
495
|
-
data.granular.endMessage = endMessage;
|
496
|
-
data.granular.abortMessage = abortMessage;
|
497
|
-
ok = abortMessage == NULL;
|
498
|
-
_log->message(beginMessage);
|
499
|
-
}
|
500
|
-
}
|
501
|
-
|
502
|
-
~AnalyticsScopeLog() {
|
503
|
-
if (log == NULL) {
|
504
|
-
return;
|
505
|
-
}
|
506
|
-
if (type == NAME) {
|
507
|
-
if (!log->isNull()) {
|
508
|
-
string message;
|
509
|
-
struct rusage usage;
|
510
|
-
|
511
|
-
message.reserve(150);
|
512
|
-
if (ok) {
|
513
|
-
message.append("END: ");
|
514
|
-
} else {
|
515
|
-
message.append("FAIL: ");
|
516
|
-
}
|
517
|
-
message.append(data.name);
|
518
|
-
message.append(" (");
|
519
|
-
message.append(usecToString(SystemTime::getUsec()));
|
520
|
-
message.append(",");
|
521
|
-
if (getrusage(RUSAGE_SELF, &usage) == -1) {
|
522
|
-
int e = errno;
|
523
|
-
throw SystemException("getrusage() failed", e);
|
524
|
-
}
|
525
|
-
message.append(timevalToString(usage.ru_utime));
|
526
|
-
message.append(",");
|
527
|
-
message.append(timevalToString(usage.ru_stime));
|
528
|
-
message.append(")");
|
529
|
-
log->message(message);
|
530
|
-
}
|
531
|
-
} else {
|
532
|
-
if (ok) {
|
533
|
-
log->message(data.granular.endMessage);
|
534
|
-
} else {
|
535
|
-
log->message(data.granular.abortMessage);
|
536
|
-
}
|
537
|
-
}
|
538
|
-
}
|
539
|
-
|
540
|
-
void success() {
|
541
|
-
ok = true;
|
171
|
+
NotExpectingExceptions(const char *_filename, unsigned int _line, const char *_function) {
|
172
|
+
filename = _filename;
|
173
|
+
line = _line;
|
174
|
+
function = _function;
|
542
175
|
}
|
543
|
-
};
|
544
|
-
|
545
176
|
|
546
|
-
|
547
|
-
|
548
|
-
|
549
|
-
|
550
|
-
* is not destroyed prematurely.
|
551
|
-
*/
|
552
|
-
struct ConnectionLock {
|
553
|
-
AnalyticsLoggerConnectionPtr connection;
|
554
|
-
bool locked;
|
555
|
-
|
556
|
-
ConnectionLock(const AnalyticsLoggerConnectionPtr &c)
|
557
|
-
: connection(c)
|
558
|
-
{
|
559
|
-
c->lock.lock();
|
560
|
-
locked = true;
|
561
|
-
}
|
562
|
-
|
563
|
-
~ConnectionLock() {
|
564
|
-
if (locked) {
|
565
|
-
connection->lock.unlock();
|
566
|
-
}
|
177
|
+
~NotExpectingExceptions() {
|
178
|
+
if (std::uncaught_exception()) {
|
179
|
+
P_ERROR("Unexpected exception detected at " << filename <<
|
180
|
+
":" << line << ", function '" << function << "'!");
|
567
181
|
}
|
568
|
-
|
569
|
-
void reset(const AnalyticsLoggerConnectionPtr &c, bool lockNow = true) {
|
570
|
-
if (locked) {
|
571
|
-
connection->lock.unlock();
|
572
|
-
}
|
573
|
-
connection = c;
|
574
|
-
if (lockNow) {
|
575
|
-
connection->lock.lock();
|
576
|
-
locked = true;
|
577
|
-
} else {
|
578
|
-
locked = false;
|
579
|
-
}
|
580
|
-
}
|
581
|
-
|
582
|
-
void lock() {
|
583
|
-
assert(!locked);
|
584
|
-
connection->lock.lock();
|
585
|
-
locked = true;
|
586
|
-
}
|
587
|
-
};
|
588
|
-
|
589
|
-
const string serverAddress;
|
590
|
-
const string username;
|
591
|
-
const string password;
|
592
|
-
const string nodeName;
|
593
|
-
RandomGenerator randomGenerator;
|
594
|
-
|
595
|
-
/** Lock protecting the fields that follow, but not the
|
596
|
-
* contents of the connection object.
|
597
|
-
*/
|
598
|
-
mutable boost::mutex lock;
|
599
|
-
|
600
|
-
unsigned int maxConnectTries;
|
601
|
-
unsigned long long reconnectTimeout;
|
602
|
-
unsigned long long nextReconnectTime;
|
603
|
-
/** Normally never NULL, except when constructed with the default constructor
|
604
|
-
* or if serverName is empty. In those cases the AnalyticsLogger object is
|
605
|
-
* considered unusable.
|
606
|
-
*/
|
607
|
-
AnalyticsLoggerConnectionPtr connection;
|
608
|
-
|
609
|
-
static string determineNodeName(const string &givenNodeName) {
|
610
|
-
if (givenNodeName.empty()) {
|
611
|
-
return getHostName();
|
612
|
-
} else {
|
613
|
-
return givenNodeName;
|
614
|
-
}
|
615
|
-
}
|
616
|
-
|
617
|
-
static bool isNetworkError(int code) {
|
618
|
-
return code == EPIPE || code == ECONNREFUSED || code == ECONNRESET
|
619
|
-
|| code == EHOSTUNREACH || code == ENETDOWN || code == ENETUNREACH
|
620
|
-
|| code == ETIMEDOUT;
|
621
|
-
}
|
622
|
-
|
623
|
-
bool connected() const {
|
624
|
-
return connection->connected();
|
625
|
-
}
|
626
|
-
|
627
|
-
void connect() {
|
628
|
-
TRACE_POINT();
|
629
|
-
FileDescriptor fd;
|
630
|
-
vector<string> args;
|
631
|
-
unsigned long long timeout = 15000000;
|
632
|
-
|
633
|
-
fd = connectToServer(serverAddress);
|
634
|
-
if (!readArrayMessage(fd, args, &timeout)) {
|
635
|
-
throw IOException("The logging agent closed the connection before sending a version identifier.");
|
636
|
-
}
|
637
|
-
if (args.size() != 2 || args[0] != "version") {
|
638
|
-
throw IOException("The logging agent server didn't sent a valid version identifier.");
|
639
|
-
}
|
640
|
-
if (args[1] != "1") {
|
641
|
-
string message = string("Unsupported logging agent protocol version ") +
|
642
|
-
args[1] + ".";
|
643
|
-
throw IOException(message);
|
644
|
-
}
|
645
|
-
|
646
|
-
UPDATE_TRACE_POINT();
|
647
|
-
writeScalarMessage(fd, username, &timeout);
|
648
|
-
writeScalarMessage(fd, password, &timeout);
|
649
|
-
|
650
|
-
UPDATE_TRACE_POINT();
|
651
|
-
if (!readArrayMessage(fd, args, &timeout)) {
|
652
|
-
throw IOException("The logging agent did not send an authentication response.");
|
653
|
-
} else if (args.size() != 1) {
|
654
|
-
throw IOException("The authentication response that the logging agent sent is not valid.");
|
655
|
-
} else if (args[0] != "ok") {
|
656
|
-
throw SecurityException("The logging agent server denied authentication: " + args[0]);
|
657
|
-
}
|
658
|
-
|
659
|
-
UPDATE_TRACE_POINT();
|
660
|
-
writeArrayMessage(fd, &timeout, "init", nodeName.c_str(), NULL);
|
661
|
-
if (!readArrayMessage(fd, args, &timeout)) {
|
662
|
-
throw SystemException("Cannot connect to logging server", ECONNREFUSED);
|
663
|
-
} else if (args.size() != 1) {
|
664
|
-
throw IOException("Logging server returned an invalid reply for the 'init' command");
|
665
|
-
} else if (args[0] == "server shutting down") {
|
666
|
-
throw SystemException("Cannot connect to server", ECONNREFUSED);
|
667
|
-
} else if (args[0] != "ok") {
|
668
|
-
throw IOException("Logging server returned an invalid reply for the 'init' command");
|
669
|
-
}
|
670
|
-
|
671
|
-
connection = make_shared<AnalyticsLoggerConnection>(fd);
|
672
|
-
}
|
673
|
-
|
674
|
-
public:
|
675
|
-
AnalyticsLogger() { }
|
676
|
-
|
677
|
-
AnalyticsLogger(const string &_serverAddress, const string &_username,
|
678
|
-
const string &_password, const string &_nodeName = "")
|
679
|
-
: serverAddress(_serverAddress),
|
680
|
-
username(_username),
|
681
|
-
password(_password),
|
682
|
-
nodeName(determineNodeName(_nodeName))
|
683
|
-
{
|
684
|
-
if (!serverAddress.empty()) {
|
685
|
-
connection = make_shared<AnalyticsLoggerConnection>(FileDescriptor());
|
686
|
-
}
|
687
|
-
if (isLocalSocketAddress(serverAddress)) {
|
688
|
-
maxConnectTries = 10;
|
689
|
-
} else {
|
690
|
-
maxConnectTries = 1;
|
691
|
-
}
|
692
|
-
reconnectTimeout = 1000000;
|
693
|
-
nextReconnectTime = 0;
|
694
|
-
}
|
695
|
-
|
696
|
-
template<typename T>
|
697
|
-
static bool instanceof(const std::exception &e) {
|
698
|
-
try {
|
699
|
-
(void) dynamic_cast<const T &>(e);
|
700
|
-
return true;
|
701
|
-
} catch (const bad_cast &) {
|
702
|
-
return false;
|
703
|
-
}
|
704
|
-
}
|
705
|
-
|
706
|
-
AnalyticsLogPtr newTransaction(const string &groupName,
|
707
|
-
const string &category = "requests",
|
708
|
-
const string &unionStationKey = string(),
|
709
|
-
const string &filters = string())
|
710
|
-
{
|
711
|
-
if (serverAddress.empty()) {
|
712
|
-
return make_shared<AnalyticsLog>();
|
713
|
-
}
|
714
|
-
|
715
|
-
unsigned long long timestamp = SystemTime::getUsec();
|
716
|
-
char txnId[
|
717
|
-
2 * sizeof(unsigned int) + // max hex timestamp size
|
718
|
-
11 + // space for a random identifier
|
719
|
-
1 // null terminator
|
720
|
-
];
|
721
|
-
char *end;
|
722
|
-
unsigned int timestampSize;
|
723
|
-
char timestampStr[2 * sizeof(unsigned long long) + 1];
|
724
|
-
|
725
|
-
// "[timestamp]"
|
726
|
-
// Our timestamp is like a Unix timestamp but with minutes
|
727
|
-
// resolution instead of seconds. 32 bits will last us for
|
728
|
-
// about 8000 years.
|
729
|
-
timestampSize = integerToHexatri<unsigned int>(timestamp / 1000000 / 60,
|
730
|
-
txnId);
|
731
|
-
end = txnId + timestampSize;
|
732
|
-
|
733
|
-
// "[timestamp]-"
|
734
|
-
*end = '-';
|
735
|
-
end++;
|
736
|
-
|
737
|
-
// "[timestamp]-[random id]"
|
738
|
-
randomGenerator.generateAsciiString(end, 11);
|
739
|
-
end += 11;
|
740
|
-
*end = '\0';
|
741
|
-
|
742
|
-
integerToHexatri<unsigned long long>(timestamp, timestampStr);
|
743
|
-
|
744
|
-
unique_lock<boost::mutex> l(lock);
|
745
|
-
if (SystemTime::getUsec() < nextReconnectTime) {
|
746
|
-
return make_shared<AnalyticsLog>();
|
747
|
-
}
|
748
|
-
ConnectionLock cl(connection);
|
749
|
-
|
750
|
-
if (!connected()) {
|
751
|
-
TRACE_POINT();
|
752
|
-
try {
|
753
|
-
connect();
|
754
|
-
cl.reset(connection);
|
755
|
-
} catch (const TimeoutException &) {
|
756
|
-
P_WARN("Timeout trying to connect to the logging agent at " << serverAddress << "; " <<
|
757
|
-
"will reconnect in " << reconnectTimeout / 1000000 << " second(s).");
|
758
|
-
nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
|
759
|
-
return make_shared<AnalyticsLog>();
|
760
|
-
} catch (const tracable_exception &e) {
|
761
|
-
nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
|
762
|
-
if (instanceof<IOException>(e) || instanceof<SystemException>(e)) {
|
763
|
-
P_WARN("Cannot connect to the logging agent at " << serverAddress <<
|
764
|
-
" (" << e.what() << "); will reconnect in " <<
|
765
|
-
reconnectTimeout / 1000000 << " second(s).");
|
766
|
-
return make_shared<AnalyticsLog>();
|
767
|
-
} else {
|
768
|
-
throw;
|
769
|
-
}
|
770
|
-
}
|
771
|
-
}
|
772
|
-
|
773
|
-
ScopeGuard guard(boost::bind(
|
774
|
-
&AnalyticsLoggerConnection::disconnect,
|
775
|
-
connection.get()));
|
776
|
-
try {
|
777
|
-
unsigned long long timeout = 15000000;
|
778
|
-
|
779
|
-
writeArrayMessage(connection->fd, &timeout,
|
780
|
-
"openTransaction",
|
781
|
-
txnId,
|
782
|
-
groupName.c_str(),
|
783
|
-
"",
|
784
|
-
category.c_str(),
|
785
|
-
timestampStr,
|
786
|
-
unionStationKey.c_str(),
|
787
|
-
"true",
|
788
|
-
"true",
|
789
|
-
filters.c_str(),
|
790
|
-
NULL);
|
791
|
-
|
792
|
-
vector<string> args;
|
793
|
-
if (!readArrayMessage(connection->fd, args, &timeout)) {
|
794
|
-
P_WARN("The logging agent at " << serverAddress <<
|
795
|
-
" closed the connection (no error message given);" <<
|
796
|
-
" will reconnect in " << reconnectTimeout / 1000000 <<
|
797
|
-
" second(s).");
|
798
|
-
nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
|
799
|
-
return make_shared<AnalyticsLog>();
|
800
|
-
} else if (args.size() == 2 && args[0] == "error") {
|
801
|
-
P_WARN("The logging agent at " << serverAddress <<
|
802
|
-
" closed the connection (error message: " << args[1] <<
|
803
|
-
"); will reconnect in " << reconnectTimeout / 1000000 <<
|
804
|
-
" second(s).");
|
805
|
-
nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
|
806
|
-
return make_shared<AnalyticsLog>();
|
807
|
-
} else if (args.empty() || args[0] != "ok") {
|
808
|
-
P_WARN("The logging agent at " << serverAddress <<
|
809
|
-
" sent an unexpected reply;" <<
|
810
|
-
" will reconnect in " << reconnectTimeout / 1000000 <<
|
811
|
-
" second(s).");
|
812
|
-
nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
|
813
|
-
return make_shared<AnalyticsLog>();
|
814
|
-
}
|
815
|
-
|
816
|
-
guard.clear();
|
817
|
-
return make_shared<AnalyticsLog>(connection,
|
818
|
-
string(txnId, end - txnId),
|
819
|
-
groupName, category,
|
820
|
-
unionStationKey);
|
821
|
-
|
822
|
-
} catch (const TimeoutException &) {
|
823
|
-
P_WARN("Timeout trying to communicate with the logging agent at " << serverAddress << "; " <<
|
824
|
-
"will reconnect in " << reconnectTimeout / 1000000 << " second(s).");
|
825
|
-
nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
|
826
|
-
return make_shared<AnalyticsLog>();
|
827
|
-
|
828
|
-
} catch (const SystemException &e) {
|
829
|
-
if (e.code() == ENOENT || isNetworkError(e.code())) {
|
830
|
-
string errorResponse;
|
831
|
-
|
832
|
-
guard.clear();
|
833
|
-
if (connection->disconnect(errorResponse)) {
|
834
|
-
P_WARN("The logging agent at " << serverAddress <<
|
835
|
-
" closed the connection (error message: " << errorResponse <<
|
836
|
-
"); will reconnect in " << reconnectTimeout / 1000000 <<
|
837
|
-
" second(s).");
|
838
|
-
} else {
|
839
|
-
P_WARN("The logging agent at " << serverAddress <<
|
840
|
-
" closed the connection (no error message given);" <<
|
841
|
-
" will reconnect in " << reconnectTimeout / 1000000 <<
|
842
|
-
" second(s).");
|
843
|
-
}
|
844
|
-
nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
|
845
|
-
return make_shared<AnalyticsLog>();
|
846
|
-
} else {
|
847
|
-
throw;
|
848
|
-
}
|
849
|
-
}
|
850
|
-
}
|
851
|
-
|
852
|
-
AnalyticsLogPtr continueTransaction(const string &txnId, const string &groupName,
|
853
|
-
const string &category = "requests", const string &unionStationKey = string())
|
854
|
-
{
|
855
|
-
if (serverAddress.empty() || txnId.empty()) {
|
856
|
-
return make_shared<AnalyticsLog>();
|
857
|
-
}
|
858
|
-
|
859
|
-
char timestampStr[2 * sizeof(unsigned long long) + 1];
|
860
|
-
integerToHexatri<unsigned long long>(SystemTime::getUsec(), timestampStr);
|
861
|
-
|
862
|
-
unique_lock<boost::mutex> l(lock);
|
863
|
-
if (SystemTime::getUsec() < nextReconnectTime) {
|
864
|
-
return make_shared<AnalyticsLog>();
|
865
|
-
}
|
866
|
-
ConnectionLock cl(connection);
|
867
|
-
|
868
|
-
if (!connected()) {
|
869
|
-
TRACE_POINT();
|
870
|
-
try {
|
871
|
-
connect();
|
872
|
-
cl.reset(connection);
|
873
|
-
} catch (const TimeoutException &) {
|
874
|
-
P_WARN("Timeout trying to connect to the logging agent at " << serverAddress << "; " <<
|
875
|
-
"will reconnect in " << reconnectTimeout / 1000000 << " second(s).");
|
876
|
-
nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
|
877
|
-
return make_shared<AnalyticsLog>();
|
878
|
-
} catch (const tracable_exception &e) {
|
879
|
-
nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
|
880
|
-
if (instanceof<IOException>(e) || instanceof<SystemException>(e)) {
|
881
|
-
P_WARN("Cannot connect to the logging agent at " << serverAddress <<
|
882
|
-
" (" << e.what() << "); will reconnect in " <<
|
883
|
-
reconnectTimeout / 1000000 << " second(s).");
|
884
|
-
return make_shared<AnalyticsLog>();
|
885
|
-
} else {
|
886
|
-
throw;
|
887
|
-
}
|
888
|
-
}
|
889
|
-
}
|
890
|
-
|
891
|
-
ScopeGuard guard(boost::bind(
|
892
|
-
&AnalyticsLoggerConnection::disconnect,
|
893
|
-
connection.get()));
|
894
|
-
try {
|
895
|
-
unsigned long long timeout = 15000000;
|
896
|
-
writeArrayMessage(connection->fd, &timeout,
|
897
|
-
"openTransaction",
|
898
|
-
txnId.c_str(),
|
899
|
-
groupName.c_str(),
|
900
|
-
"",
|
901
|
-
category.c_str(),
|
902
|
-
timestampStr,
|
903
|
-
unionStationKey.c_str(),
|
904
|
-
"true",
|
905
|
-
NULL);
|
906
|
-
guard.clear();
|
907
|
-
return make_shared<AnalyticsLog>(connection,
|
908
|
-
txnId, groupName, category,
|
909
|
-
unionStationKey);
|
910
|
-
|
911
|
-
} catch (const TimeoutException &) {
|
912
|
-
P_WARN("Timeout trying to communicate with the logging agent at " << serverAddress << "; " <<
|
913
|
-
"will reconnect in " << reconnectTimeout / 1000000 << " second(s).");
|
914
|
-
nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
|
915
|
-
return make_shared<AnalyticsLog>();
|
916
|
-
|
917
|
-
} catch (const SystemException &e) {
|
918
|
-
if (e.code() == ENOENT || isNetworkError(e.code())) {
|
919
|
-
string errorResponse;
|
920
|
-
|
921
|
-
guard.clear();
|
922
|
-
if (connection->disconnect(errorResponse)) {
|
923
|
-
P_WARN("The logging agent at " << serverAddress <<
|
924
|
-
" closed the connection (error message: " << errorResponse <<
|
925
|
-
"); will reconnect in " << reconnectTimeout / 1000000 <<
|
926
|
-
" second(s).");
|
927
|
-
} else {
|
928
|
-
P_WARN("The logging agent at " << serverAddress <<
|
929
|
-
" closed the connection (no error message given);" <<
|
930
|
-
" will reconnect in " << reconnectTimeout / 1000000 <<
|
931
|
-
" second(s).");
|
932
|
-
}
|
933
|
-
nextReconnectTime = SystemTime::getUsec() + reconnectTimeout;
|
934
|
-
return make_shared<AnalyticsLog>();
|
935
|
-
} else {
|
936
|
-
throw;
|
937
|
-
}
|
938
|
-
}
|
939
|
-
}
|
940
|
-
|
941
|
-
void setMaxConnectTries(unsigned int value) {
|
942
|
-
lock_guard<boost::mutex> l(lock);
|
943
|
-
maxConnectTries = value;
|
944
|
-
}
|
945
|
-
|
946
|
-
void setReconnectTimeout(unsigned long long usec) {
|
947
|
-
lock_guard<boost::mutex> l(lock);
|
948
|
-
reconnectTimeout = usec;
|
949
|
-
}
|
950
|
-
|
951
|
-
bool isNull() const {
|
952
|
-
return serverAddress.empty();
|
953
|
-
}
|
954
|
-
|
955
|
-
string getAddress() const {
|
956
|
-
return serverAddress;
|
957
|
-
}
|
958
|
-
|
959
|
-
string getUsername() const {
|
960
|
-
return username;
|
961
|
-
}
|
962
|
-
|
963
|
-
string getPassword() const {
|
964
|
-
return password;
|
965
|
-
}
|
966
|
-
|
967
|
-
FileDescriptor getConnection() const {
|
968
|
-
lock_guard<boost::mutex> l(lock);
|
969
|
-
lock_guard<boost::mutex> l2(connection->lock);
|
970
|
-
return connection->fd;
|
971
|
-
}
|
972
|
-
|
973
|
-
/**
|
974
|
-
* @post !result.empty()
|
975
|
-
*/
|
976
|
-
string getNodeName() const {
|
977
|
-
return nodeName;
|
978
182
|
}
|
979
183
|
};
|
980
184
|
|
981
|
-
|
185
|
+
/**
|
186
|
+
* Put this in code sections where you don't expect *any* exceptions to be thrown.
|
187
|
+
* This macro will automatically disables interruptions in the current scope,
|
188
|
+
* and will print an error message whenever the scope exits with an exception.
|
189
|
+
*
|
190
|
+
* When inside critical sections, you should put this macro right after the lock
|
191
|
+
* object so that the error message is displayed before unlocking the lock;
|
192
|
+
* otherwise other threads may run before the error message is displayed, and
|
193
|
+
* those threads may see an inconsistant state and crash.
|
194
|
+
*/
|
195
|
+
#define NOT_EXPECTING_EXCEPTIONS() NotExpectingExceptions __nee(__FILE__, __LINE__, __PRETTY_FUNCTION__)
|
982
196
|
|
983
197
|
} // namespace Passenger
|
984
198
|
|
985
199
|
#endif /* _PASSENGER_LOGGING_H_ */
|
986
|
-
|