[ 
https://issues.apache.org/jira/browse/IGNITE-5208?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16010740#comment-16010740
 ] 

Tolga HOŞGÖR commented on IGNITE-5208:
--------------------------------------

This seemed to solve it for me:
{code:none}
diff -Naur "/tmp/apache-ignite-2.0.0 
(original)/binary/src/impl/binary/binary_type_manager.cpp" 
/tmp/apache-ignite-2.0.0/binary/src/impl/binary/binary_type_manager.cpp
--- "/tmp/apache-ignite-2.0.0 
(original)/binary/src/impl/binary/binary_type_manager.cpp"        2017-04-30 
12:27:20.000000000 +0300
+++ /tmp/apache-ignite-2.0.0/binary/src/impl/binary/binary_type_manager.cpp     
2017-05-15 14:57:14.000000000 +0300
@@ -48,11 +48,11 @@
 
             SharedPointer<BinaryTypeHandler> 
BinaryTypeManager::GetHandler(const std::string& typeName, int32_t typeId)
             {
-                std::map<int32_t, SPSnap>& snapshots0 = *snapshots.Get();
-
                 { // Locking scope.
                     CsLockGuard guard(cs);
 
+                    std::map<int32_t, SPSnap>& snapshots0 = *snapshots.Get();
+
                     std::map<int32_t, SPSnap>::iterator it = 
snapshots0.find(typeId);
                     if (it != snapshots0.end())
                         return SharedPointer<BinaryTypeHandler>(new 
BinaryTypeHandler(it->second));
@@ -65,7 +65,7 @@
 
             void BinaryTypeManager::SubmitHandler(BinaryTypeHandler& hnd)
             {
-                // If this is the very first write of a class or difference 
exists, 
+                // If this is the very first write of a class or difference 
exists,
                 // we need to enqueue it for write.
                 if (hnd.HasUpdate())
                 {
@@ -152,6 +152,8 @@
 
             SPSnap BinaryTypeManager::GetMeta(int32_t typeId)
             {
+                CsLockGuard guard(cs);
+
                 std::map<int32_t, SPSnap>::iterator it = 
snapshots.Get()->find(typeId);
 
                 if (it != snapshots.Get()->end() && it->second.Get())
@@ -175,4 +177,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
{code}

I am not sure about the lock in `GetMeta` though.

> C++ Segfault on Put
> -------------------
>
>                 Key: IGNITE-5208
>                 URL: https://issues.apache.org/jira/browse/IGNITE-5208
>             Project: Ignite
>          Issue Type: Bug
>          Components: platforms
>    Affects Versions: 2.0
>            Reporter: Tolga HOŞGÖR
>            Assignee: Igor Sapego
>            Priority: Critical
>              Labels: c++
>             Fix For: 2.1
>
>
> The following segfault happens when:
>   - using multiple caches (suffixed with number as in X_\{number\}),
>   - caches contain same type of object but not the same objects,
>   - doing multithreaded `::Put` operation, only one put is done on each cache 
> concurrently, independent caches (X_1, X_2, ...) can be operated on and 
> called `::Put` on concurrently, but that should not be relevant as cache api 
> is thread safe.
> {code:none}
> C  [test+0xf8116a]  std::less<int>::operator()(int const&, int const&) 
> const+0x14
> C  [test+0x1106305]  std::_Rb_tree<int, std::pair<int const, 
> ignite::common::concurrent::SharedPointer<ignite::impl::binary::BinaryTypeSnapshot>
>  >, std::_Select1st<std::pair<int const, 
> ignite::common::concurrent::SharedPointer<ignite::impl::binary::BinaryTypeSnapshot>
>  > >, std::less<int>, std::allocator<std::pair<int const, 
> ignite::common::concurrent::SharedPointer<ignite::impl::binary::BinaryTypeSnapshot>
>  > > >::_M_lower_bound(std::_Rb_tree_node<std::pair<int const, 
> ignite::common::concurrent::SharedPointer<ignite::impl::binary::BinaryTypeSnapshot>
>  > >*, std::_Rb_tree_node_base*, int const&)+0x41
> C  [test+0x1105a9d]  std::_Rb_tree<int, std::pair<int const, 
> ignite::common::concurrent::SharedPointer<ignite::impl::binary::BinaryTypeSnapshot>
>  >, std::_Select1st<std::pair<int const, 
> ignite::common::concurrent::SharedPointer<ignite::impl::binary::BinaryTypeSnapshot>
>  > >, std::less<int>, std::allocator<std::pair<int const, 
> ignite::common::concurrent::SharedPointer<ignite::impl::binary::BinaryTypeSnapshot>
>  > > >::find(int const&)+0x45
> C  [test+0x1104e7f]  std::map<int, 
> ignite::common::concurrent::SharedPointer<ignite::impl::binary::BinaryTypeSnapshot>,
>  std::less<int>, std::allocator<std::pair<int const, 
> ignite::common::concurrent::SharedPointer<ignite::impl::binary::BinaryTypeSnapshot>
>  > > >::find(int const&)+0x23
> C  [test+0x1104031]  
> ignite::impl::binary::BinaryTypeManager::GetHandler(std::__cxx11::basic_string<char,
>  std::char_traits<char>, std::allocator<char> > const&, int)+0x6f
> C  [test+0xe6de2d]  void 
> ignite::impl::binary::BinaryWriterImpl::WriteTopObject<std::shared_ptr<test::data>
>  >(std::shared_ptr<test::data> const&)+0xbb
> C  [test+0xe6cd48]  
> ignite::impl::In2Operation<std::__cxx11::basic_string<char, 
> std::char_traits<char>, std::allocator<char> >, std::shared_ptr<test::data> 
> >::ProcessInput(ignite::impl::binary::BinaryWriterImpl&)+0x3e
> C  [test+0x1128cf1]  
> ignite::impl::interop::InteropTarget::WriteTo(ignite::impl::interop::InteropMemory*,
>  ignite::impl::InputOperation&, ignite::IgniteError&)+0xa9
> C  [test+0x1128f67]  ignite::impl::interop::InteropTarget::OutOp(int, 
> ignite::impl::InputOperation&, ignite::IgniteError&)+0x65
> C  [test+0x1125f41]  
> ignite::impl::cache::CacheImpl::Put(ignite::impl::InputOperation&, 
> ignite::IgniteError&)+0x2d
> C  [test+0xe5539a]  ignite::cache::Cache<std::__cxx11::basic_string<char, 
> std::char_traits<char>, std::allocator<char> >, std::shared_ptr<test::data> 
> >::Put(std::__cxx11::basic_string<char, std::char_traits<char>, 
> std::allocator<char> > const&, std::shared_ptr<test::data> const&, 
> ignite::IgniteError&)+0x52
> {code}
> There seems to be some kind of race situation:
> {code:none}
> 0x0000000001381206 in std::less<int>::operator() (this=0x1a4e4b0, __x=<error 
> reading variable>, __y=@0x7fff80846e04: 2066246303) at 
> /usr/include/c++/6.3.1/bits/stl_function.h:386
> {code}
> {code:none}
> #4  0x00000000015040cd in ignite::impl::binary::BinaryTypeManager::GetHandler 
> (this=0x1a560d0, typeName="test.data", typeId=2066246303) at 
> src/impl/binary/binary_type_manager.cpp:56
> 56                          std::map<int32_t, SPSnap>::iterator it = 
> snapshots0.find(typeId);
> (gdb) print snapshots0
> $10 = std::map with 42286576 elements = {[42312864] = {ptr = 0x285a4a0, impl 
> = 0x0}<error reading variable: Cannot access memory at address 0x110>...}
> (gdb) print snapshot
> $11 = {ptr = 0x7fffffffda4f, impl = 0x11}
> {code}
> `impl` pointers seems to be corrupted on multiple places.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to