diff --git a/lib/store.js b/lib/store.js index 5605e55..516f288 100644 --- a/lib/store.js +++ b/lib/store.js @@ -450,7 +450,9 @@ async function acceptCollectionSuggestion(name, modelIds = null) { ORDER BY name = lower(name), name LIMIT 1), $1) RETURNING *`, [name])); } - const ids = waiting.map((w) => w.model_id); + // Sorted, so two of these at once take the model_projects rows in the same + // order rather than deadlocking on each other. + const ids = waiting.map((w) => w.model_id).sort((a, b) => a - b); for (const id of ids) { await client.query('INSERT INTO model_projects (model_id, project_id) VALUES ($1, $2) ON CONFLICT DO NOTHING', [id, project.id]); } @@ -485,7 +487,7 @@ async function getAllTags() { // ---------------------------------------------------------------- projects async function setProjects(client, modelId, projectIds) { await client.query('DELETE FROM model_projects WHERE model_id = $1', [modelId]); - for (const pid of projectIds) { + for (const pid of [...projectIds].sort((a, b) => a - b)) { // one lock order, always await client.query( 'INSERT INTO model_projects (model_id, project_id) VALUES ($1,$2) ON CONFLICT DO NOTHING', [modelId, pid]);