[SERVER-52668] logd on some vector<T> types result in a runtime assertion Created: 06/Nov/20  Updated: 29/Oct/23  Resolved: 05/Jan/21

Status: Closed
Project: Core Server
Component/s: Security
Affects Version/s: None
Fix Version/s: 4.9.0

Type: Bug Priority: Major - P3
Reporter: Daniel Gottlieb (Inactive) Assignee: Mark Benvenuto
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Backwards Compatibility: Fully Compatible
Operating System: ALL
Sprint: Security 2020-12-28, Security 2021-01-11
Participants:

 Description   

I imagine the problem may be more general than just vector. It plausibly includes any container that logv2 unwraps.

I added a logd line to print the contents of this vector<Privilege> which resulted in a crash. While Privilege contains a toBSON method that lets it be output on its own, it has no toString method.

I would have expected the code to not compile, or for the logging code to have found the toBSON method. Also acceptable would be for the program to crash right away when finding the val.toString method is not invocable.

As is, a std::bad_function_call gets thrown which can lose context if it tries to escape a noexcept function.

The stack trace from a breakpoint in constructing std::bad_function_call (apologies for the gdb prompts):

#1  std::__throw_bad_function_call () at ../../../../../src/combined/libstdc++-v3/src/c++11/functional.cc:34
34	../../../../../src/combined/libstdc++-v3/src/c++11/functional.cc: No such file or directory.
(gdb) 
#2  0x00007ffff640ec6c in std::function<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > ()>::operator()() const (this=0x7fffffff5940) at /opt/mongodbtoolchain/revisions/e5348beb43e147b74a40f4ca5fb05a330ea646cf/stow/gcc-v3.2dR/lib/gcc/x86_64-mongodb-linux/8.2.0/../../../../include/c++/8.2.0/bits/std_function.h:686
686		__throw_bad_function_call();
(gdb) 
#3  0x00007fffed7c64f4 in mongo::logv2::detail::SequenceContainerLogger<__gnu_cxx::__normal_iterator<mongo::Privilege const*, std::vector<mongo::Privilege, std::allocator<mongo::Privilege> > > >::serialize(fmt::v6::basic_memory_buffer<char, 500ul, std::allocator<char> >&) const::{lambda(auto:1&&)#1}::operator()<mongo::logv2::CustomAttributeValue>(mongo::logv2::CustomAttributeValue&&) const (this=0x7fffffff5960, val=...) at src/mongo/logv2/attribute_storage.h:410
410	                        fmt::format_to(buffer, "{}", val.toString());
(gdb) 
#4  0x00007fffed7c633a in mongo::logv2::detail::SequenceContainerLogger<__gnu_cxx::__normal_iterator<mongo::Privilege const*, std::vector<mongo::Privilege, std::allocator<mongo::Privilege> > > >::serialize (this=0x7fffffff59b8, buffer=warning: RTTI symbol not found for class 'fmt::v6::basic_memory_buffer<char, 500ul, std::allocator<char> >'
...) at src/mongo/logv2/attribute_storage.h:432
432	                append(mapValue(item));
(gdb) 
#5  0x00007fffed7c61be in mongo::logv2::detail::mapValue<std::vector<mongo::Privilege, std::allocator<mongo::Privilege> >, 0>(std::vector<mongo::Privilege, std::allocator<mongo::Privilege> > const&)::{lambda(fmt::v6::basic_memory_buffer<char, 500ul, std::allocator<char> >&)#1}::operator()(fmt::v6::basic_memory_buffer<char, 500ul, std::allocator<char> >&) const (this=0x7fffffff6a90, buffer=warning: RTTI symbol not found for class 'fmt::v6::basic_memory_buffer<char, 500ul, std::allocator<char> >'
...) at src/mongo/logv2/attribute_storage.h:275
275	    custom.stringSerialize = [&val](fmt::memory_buffer& buffer) { seqLog(val).serialize(buffer); };
(gdb) 
#6  0x00007fffed7c6052 in std::_Function_handler<void (fmt::v6::basic_memory_buffer<char, 500ul, std::allocator<char> >&), mongo::logv2::detail::mapValue<std::vector<mongo::Privilege, std::allocator<mongo::Privilege> >, 0>(std::vector<mongo::Privilege, std::allocator<mongo::Privilege> > const&)::{lambda(fmt::v6::basic_memory_buffer<char, 500ul, std::allocator<char> >&)#1}>::_M_invoke(std::_Any_data const&, fmt::v6::basic_memory_buffer<char, 500ul, std::allocator<char> >&) (__functor=..., __args=warning: RTTI symbol not found for class 'fmt::v6::basic_memory_buffer<char, 500ul, std::allocator<char> >'
...) at /opt/mongodbtoolchain/revisions/e5348beb43e147b74a40f4ca5fb05a330ea646cf/stow/gcc-v3.2dR/lib/gcc/x86_64-mongodb-linux/8.2.0/../../../../include/c++/8.2.0/bits/std_function.h:297
297		(*_Base::_M_get_pointer(__functor))(
(gdb) 
#7  0x00007ffff640ea48 in std::function<void (fmt::v6::basic_memory_buffer<char, 500ul, std::allocator<char> >&)>::operator()(fmt::v6::basic_memory_buffer<char, 500ul, std::allocator<char> >&) const (this=0x7fffffff6a90, __args=warning: RTTI symbol not found for class 'fmt::v6::basic_memory_buffer<char, 500ul, std::allocator<char> >'
...) at /opt/mongodbtoolchain/revisions/e5348beb43e147b74a40f4ca5fb05a330ea646cf/stow/gcc-v3.2dR/lib/gcc/x86_64-mongodb-linux/8.2.0/../../../../include/c++/8.2.0/bits/std_function.h:687
687	      return _M_invoker(_M_functor, std::forward<_ArgTypes>(__args)...);
(gdb) 
#8  0x00007fffe6c21843 in mongo::logv2::detail::UnstructuredValueExtractor::operator() (this=0x7fffffff66b0, name="dummy00", val=...) at src/mongo/logv2/log_detail.cpp:51
51	            val.stringSerialize(buffer);
(gdb) 
#9  0x00007fffe6c2176d in mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}::operator()<mongo::logv2::CustomAttributeValue const&>(mongo::logv2::detail::UnstructuredValueExtractor&) const (this=0x7fffffff6510, val=...) at src/mongo/logv2/attribute_storage.h:712
712	            stdx::visit([name, &f](auto&& val) { f(name, val); }, attr.value);
(gdb) 
#10 0x00007fffe6c21722 in mpark::lib::cpp17::detail::invoke<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}, mongo::logv2::CustomAttributeValue const&> (f=..., args=...) at src/third_party/variant-1.4.0/include/mpark/lib.hpp:300
300	          MPARK_RETURN(lib::forward<F>(f)(lib::forward<Args>(args)...))
(gdb) 
#11 0x00007fffe6c216e2 in mpark::lib::cpp17::invoke<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}, mongo::logv2::CustomAttributeValue const&> (f=..., args=...) at src/third_party/variant-1.4.0/include/mpark/lib.hpp:308
308	        MPARK_RETURN(detail::invoke(lib::forward<F>(f),
(gdb) 
#12 0x00007fffe6c216a2 in mpark::detail::visitation::variant::visit_exhaustiveness_check<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}, mongo::logv2::CustomAttributeValue const&>::invoke({lambda(mongo::logv2::detail::NamedAttribute const&)#1}&&, mongo::logv2::CustomAttributeValue) (visitor=..., values=...) at src/third_party/variant-1.4.0/include/mpark/variant.hpp:909
909	            DECLTYPE_AUTO_RETURN(lib::invoke(lib::forward<Visitor>(visitor),
(gdb) 
#13 0x00007fffe6c21665 in mpark::detail::visitation::variant::value_visitor<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}>::operator()<mpark::detail::alt<16ul, mongo::logv2::CustomAttributeValue> const&>(mpark::detail::alt<16ul, mongo::logv2::CustomAttributeValue> const&) const (this=0x7fffffff6490, alts=...) at src/third_party/variant-1.4.0/include/mpark/variant.hpp:919
919	            DECLTYPE_AUTO_RETURN(
(gdb) 
#14 0x00007fffe6c21622 in mpark::lib::cpp17::detail::invoke<mpark::detail::visitation::variant::value_visitor<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}>, mpark::detail::alt<16ul, mongo::logv2::CustomAttributeValue> const&> (f=..., args=...) at src/third_party/variant-1.4.0/include/mpark/lib.hpp:300
300	          MPARK_RETURN(lib::forward<F>(f)(lib::forward<Args>(args)...))
(gdb) 
#15 0x00007fffe6c215e2 in mpark::lib::cpp17::invoke<mpark::detail::visitation::variant::value_visitor<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}>, mpark::detail::alt<16ul, mongo::logv2::CustomAttributeValue> const&> (f=..., args=...) at src/third_party/variant-1.4.0/include/mpark/lib.hpp:308
308	        MPARK_RETURN(detail::invoke(lib::forward<F>(f),
(gdb) 
#16 0x00007fffe6c215a2 in mpark::detail::visitation::base::visit_return_type_check<void, void>::invoke<mpark::detail::visitation::variant::value_visitor<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}>, mpark::detail::alt<16ul, mongo::logv2::CustomAttributeValue> const&>(mongo::logv2::detail::UnstructuredValueExtractor&, mpark::detail::alt<16ul, mongo::logv2::CustomAttributeValue> const&) (visitor=..., alts=...) at src/third_party/variant-1.4.0/include/mpark/variant.hpp:524
524	            DECLTYPE_AUTO_RETURN(lib::invoke(lib::forward<Visitor>(visitor),
(gdb) 
#17 0x00007fffe6c1c78d in mpark::detail::visitation::base::dispatcher<true, void, mpark::lib::indexed_type<16ul, mpark::detail::base<(mpark::detail::Trait)1, int, unsigned int, long long, unsigned long long, bool, double, mongo::StringData, mongo::Duration<std::ratio<1l, 1000000000l> >, mongo::Duration<std::ratio<1l, 1000000l> >, mongo::Duration<std::ratio<1l, 1000l> >, mongo::Duration<std::ratio<1l, 1l> >, mongo::Duration<std::ratio<60l, 1l> >, mongo::Duration<std::ratio<3600l, 1l> >, mongo::Duration<std::ratio<86400l, 1l> >, mongo::BSONObj, mongo::BSONArray, mongo::logv2::CustomAttributeValue> const&> >::dispatch<0ul, mpark::detail::visitation::variant::value_visitor<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}> >(mpark::detail::visitation::variant::value_visitor<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}>&&, mpark::detail::base<(mpark::detail::Trait)1, int, unsigned int, long long, unsigned long long, bool, double, mongo::StringData, mongo::Duration<std::ratio<1l, 1000000000l> >, mongo::Duration<std::ratio<1l, 1000000l> >, mongo::Duration<std::ratio<1l, 1000l> >, mongo::Duration<std::ratio<1l, 1l> >, mongo::Duration<std::ratio<60l, 1l> >, mongo::Duration<std::ratio<3600l, 1l> >, mongo::Duration<std::ratio<86400l, 1l> >, mongo::BSONObj, mongo::BSONArray, mongo::logv2::CustomAttributeValue> const&) (f=..., visited_vs=...) at src/third_party/variant-1.4.0/include/mpark/variant.hpp:563
563	            return visit_return_type_check<Expected, Actual>::invoke(
(gdb) 
#18 mpark::detail::visitation::base::dispatcher<true, void>::dispatch<0ul, mpark::detail::visitation::variant::value_visitor<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}>, mpark::detail::base<(mpark::detail::Trait)1, int, unsigned int, long long, unsigned long long, bool, double, mongo::StringData, mongo::Duration<std::ratio<1l, 1000000000l> >, mpark::detail::Trait<mongo::StringData<1l, 1000000l> >, mpark::detail::Trait<mongo::StringData<1l, 1000l> >, mpark::detail::Trait<mongo::StringData<1l, 1l> >, mpark::detail::Trait<mongo::StringData<60l, 1l> >, mpark::detail::Trait<mongo::StringData<3600l, 1l> >, mpark::detail::Trait<mongo::StringData<86400l, 1l> >, mongo::BSONObj, mongo::BSONArray, mongo::logv2::CustomAttributeValue> const&>(mpark::detail::visitation::variant::value_visitor<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}>&&, mpark::detail::base<(mpark::detail::Trait)1, int, unsigned int, long long, unsigned long long, bool, double, mongo::StringData, mongo::Duration<std::ratio<1l, 1000000000l> >, mpark::detail::Trait<mongo::StringData<1l, 1000000l> >, mpark::detail::Trait<mongo::StringData<1l, 1000l> >, mpark::detail::Trait<mongo::StringData<1l, 1l> >, mpark::detail::Trait<mongo::StringData<60l, 1l> >, mpark::detail::Trait<mongo::StringData<3600l, 1l> >, mpark::detail::Trait<mongo::StringData<86400l, 1l> >, mongo::BSONObj, mongo::BSONArray, mongo::logv2::CustomAttributeValue> const&) (f=..., v=...) at src/third_party/variant-1.4.0/include/mpark/variant.hpp:606
606	              case B + 16: return MPARK_DISPATCH(B + 16);
(gdb) 
#19 mpark::detail::visitation::alt::visit_alt<mpark::detail::visitation::variant::value_visitor<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}>, mpark::detail::impl<int, unsigned int, long long, unsigned long long, bool, double, mongo::StringData, mongo::Duration<std::ratio<1l, 1000000000l> >, mpark::detail::impl<mongo::StringData<1l, 1000000l> >, mpark::detail::impl<mongo::StringData<1l, 1000l> >, mpark::detail::impl<mongo::StringData<1l, 1l> >, mpark::detail::impl<mongo::StringData<60l, 1l> >, mpark::detail::impl<mongo::StringData<3600l, 1l> >, mpark::detail::impl<mongo::StringData<86400l, 1l> >, mongo::BSONObj, mongo::BSONArray, mongo::logv2::CustomAttributeValue> const&>(mongo::logv2::detail::UnstructuredValueExtractor&, mpark::detail::impl<int, unsigned int, long long, unsigned long long, bool, double, mongo::StringData, mongo::Duration<std::ratio<1l, 1000000000l> >, mpark::detail::impl<mongo::StringData<1l, 1000000l> >, mpark::detail::impl<mongo::StringData<1l, 1000l> >, mpark::detail::impl<mongo::StringData<1l, 1l> >, mpark::detail::impl<mongo::StringData<60l, 1l> >, mpark::detail::impl<mongo::StringData<3600l, 1l> >, mpark::detail::impl<mongo::StringData<86400l, 1l> >, mongo::BSONObj, mongo::BSONArray, mongo::logv2::CustomAttributeValue> const&) (visitor=..., vs=...) at src/third_party/variant-1.4.0/include/mpark/variant.hpp:841
841	          DECLTYPE_AUTO_RETURN(
(gdb) 
#20 0x00007fffe6c1bf62 in mpark::detail::visitation::variant::visit_alt<mpark::detail::visitation::variant::value_visitor<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}>, mpark::variant<int, unsigned int, long long, unsigned long long, bool, double, mongo::StringData, mongo::Duration<std::ratio<1l, 1000000000l> >, mpark::variant<mongo::StringData<1l, 1000000l> >, mpark::variant<mongo::StringData<1l, 1000l> >, mpark::variant<mongo::StringData<1l, 1l> >, mpark::variant<mongo::StringData<60l, 1l> >, mpark::variant<mongo::StringData<3600l, 1l> >, mpark::variant<mongo::StringData<86400l, 1l> >, mongo::BSONObj, mongo::BSONArray, mongo::logv2::CustomAttributeValue> const&>(mongo::logv2::detail::UnstructuredValueExtractor&, mpark::variant<int, unsigned int, long long, unsigned long long, bool, double, mongo::StringData, mongo::Duration<std::ratio<1l, 1000000000l> >, mpark::variant<mongo::StringData<1l, 1000000l> >, mpark::variant<mongo::StringData<1l, 1000l> >, mpark::variant<mongo::StringData<1l, 1l> >, mpark::variant<mongo::StringData<60l, 1l> >, mpark::variant<mongo::StringData<3600l, 1l> >, mpark::variant<mongo::StringData<86400l, 1l> >, mongo::BSONObj, mongo::BSONArray, mongo::logv2::CustomAttributeValue> const&) (visitor=..., vs=...) at src/third_party/variant-1.4.0/include/mpark/variant.hpp:935
935	          DECLTYPE_AUTO_RETURN(alt::visit_alt(lib::forward<Visitor>(visitor),
(gdb) 
#21 0x00007fffe6c1bef7 in mpark::detail::visitation::variant::visit_value<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}, mpark::variant<int, unsigned int, long long, unsigned long long, bool, double, mongo::StringData, mongo::Duration<std::ratio<1l, 1000000000l> >, mpark::variant<mongo::StringData<1l, 1000000l> >, mpark::variant<mongo::StringData<1l, 1000l> >, mpark::variant<mongo::StringData<1l, 1l> >, mpark::variant<mongo::StringData<60l, 1l> >, mpark::variant<mongo::StringData<3600l, 1l> >, mpark::variant<mongo::StringData<86400l, 1l> >, mongo::BSONObj, mongo::BSONArray, mongo::logv2::CustomAttributeValue> const&>(mongo::logv2::detail::UnstructuredValueExtractor&, mpark::variant<int, unsigned int, long long, unsigned long long, bool, double, mongo::StringData, mongo::Duration<std::ratio<1l, 1000000000l> >, mpark::variant<mongo::StringData<1l, 1000000l> >, mpark::variant<mongo::StringData<1l, 1000l> >, mpark::variant<mongo::StringData<1l, 1l> >, mpark::variant<mongo::StringData<60l, 1l> >, mpark::variant<mongo::StringData<3600l, 1l> >, mpark::variant<mongo::StringData<86400l, 1l> >, mongo::BSONObj, mongo::BSONArray, mongo::logv2::CustomAttributeValue> const&) (visitor=..., vs=...) at src/third_party/variant-1.4.0/include/mpark/variant.hpp:950
950	          DECLTYPE_AUTO_RETURN(
(gdb) 
#22 0x00007fffe6c1be83 in mpark::visit<mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const::{lambda(auto:1&&)#1}, mpark::variant<int, unsigned int, long long, unsigned long long, bool, double, mongo::StringData, mongo::Duration<std::ratio<1l, 1000000000l> >, mpark::variant<mongo::StringData<1l, 1000000l> >, mpark::variant<mongo::StringData<1l, 1000l> >, mpark::variant<mongo::StringData<1l, 1l> >, mpark::variant<mongo::StringData<60l, 1l> >, mpark::variant<mongo::StringData<3600l, 1l> >, mpark::variant<mongo::StringData<86400l, 1l> >, mongo::BSONObj, mongo::BSONArray, mongo::logv2::CustomAttributeValue> const&>(mongo::logv2::detail::UnstructuredValueExtractor&, mpark::variant<int, unsigned int, long long, unsigned long long, bool, double, mongo::StringData, mongo::Duration<std::ratio<1l, 1000000000l> >, mpark::variant<mongo::StringData<1l, 1000000l> >, mpark::variant<mongo::StringData<1l, 1000l> >, mpark::variant<mongo::StringData<1l, 1l> >, mpark::variant<mongo::StringData<60l, 1l> >, mpark::variant<mongo::StringData<3600l, 1l> >, mpark::variant<mongo::StringData<86400l, 1l> >, mongo::BSONObj, mongo::BSONArray, mongo::logv2::CustomAttributeValue> const&) (visitor=..., vs=...) at src/third_party/variant-1.4.0/include/mpark/variant.hpp:2011
2011	           detail::visitation::variant::visit_value(
(gdb) 
#23 0x00007fffe6c1bddf in mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}::operator()(mongo::logv2::detail::NamedAttribute const&) const (this=0x7fffffff6578, attr=...) at src/mongo/logv2/attribute_storage.h:712
712	            stdx::visit([name, &f](auto&& val) { f(name, val); }, attr.value);
(gdb) 
#24 0x00007fffe6c1bd3c in std::for_each<mongo::logv2::detail::NamedAttribute const*, mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}>(mongo::logv2::detail::NamedAttribute const*, mongo::logv2::detail::NamedAttribute const*, mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&>(mongo::logv2::detail::UnstructuredValueExtractor&) const::{lambda(mongo::logv2::detail::NamedAttribute const&)#1}) (__first=0x7fffffff6a20, __last=0x7fffffff6ad8, __f=...) at /opt/mongodbtoolchain/revisions/e5348beb43e147b74a40f4ca5fb05a330ea646cf/stow/gcc-v3.2dR/lib/gcc/x86_64-mongodb-linux/8.2.0/../../../../include/c++/8.2.0/bits/stl_algo.h:3882
3882		__f(*__first);
(gdb) 
#25 0x00007fffe6c170b9 in mongo::logv2::TypeErasedAttributeStorage::apply<mongo::logv2::detail::UnstructuredValueExtractor&> (this=0x7fffffff6970, f=...) at src/mongo/logv2/attribute_storage.h:710
710	        std::for_each(_data, _data + _size, [&f](const detail::NamedAttribute& attr) {
(gdb) 
#26 0x00007fffe6c16054 in mongo::logv2::detail::doUnstructuredLogImpl (severity=..., options=..., message="Aggregate privileges: {}", attrs=...) at src/mongo/logv2/log_detail.cpp:173
173	    attrs.apply(extractor);
(gdb) 
#27 0x00007fffed7c3cd5 in mongo::logv2::logd_detail::logd<0ul, std::vector<mongo::Privilege, std::allocator<mongo::Privilege> > > (message="Aggregate privileges: {}", args=std::vector of length 2, capacity 2 = {...}) at src/mongo/logv2/log_debug.h:54
54	    detail::doUnstructuredLogImpl(LogSeverity::Log(),  // NOLINT
(gdb) 
#28 0x00007fffed7b3e1a in mongo::logd<std::vector<mongo::Privilege, std::allocator<mongo::Privilege> > > (message="Aggregate privileges: {}", args=std::vector of length 2, capacity 2 = {...}) at src/mongo/logv2/log_debug.h:69
69	    logv2::logd_detail::logd(std::index_sequence_for<Args...>{}, message, args...);  // NOLINT
(gdb) 
#29 0x00007fffdc67ab9d in mongo::runAggregate (opCtx=0x7fffd6c1da60, origNss=..., request=..., liteParsedPipeline=..., cmdObj=owned BSONObj 2771 bytes @ 0x7fffd4eb923d = {...}, privileges=std::vector of length 2, capacity 2 = {...}, result=0x7fffd6ab6fa0) at src/mongo/db/commands/run_aggregate.cpp:496
496	    logd("Aggregate privileges: {}", privileges);



 Comments   
Comment by Ian Whalen (Inactive) [ 07/Jan/21 ]

Author:

{'username': u'evrg-bot-webhook', 'name': u'Mark Benvenuto', 'email': u'mark.benvenuto@mongodb.com'}

Message:SERVER-52668 Add support for vector and map BSON objects to logd
Branch:master
https://github.com/mongodb/mongo/commit/e2f5ada302c5541dc7af96391583e327820a5f5e

Comment by Mark Benvenuto [ 05/Jan/21 ]

Commit: https://github.com/mongodb/mongo/commit/e2f5ada302c5541dc7af96391583e327820a5f5e

Comment by Henrik Edin [ 09/Nov/20 ]

Most likely just logd as it prefers text formatting over json. You probaly need to implement string serialize for the container formatter to go via toBSON when toString is not available. Please add me as reviewer.

Comment by Billy Donahue [ 06/Nov/20 ]

Would be good to know if this affects LOGV2 statements or just logd.

Generated at Thu Feb 08 05:28:40 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.