ignite-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Tolga HOŞGÖR (JIRA) <j...@apache.org>
Subject [jira] [Comment Edited] (IGNITE-5208) C++ Segfault on Put
Date Mon, 15 May 2017 15:57:04 GMT

    [ 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 edited comment on IGNITE-5208 at 5/15/17 3:56 PM:
---------------------------------------------------------------

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}

The problem was that shared pointer's data was deleted whilst a reference to it was obtained
outside the lock. Converting the reference to an actual copy of shared pointer can also solve
the issue but in my tests lock seems to protect the shared pointer anyway so far.

I am not sure about the lock I added in `GetMeta` is really needed though.


was (Author: tghosgor):
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)

Mime
View raw message