From 62926032155eef30bd380a27601fe770eb00e855 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Tue, 16 Nov 2021 10:21:13 +0800 Subject: [PATCH] Fix database deadlock when update issue labels (#17649) This fix updates issue labels one by one, and won't cause database deadlock. In future, we can use a batch API to update all changed labels by one request. --- web_src/js/features/repo-issue.js | 24 ++++++++++-------------- web_src/js/features/repo-legacy.js | 24 ++++++++++++------------ 2 files changed, 22 insertions(+), 26 deletions(-) diff --git a/web_src/js/features/repo-issue.js b/web_src/js/features/repo-issue.js index 782957c5b1..b69ba25719 100644 --- a/web_src/js/features/repo-issue.js +++ b/web_src/js/features/repo-issue.js @@ -332,20 +332,16 @@ export function initRepoIssueWipTitle() { }); } -export function updateIssuesMeta(url, action, issueIds, elementId) { - return new Promise((resolve, reject) => { - $.ajax({ - type: 'POST', - url, - data: { - _csrf: csrfToken, - action, - issue_ids: issueIds, - id: elementId, - }, - success: resolve, - error: reject, - }); +export async function updateIssuesMeta(url, action, issueIds, elementId) { + return $.ajax({ + type: 'POST', + url, + data: { + _csrf: csrfToken, + action, + issue_ids: issueIds, + id: elementId, + }, }); } diff --git a/web_src/js/features/repo-legacy.js b/web_src/js/features/repo-legacy.js index 8945360cd5..74880c5dc7 100644 --- a/web_src/js/features/repo-legacy.js +++ b/web_src/js/features/repo-legacy.js @@ -84,18 +84,18 @@ export function initRepoCommentForm() { $(`.${selector}`).dropdown('setting', 'onHide', () => { hasUpdateAction = $listMenu.data('action') === 'update'; // Update the var if (hasUpdateAction) { - const promises = []; - Object.keys(items).forEach((elementId) => { - const item = items[elementId]; - const promise = updateIssuesMeta( - item['update-url'], - item.action, - item['issue-id'], - elementId, - ); - promises.push(promise); - }); - Promise.all(promises).then(() => window.location.reload()); + // TODO: Add batch functionality and make this 1 network request. + (async function() { + for (const [elementId, item] of Object.entries(items)) { + await updateIssuesMeta( + item['update-url'], + item.action, + item['issue-id'], + elementId, + ); + } + window.location.reload(); + })(); } });