From 54931cb21b080d079a80978e88e8e79e6c43196f Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Tue, 1 Nov 2022 21:13:11 +0100 Subject: [PATCH] Optimize fetching olm session from the db --- src/Cache.cpp | 53 +++++++++++++++++++++++++++------------------------ 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/src/Cache.cpp b/src/Cache.cpp index 2784cf50..cb4ee0b0 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -962,19 +962,20 @@ Cache::getOlmSession(const std::string &curve25519, const std::string &session_i { using namespace mtx::crypto; - auto txn = lmdb::txn::begin(env_); - auto db = getOlmSessionsDb(txn, curve25519); + try { + auto txn = ro_txn(env_); + auto db = getOlmSessionsDb(txn, curve25519); - std::string_view pickled; - bool found = db.get(txn, session_id, pickled); + std::string_view pickled; + bool found = db.get(txn, session_id, pickled); - txn.commit(); + if (found) { + auto data = nlohmann::json::parse(pickled).get(); + return unpickle(data.pickled_session, pickle_secret_); + } - if (found) { - auto data = nlohmann::json::parse(pickled).get(); - return unpickle(data.pickled_session, pickle_secret_); + } catch (...) { } - return std::nullopt; } @@ -983,26 +984,28 @@ Cache::getLatestOlmSession(const std::string &curve25519) { using namespace mtx::crypto; - auto txn = lmdb::txn::begin(env_); - auto db = getOlmSessionsDb(txn, curve25519); + try { + auto txn = ro_txn(env_); + auto db = getOlmSessionsDb(txn, curve25519); - std::string_view session_id, pickled_session; + std::string_view session_id, pickled_session; - std::optional currentNewest; + std::optional currentNewest; - auto cursor = lmdb::cursor::open(txn, db); - while (cursor.get(session_id, pickled_session, MDB_NEXT)) { - auto data = nlohmann::json::parse(pickled_session).get(); - if (!currentNewest || currentNewest->last_message_ts < data.last_message_ts) - currentNewest = data; + auto cursor = lmdb::cursor::open(txn, db); + while (cursor.get(session_id, pickled_session, MDB_NEXT)) { + auto data = nlohmann::json::parse(pickled_session).get(); + if (!currentNewest || currentNewest->last_message_ts < data.last_message_ts) + currentNewest = data; + } + cursor.close(); + + return currentNewest ? std::optional(unpickle(currentNewest->pickled_session, + pickle_secret_)) + : std::nullopt; + } catch (...) { + return std::nullopt; } - cursor.close(); - - txn.commit(); - - return currentNewest ? std::optional(unpickle(currentNewest->pickled_session, - pickle_secret_)) - : std::nullopt; } std::vector