Avoid deadlock when processing deletes and edits concurrently

This commit is contained in:
trevor-signal
2025-10-02 12:28:35 -04:00
committed by GitHub
parent a6d4145c51
commit 15d180a785
2 changed files with 28 additions and 5 deletions

View File

@@ -8758,6 +8758,7 @@ function saveEditedMessages(
alreadyInTransaction: true,
});
try {
for (const { conversationId, messageId, readStatus, sentAt } of history) {
const [query, params] = sql`
INSERT INTO edited_messages (
@@ -8775,6 +8776,28 @@ function saveEditedMessages(
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;
}
}
})();
}

View File

@@ -365,8 +365,8 @@ export async function modifyTargetMessage(
if (!isFirstRun && !skipEdits) {
const edits = Edits.forMessage(message.attributes);
log.info(`${logId}: ${edits.length} edits in second run`);
await Promise.all(
edits.map(editAttributes =>
drop(
conversation.queueJob('modifyTargetMessage/edits', () =>
handleEditMessage(message.attributes, editAttributes)
)