From ed5f8618b6fd18d28a828dae80d58be89b33b9df Mon Sep 17 00:00:00 2001 From: csoler Date: Tue, 8 Dec 2020 23:45:31 +0100 Subject: [PATCH 1/2] fixed bug in mutexes causing a deadlock in gxs integrity check --- libretroshare/src/gxs/rsgenexchange.cc | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/libretroshare/src/gxs/rsgenexchange.cc b/libretroshare/src/gxs/rsgenexchange.cc index a73491aa0..ff6247dee 100644 --- a/libretroshare/src/gxs/rsgenexchange.cc +++ b/libretroshare/src/gxs/rsgenexchange.cc @@ -299,12 +299,13 @@ void RsGenExchange::tick() if(mIntegrityCheck->isDone()) { - RS_STACK_MUTEX(mGenMtx) ; - std::vector grpIds; GxsMsgReq msgIds; - mIntegrityCheck->getDeletedIds(grpIds, msgIds); + { + RS_STACK_MUTEX(mGenMtx) ; + mIntegrityCheck->getDeletedIds(grpIds, msgIds); + } if(!msgIds.empty()) { @@ -319,9 +320,12 @@ void RsGenExchange::tick() deleteGroup(token2,grpId); } - delete mIntegrityCheck; - mIntegrityCheck = NULL; - mChecking = false; + { + RS_STACK_MUTEX(mGenMtx) ; + delete mIntegrityCheck; + mIntegrityCheck = NULL; + mChecking = false; + } } } } From 4ddcf3c0bb463a0f6335db9a14ed3347e46400dc Mon Sep 17 00:00:00 2001 From: csoler Date: Tue, 8 Dec 2020 23:57:30 +0100 Subject: [PATCH 2/2] removed double call to delete groups and delete msgs (left after previous changes). Improved output when checking groups/msgs --- libretroshare/src/gxs/rsgxsutil.cc | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/libretroshare/src/gxs/rsgxsutil.cc b/libretroshare/src/gxs/rsgxsutil.cc index b32d63392..c907ceb22 100644 --- a/libretroshare/src/gxs/rsgxsutil.cc +++ b/libretroshare/src/gxs/rsgxsutil.cc @@ -234,8 +234,7 @@ bool RsGxsIntegrityCheck::check(uint16_t service_type, RsGixs *mgixs, RsGeneralD // compute hash and compare to stored value, if it fails then simply add it // to list - for( std::map::iterator git = grp.begin(); - git != grp.end(); ++git ) + for( std::map::iterator git = grp.begin(); git != grp.end(); ++git ) { RsNxsGrp* grp = git->second; RsFileHash currHash; @@ -311,7 +310,8 @@ bool RsGxsIntegrityCheck::check(uint16_t service_type, RsGixs *mgixs, RsGeneralD } else { - grpsToDel.push_back(grp->grpId); + std::cerr << __PRETTY_FUNCTION__ <<" (EE) deleting group " << grp->grpId << " with wrong hash or null/corrupted meta data. meta=" << grp->metaData << std::endl; + grpsToDel.push_back(grp->grpId); #ifdef RS_DEEP_CHANNEL_INDEX if(isGxsChannels) DeepChannelsIndex::removeChannelFromIndex(grp->grpId); @@ -321,8 +321,6 @@ bool RsGxsIntegrityCheck::check(uint16_t service_type, RsGixs *mgixs, RsGeneralD delete grp; } - mds->removeGroups(grpsToDel); - // now messages GxsMsgResult msgs; @@ -378,9 +376,7 @@ bool RsGxsIntegrityCheck::check(uint16_t service_type, RsGixs *mgixs, RsGeneralD if(msg->metaData == NULL || currHash != msg->metaData->mHash) { - std::cerr << __PRETTY_FUNCTION__ <<" (EE) deleting message data" - << " with wrong hash or null meta data. meta=" - << (void*)msg->metaData << std::endl; + std::cerr << __PRETTY_FUNCTION__ <<" (EE) deleting message " << msg->msgId << " in group " << msg->grpId << " with wrong hash or null/corrupted meta data. meta=" << (void*)msg->metaData << std::endl; msgsToDel[msg->grpId].insert(msg->msgId); #ifdef RS_DEEP_CHANNEL_INDEX if(isGxsChannels) @@ -451,8 +447,6 @@ bool RsGxsIntegrityCheck::check(uint16_t service_type, RsGixs *mgixs, RsGeneralD } } - mds->removeMsgs(msgsToDel); - { #ifdef DEBUG_GXSUTIL GXSUTIL_DEBUG() << "At end of pass, this is the list used GXS ids: " << std::endl;