Optimize fetching olm session from the db

pull/1222/head
Nicolas Werner 2 years ago
parent 676a6506cb
commit 54931cb21b
No known key found for this signature in database
GPG Key ID: C8D75E610773F2D9
  1. 53
      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<StoredOlmSession>();
return unpickle<SessionObject>(data.pickled_session, pickle_secret_);
}
if (found) {
auto data = nlohmann::json::parse(pickled).get<StoredOlmSession>();
return unpickle<SessionObject>(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);
std::string_view session_id, pickled_session;
try {
auto txn = ro_txn(env_);
auto db = getOlmSessionsDb(txn, curve25519);
std::optional<StoredOlmSession> currentNewest;
std::string_view session_id, pickled_session;
auto cursor = lmdb::cursor::open(txn, db);
while (cursor.get(session_id, pickled_session, MDB_NEXT)) {
auto data = nlohmann::json::parse(pickled_session).get<StoredOlmSession>();
if (!currentNewest || currentNewest->last_message_ts < data.last_message_ts)
currentNewest = data;
}
cursor.close();
std::optional<StoredOlmSession> currentNewest;
txn.commit();
auto cursor = lmdb::cursor::open(txn, db);
while (cursor.get(session_id, pickled_session, MDB_NEXT)) {
auto data = nlohmann::json::parse(pickled_session).get<StoredOlmSession>();
if (!currentNewest || currentNewest->last_message_ts < data.last_message_ts)
currentNewest = data;
}
cursor.close();
return currentNewest ? std::optional(unpickle<SessionObject>(currentNewest->pickled_session,
pickle_secret_))
: std::nullopt;
return currentNewest ? std::optional(unpickle<SessionObject>(currentNewest->pickled_session,
pickle_secret_))
: std::nullopt;
} catch (...) {
return std::nullopt;
}
}
std::vector<std::string>

Loading…
Cancel
Save