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.
This commit is contained in:
wxiaoguang 2021-11-16 10:21:13 +08:00 committed by GitHub
parent 3a60e0ad89
commit 6292603215
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 22 additions and 26 deletions

View file

@ -332,20 +332,16 @@ export function initRepoIssueWipTitle() {
}); });
} }
export function updateIssuesMeta(url, action, issueIds, elementId) { export async function updateIssuesMeta(url, action, issueIds, elementId) {
return new Promise((resolve, reject) => { return $.ajax({
$.ajax({ type: 'POST',
type: 'POST', url,
url, data: {
data: { _csrf: csrfToken,
_csrf: csrfToken, action,
action, issue_ids: issueIds,
issue_ids: issueIds, id: elementId,
id: elementId, },
},
success: resolve,
error: reject,
});
}); });
} }

View file

@ -84,18 +84,18 @@ export function initRepoCommentForm() {
$(`.${selector}`).dropdown('setting', 'onHide', () => { $(`.${selector}`).dropdown('setting', 'onHide', () => {
hasUpdateAction = $listMenu.data('action') === 'update'; // Update the var hasUpdateAction = $listMenu.data('action') === 'update'; // Update the var
if (hasUpdateAction) { if (hasUpdateAction) {
const promises = []; // TODO: Add batch functionality and make this 1 network request.
Object.keys(items).forEach((elementId) => { (async function() {
const item = items[elementId]; for (const [elementId, item] of Object.entries(items)) {
const promise = updateIssuesMeta( await updateIssuesMeta(
item['update-url'], item['update-url'],
item.action, item.action,
item['issue-id'], item['issue-id'],
elementId, elementId,
); );
promises.push(promise); }
}); window.location.reload();
Promise.all(promises).then(() => window.location.reload()); })();
} }
}); });