From 36925c0d94c7cd14819df8883cae444b09550060 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Blin?= <sebastien.blin@savoirfairelinux.com> Date: Wed, 28 Feb 2024 15:13:00 -0500 Subject: [PATCH] conversation: avoid to get lastCommitId while merging Change-Id: I2a7b7cc13268be127a6afe3d689d005b6596a3cd --- src/jamidht/conversation.cpp | 4 ++-- src/jamidht/conversation_module.cpp | 6 +++--- .../conversation/conversationMembersEvent.cpp | 11 +++++++---- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/jamidht/conversation.cpp b/src/jamidht/conversation.cpp index 86f5d3ae63..2a027614b3 100644 --- a/src/jamidht/conversation.cpp +++ b/src/jamidht/conversation.cpp @@ -1596,10 +1596,10 @@ Conversation::lastCommitId() const options.nbOfCommits = 1; options.skipMerge = true; History optHistory; + std::lock_guard wlk(pimpl_->writeMtx_); // Avoid any write during a loading operation std::lock_guard lk(pimpl_->historyMtx_); - if (!pimpl_->loadedHistory_.messageList.empty()) { + if (!pimpl_->loadedHistory_.messageList.empty()) return (*pimpl_->loadedHistory_.messageList.begin())->id; - } auto res = pimpl_->loadMessages2(options, &optHistory); if (res.empty()) return {}; diff --git a/src/jamidht/conversation_module.cpp b/src/jamidht/conversation_module.cpp index 12b556ec02..ad75b45059 100644 --- a/src/jamidht/conversation_module.cpp +++ b/src/jamidht/conversation_module.cpp @@ -872,9 +872,9 @@ ConversationModule::Impl::removeRepositoryImpl(SyncedConversation& conv, bool sy JAMI_LOG("Remove conversation: {}", conv.info.id); try { if (conv.conversation->mode() == ConversationMode::ONE_TO_ONE) { - auto account = account_.lock(); for (const auto& member : conv.conversation->getInitialMembers()) { - if (member != account->getUsername()) { + auto account = account_.lock(); + if (member != account->getUsername()) { // Note: this can happen while re-adding a contact. // In this case, check that we are removing the linked conversation. if (conv.info.id == getOneToOneConversation(member)) { @@ -2254,7 +2254,7 @@ ConversationModule::onSyncData(const SyncMsg& msg, // If multi devices, it can detect a conversation that was already // removed, so just check if the convinfo contains a removed conv if (conv->info.removed) { - if (conv->info.removed > convInfo.created) { + if (conv->info.removed >= convInfo.created) { // Only reclone if re-added, else the peer is not synced yet (could be // offline before) continue; diff --git a/test/unitTest/conversation/conversationMembersEvent.cpp b/test/unitTest/conversation/conversationMembersEvent.cpp index e85aaf0aa9..f3737e377d 100644 --- a/test/unitTest/conversation/conversationMembersEvent.cpp +++ b/test/unitTest/conversation/conversationMembersEvent.cpp @@ -576,6 +576,8 @@ ConversationMembersEventTest::testAddOfflineMemberThenConnects() auto aliceMsgSize = aliceData.messages.size(); libjami::addConversationMember(aliceId, convId, carlaUri); CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return aliceMsgSize + 1 == aliceData.messages.size(); })); + CPPUNIT_ASSERT(!cv.wait_for(lk, 30s, [&] { return carlaData.requestReceived; })); + Manager::instance().sendRegister(carlaId, true); CPPUNIT_ASSERT(cv.wait_for(lk, 60s, [&] { return carlaData.requestReceived; })); @@ -929,7 +931,8 @@ ConversationMembersEventTest::testMemberCannotBanOther() // remove from member & add into banned without voting for the ban simulateRemoval(carlaAccount, convId, bobUri); // Note: it may be possible that alice doesn't get the error if they got messages from bob (and bob rejects due to an error) - CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return aliceData.errorDetected || bobData.errorDetected; })); + CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { + return aliceData.errorDetected || bobData.errorDetected; })); auto bobMsgSize = bobData.messages.size(); libjami::sendMessage(aliceId, convId, "hi"s, ""); @@ -966,7 +969,7 @@ ConversationMembersEventTest::testMemberCannotUnBanOther() cv.wait_for(lk, 30s, [&]() { return !carlaData.conversationId.empty() && aliceData.members[carlaUri] == 1 && bobData.members[carlaUri] == 1; })); - + std::this_thread::sleep_for(3s); // Wait that carla finish the clone // Now check that alice, has the only admin, can remove bob libjami::removeConversationMember(aliceId, convId, bobUri); CPPUNIT_ASSERT( @@ -1443,7 +1446,8 @@ ConversationMembersEventTest::testAvoidTwoOneToOneMultiDevices() bobAccount->addContact(aliceUri); bobAccount->sendTrustRequest(aliceUri, {}); CPPUNIT_ASSERT( - cv.wait_for(lk, 30s, [&]() { return bobData.conversationId == aliceData.conversationId && bob2Data.conversationId == aliceData.conversationId; })); + cv.wait_for(lk, 30s, [&]() { + return bobData.conversationId == aliceData.conversationId && bob2Data.conversationId == aliceData.conversationId; })); } void @@ -1696,7 +1700,6 @@ ConversationMembersEventTest::testBanFromNewDevice() CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return bob2Data.deviceAnnounced; })); CPPUNIT_ASSERT(cv.wait_for(lk, 30s, [&]() { return !bob2Data.conversationId.empty(); })); - auto bobMsgSize = bobData.messages.size(); libjami::removeConversationMember(bob2Id, convId, aliceUri); CPPUNIT_ASSERT( -- GitLab