From b4cfd679ee595cef48dd7d0bb4c0c3eb0eee0e1c Mon Sep 17 00:00:00 2001 From: LDA Date: Sun, 11 Aug 2024 10:38:36 +0200 Subject: [PATCH] [FIX/WIP] Fix concurrency problem with LMDB --- src/MatrixEventHandler.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/MatrixEventHandler.c b/src/MatrixEventHandler.c index 51c0dc1..5f7cb1d 100644 --- a/src/MatrixEventHandler.c +++ b/src/MatrixEventHandler.c @@ -245,28 +245,31 @@ ParseeMessageHandler(ParseeData *data, HashMap *event) bool direct = false; - chat_id = ParseeGetFromRoomID(data, id); - - ref = DbLock(data->db, 3, "rooms", id, "data"); - json = DbJson(ref); - direct = JsonValueAsBoolean(HashMapGet(json, "is_direct")); - if (ParseeIsPuppet(data->config, m_sender) || ParseeManageBan(data, m_sender, id)) { - DbUnlock(data->db, ref); - Free(chat_id); Free(reply_id); Free(xepd); Free(unedited_id); return; } + chat_id = ParseeGetFromRoomID(data, id); + + /* TODO: This ref should be marked as read-only, + * as LMDB doesn't seem to like having two concurrent RW + * transactions running. */ + ref = DbLock(data->db, 3, "rooms", id, "data"); + json = JsonDuplicate(DbJson(ref)); + direct = JsonValueAsBoolean(HashMapGet(json, "is_direct")); + DbUnlock(data->db, ref); + ref = NULL; + if (!direct && !chat_id) { ParseeBotHandler(data, event); - DbUnlock(data->db, ref); + JsonFree(json); Free(chat_id); Free(reply_id); Free(xepd); @@ -362,7 +365,7 @@ end: Free(unauth); Free(unedited_id); - DbUnlock(data->db, ref); + JsonFree(json); } void