From c31b9e27939a2f756056a818d83c64c9e43b721d Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Wed, 25 Nov 2020 23:43:31 +0100 Subject: Fix race when reading members from db --- src/Cache.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) (limited to 'src/Cache.cpp') diff --git a/src/Cache.cpp b/src/Cache.cpp index bd0f3733..be9af8ee 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -1162,10 +1162,10 @@ Cache::saveState(const mtx::responses::Sync &res) saveTimelineMessages(txn, room.first, room.second.timeline); RoomInfo updatedInfo; - updatedInfo.name = getRoomName(txn, statesdb, membersdb).toStdString(); - updatedInfo.topic = getRoomTopic(txn, statesdb).toStdString(); + updatedInfo.name = getRoomName(txn, statesdb, membersdb).toStdString(); + updatedInfo.topic = getRoomTopic(txn, statesdb).toStdString(); updatedInfo.avatar_url = getRoomAvatarUrl(txn, statesdb, membersdb).toStdString(); - updatedInfo.version = getRoomVersion(txn, statesdb).toStdString(); + updatedInfo.version = getRoomVersion(txn, statesdb).toStdString(); // Process the account_data associated with this room if (!room.second.account_data.events.empty()) { @@ -1808,6 +1808,17 @@ Cache::getLastMessageInfo(lmdb::txn &txn, const std::string &room_id) e.what()); return {}; } + auto membersdb{0}; + + try { + membersdb = getMembersDb(txn, room_id); + } catch (lmdb::runtime_error &e) { + nhlog::db()->error("Can't open db for room '{}', probably doesn't exist yet. ({})", + room_id, + e.what()); + return {}; + } + if (orderDb.size(txn) == 0) return DescInfo{}; @@ -1850,9 +1861,16 @@ Cache::getLastMessageInfo(lmdb::txn &txn, const std::string &room_id) mtx::events::collections::TimelineEvent te; mtx::events::collections::from_json(obj, te); + lmdb::val info; + MemberInfo m; + if (lmdb::dbi_get( + txn, membersdb, lmdb::val(obj["sender"].get()), info)) { + m = json::parse(std::string_view(info.data(), info.size())); + } + cursor.close(); return utils::getMessageDescription( - te.data, local_user, QString::fromStdString(room_id)); + te.data, local_user, QString::fromStdString(m.name)); } cursor.close(); @@ -1911,7 +1929,6 @@ Cache::getRoomAvatarUrl(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersd // Resolve avatar for 1-1 chats. while (cursor.get(user_id, member_data, MDB_NEXT)) { - try { MemberInfo m = json::parse(member_data); if (user_id == localUserId_.toStdString()) { -- cgit 1.5.1