Avoid deadlock when processing deletes and edits concurrently

Co-authored-by: trevor-signal <131492920+trevor-signal@users.noreply.github.com>
This commit is contained in:
automated-signal 2025-10-02 12:56:52 -05:00 committed by GitHub
commit 71f2cf1d25
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 28 additions and 5 deletions

View file

@ -8766,8 +8766,9 @@ function saveEditedMessages(
alreadyInTransaction: true,
});
for (const { conversationId, messageId, readStatus, sentAt } of history) {
const [query, params] = sql`
try {
for (const { conversationId, messageId, readStatus, sentAt } of history) {
const [query, params] = sql`
INSERT INTO edited_messages (
conversationId,
messageId,
@ -8781,7 +8782,29 @@ function saveEditedMessages(
);
`;
db.prepare(query).run(params);
db.prepare(query).run(params);
}
} catch (e) {
const [messageExistsQuery, messageExistsParams] = sql`
SELECT EXISTS(
SELECT 1 FROM messages
WHERE messages.id = ${mainMessage.id}
);
`;
const messageExists = db
.prepare(messageExistsQuery, {
pluck: true,
})
.get<number>(messageExistsParams);
if (messageExists !== 1) {
logger.warn(
'saveEditedMessages: save failed because message does not exist'
);
} else {
// Some other, unknown error
throw e;
}
}
})();
}