[jira] [Comment Edited] (IGNITE-5208) C++ Segfault on Put

2017-05-15 Thread Igor Sapego (JIRA)

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

Igor Sapego edited comment on IGNITE-5208 at 5/15/17 4:30 PM:
--

[~tghosgor], thank you for report and for your help. I'm going to submit patch 
in few hours and hopefully it's going to be in master in few days. Your patch 
looks correct - you may use it as a fix for now.


was (Author: isapego):
[~tghosgor], thank you for report and for your help. I'm going to submit patch 
in few hours and hopefully it's going to be in master in few days. Your patch 
looks very right - you may use it as a fix for now.

> 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::operator()(int const&, int const&) 
> const+0x14
> C  [test+0x1106305]  std::_Rb_tree  >, std::_Select1st  > >, std::less, std::allocator  > > >::_M_lower_bound(std::_Rb_tree_node  > >*, std::_Rb_tree_node_base*, int const&)+0x41
> C  [test+0x1105a9d]  std::_Rb_tree  >, std::_Select1st  > >, std::less, std::allocator  > > >::find(int const&)+0x45
> C  [test+0x1104e7f]  std::map ignite::common::concurrent::SharedPointer,
>  std::less, std::allocator  > > >::find(int const&)+0x23
> C  [test+0x1104031]  
> ignite::impl::binary::BinaryTypeManager::GetHandler(std::__cxx11::basic_string  std::char_traits, std::allocator > const&, int)+0x6f
> C  [test+0xe6de2d]  void 
> ignite::impl::binary::BinaryWriterImpl::WriteTopObject  >(std::shared_ptr const&)+0xbb
> C  [test+0xe6cd48]  
> ignite::impl::In2Operation std::char_traits, std::allocator >, std::shared_ptr 
> >::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::char_traits, std::allocator >, std::shared_ptr 
> >::Put(std::__cxx11::basic_string std::allocator > const&, std::shared_ptr const&, 
> ignite::IgniteError&)+0x52
> {code}
> There seems to be some kind of race situation:
> {code:none}
> 0x01381206 in std::less::operator() (this=0x1a4e4b0, __x= reading variable>, __y=@0x7fff80846e04: 2066246303) at 
> /usr/include/c++/6.3.1/bits/stl_function.h:386
> {code}
> {code:none}
> #4  0x015040cd 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::iterator it = 
> snapshots0.find(typeId);
> (gdb) print snapshots0
> $10 = std::map with 42286576 elements = {[42312864] = {ptr = 0x285a4a0, impl 
> = 0x0}...}
> (gdb) print snapshot
> $11 = {ptr = 0x7fffda4f, impl = 0x11}
> {code}
> `impl` pointers seems to be corrupted on multiple places.



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


[jira] [Comment Edited] (IGNITE-5208) C++ Segfault on Put

2017-05-15 Thread JIRA

[ 
https://issues.apache.org/jira/browse/IGNITE-5208?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel=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.0 +0300
+++ /tmp/apache-ignite-2.0.0/binary/src/impl/binary/binary_type_manager.cpp 
2017-05-15 14:57:14.0 +0300
@@ -48,11 +48,11 @@
 
 SharedPointer 
BinaryTypeManager::GetHandler(const std::string& typeName, int32_t typeId)
 {
-std::map& snapshots0 = *snapshots.Get();
-
 { // Locking scope.
 CsLockGuard guard(cs);
 
+std::map& snapshots0 = *snapshots.Get();
+
 std::map::iterator it = 
snapshots0.find(typeId);
 if (it != snapshots0.end())
 return SharedPointer(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::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.0 +0300
+++ /tmp/apache-ignite-2.0.0/binary/src/impl/binary/binary_type_manager.cpp 
2017-05-15 14:57:14.0 +0300
@@ -48,11 +48,11 @@
 
 SharedPointer 
BinaryTypeManager::GetHandler(const std::string& typeName, int32_t typeId)
 {
-std::map& snapshots0 = *snapshots.Get();
-
 { // Locking scope.
 CsLockGuard guard(cs);
 
+std::map& snapshots0 = *snapshots.Get();
+
 std::map::iterator it = 
snapshots0.find(typeId);
 if (it != snapshots0.end())
 return SharedPointer(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::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