diff --git a/src/database/mongo/sets.js b/src/database/mongo/sets.js index 42051bc2a4..3f110b79f9 100644 --- a/src/database/mongo/sets.js +++ b/src/database/mongo/sets.js @@ -13,17 +13,25 @@ module.exports = function (module) { } value = value.map(v => helpers.valueToString(v)); - await module.client.collection('objects').updateOne({ - _key: key, - }, { - $addToSet: { - members: { - $each: value, + try { + await module.client.collection('objects').updateOne({ + _key: key, + }, { + $addToSet: { + members: { + $each: value, + }, }, - }, - }, { - upsert: true, - }); + }, { + upsert: true, + }); + } catch (err) { + if (err && err.message.includes('E11000 duplicate key error')) { + console.log(new Error('e11000').stack, key, value); + return await module.setAdd(key, value); + } + throw err; + } }; module.setsAdd = async function (keys, value) { diff --git a/test/database/sets.js b/test/database/sets.js index eae737c688..fdd6ad9e84 100644 --- a/test/database/sets.js +++ b/test/database/sets.js @@ -30,6 +30,14 @@ describe('Set methods', () => { assert.deepStrictEqual(members, []); assert(!exists); }); + + it('should not error with parallel adds', async () => { + await Promise.all([ + db.setAdd('parallelset', 1), + db.setAdd('parallelset', 2), + db.setAdd('parallelset', 3), + ]); + }); }); describe('getSetMembers()', () => {