Commit 578bd8ce authored by Georgios Bitzes's avatar Georgios Bitzes

FUSEX: Prevent unsynchronized access to ChunkMap, add missing read lock

WARNING: ThreadSanitizer: data race (pid=27564) Write of size 8 at 0x7b6c000464d8 by thread T3 (mutexes: write M69597): #0 std::_Rb_tree<unsigned long, std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> >, std::_Select1st<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > >, std::less<unsigned long>, std::allocator<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > > >::_M_erase_aux(std::_Rb_tree_const_iterator<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > >) /usr/include/c++/7/bits/stl_tree.h:2478 (eosxd+0x0000006f35a6) #1 std::_Rb_tree<unsigned long, std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> >, std::_Select1st<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > >, std::less<unsigned long>, std::allocator<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > > >::_M_erase_aux(std::_Rb_tree_const_iterator<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > >, std::_Rb_tree_const_iterator<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > >) /usr/include/c++/7/bits/stl_tree.h:2491 (eosxd+0x0000006f35a6) #2 std::_Rb_tree<unsigned long, std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> >, std::_Select1st<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > >, std::less<unsigned long>, std::allocator<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > > >::erase(unsigned long const&) /usr/include/c++/7/bits/stl_tree.h:2502 (eosxd+0x0000006f35a6) #3 std::map<unsigned long, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler>, std::less<unsigned long>, std::allocator<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > > >::erase(unsigned long const&) /usr/include/c++/7/bits/stl_map.h:1063 (eosxd+0x0000006ef7cf) #4 XrdCl::Proxy::WriteAsyncHandler::HandleResponse(XrdCl::XRootDStatus*, XrdCl::AnyObject*) /afs/cern.ch/user/g/gbitzes/dev/eos-dev/fusex/data/xrdclproxy.cc:799 (eosxd+0x0000006ef7cf) #5 XrdCl::ResponseHandler::HandleResponseWithHosts(XrdCl::XRootDStatus*, XrdCl::AnyObject*, std::vector<XrdCl::HostInfo, std::allocator<XrdCl::HostInfo> >*) /usr/include/xrootd/XrdCl/XrdClXRootDResponses.hh:852 (eosxd+0x0000006e3f05) #6 <null> <null> (libXrdCl.so.2+0x0000000d03f7) #7 XrdCl::XRootDMsgHandler::HandleResponse() <null> (libXrdCl.so.2+0x000000098b19) #8 XrdCl::XRootDMsgHandler::Process(XrdCl::Message*) <null> (libXrdCl.so.2+0x00000009d3a1) #9 XrdCl::Stream::HandleIncMsgJob::Run(void*) <null> (libXrdCl.so.2+0x00000006d5ff) #10 XrdCl::JobManager::RunJobs() <null> (libXrdCl.so.2+0x00000011f67f) #11 <null> <null> (libXrdCl.so.2+0x00000011f775) #12 <null> <null> (libtsan.so.0+0x0000000257eb) Previous read of size 8 at 0x7b6c000464d8 by thread T4: #0 std::map<unsigned long, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler>, std::less<unsigned long>, std::allocator<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > > >::size() const /usr/include/c++/7/bits/stl_map.h:463 (eosxd+0x0000006ef4bb) #1 XrdCl::Proxy::WriteAsyncHandler::HandleResponse(XrdCl::XRootDStatus*, XrdCl::AnyObject*) /afs/cern.ch/user/g/gbitzes/dev/eos-dev/fusex/data/xrdclproxy.cc:782 (eosxd+0x0000006ef4bb) #2 XrdCl::ResponseHandler::HandleResponseWithHosts(XrdCl::XRootDStatus*, XrdCl::AnyObject*, std::vector<XrdCl::HostInfo, std::allocator<XrdCl::HostInfo> >*) /usr/include/xrootd/XrdCl/XrdClXRootDResponses.hh:852 (eosxd+0x0000006e3f05) #3 <null> <null> (libXrdCl.so.2+0x0000000d03f7) #4 XrdCl::XRootDMsgHandler::HandleResponse() <null> (libXrdCl.so.2+0x000000098b19) #5 XrdCl::XRootDMsgHandler::Process(XrdCl::Message*) <null> (libXrdCl.so.2+0x00000009d3a1) #6 XrdCl::Stream::HandleIncMsgJob::Run(void*) <null> (libXrdCl.so.2+0x00000006d5ff) #7 XrdCl::JobManager::RunJobs() <null> (libXrdCl.so.2+0x00000011f67f) #8 <null> <null> (libXrdCl.so.2+0x00000011f775) #9 <null> <null> (libtsan.so.0+0x0000000257eb) Location is heap block of size 1712 at 0x7b6c00046000 allocated by thread T27: #0 operator new(unsigned long) <null> (libtsan.so.0+0x00000006f766) #1 data::datax::attach(fuse_req*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int) /afs/cern.ch/user/g/gbitzes/dev/eos-dev/fusex/data/data.cc:577 (eosxd+0x0000006a656e) #2 EosFuse::create(fuse_req*, unsigned long, char const*, unsigned int, fuse_file_info*) /afs/cern.ch/user/g/gbitzes/dev/eos-dev/fusex/eosfuse.cc:3410 (eosxd+0x0000005fa699) #3 <null> <null> (libfuse.so.2+0x0000000151a6) Mutex M69597 (0x7b6c00046410) created at: #0 pthread_mutex_init <null> (libtsan.so.0+0x00000002971e) #1 XrdSysCondVar::XrdSysCondVar(int, char const*) /usr/include/xrootd/XrdSys/XrdSysPthread.hh:78 (eosxd+0x0000006b12b6) #2 XrdCl::Proxy::Proxy() /afs/cern.ch/user/g/gbitzes/dev/eos-dev/fusex/./data/xrdclproxy.hh:546 (eosxd+0x0000006b12b6) #3 data::datax::attach(fuse_req*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int) /afs/cern.ch/user/g/gbitzes/dev/eos-dev/fusex/data/data.cc:577 (eosxd+0x0000006a657d) #4 EosFuse::create(fuse_req*, unsigned long, char const*, unsigned int, fuse_file_info*) /afs/cern.ch/user/g/gbitzes/dev/eos-dev/fusex/eosfuse.cc:3410 (eosxd+0x0000005fa699) #5 <null> <null> (libfuse.so.2+0x0000000151a6) Thread T3 (tid=27572, running) created by main thread at: #0 pthread_create <null> (libtsan.so.0+0x000000028e03) #1 XrdCl::JobManager::Start() <null> (libXrdCl.so.2+0x00000011f45a) #2 XrdCl::PostMaster::Start() <null> (libXrdCl.so.2+0x000000061e31) #3 XrdCl::DefaultEnv::GetPostMaster() <null> (libXrdCl.so.2+0x000000044354) #4 <null> <null> (libXrdCl.so.2+0x000000032365) #5 call_init.part.0 <null> (ld-linux-x86-64.so.2+0x00000000f529) Thread T4 (tid=27573, running) created by main thread at: #0 pthread_create <null> (libtsan.so.0+0x000000028e03) #1 XrdCl::JobManager::Start() <null> (libXrdCl.so.2+0x00000011f45a) #2 XrdCl::PostMaster::Start() <null> (libXrdCl.so.2+0x000000061e31) #3 XrdCl::DefaultEnv::GetPostMaster() <null> (libXrdCl.so.2+0x000000044354) #4 <null> <null> (libXrdCl.so.2+0x000000032365) #5 call_init.part.0 <null> (ld-linux-x86-64.so.2+0x00000000f529) Thread T27 (tid=28416, running) created by thread T24 at: #0 pthread_create <null> (libtsan.so.0+0x000000028e03) #1 <null> <null> (libfuse.so.2+0x000000013134) SUMMARY: ThreadSanitizer: data race /usr/include/c++/7/bits/stl_tree.h:2478 in std::_Rb_tree<unsigned long, std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> >, std::_Select1st<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > >, std::less<unsigned long>, std::allocator<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > > >::_M_erase_aux(std::_Rb_tree_const_iterator<std::pair<unsigned long const, std::shared_ptr<XrdCl::Proxy::WriteAsyncHandler> > >)
parent c91f33ac
Pipeline #500589 passed with stages
in 36 minutes 48 seconds
......@@ -779,6 +779,8 @@ XrdCl::Proxy::WriteAsyncHandler::HandleResponse(XrdCl::XRootDStatus* status,
delete status;
if (proxy()) {
XrdSysCondVarHelper lLock(mProxy->ReadCondVar());
if ((mProxy->ChunkMap().size() > 1) ||
(!mProxy->ChunkMap().count((uint64_t) this))) {
no_chunks_left = false;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment