From 4a405ce0326554cb363333f82f80dd75dbfa7c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 21 Feb 2024 11:36:04 -0500 Subject: [PATCH 1/2] fix: retry setAdd on e11000 error --- src/database/mongo/sets.js | 28 ++++++++++++++++++---------- test/database/sets.js | 8 ++++++++ 2 files changed, 26 insertions(+), 10 deletions(-) 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()', () => { From 4e51bf81bb9008f2e6362a3d73db73b33c4d3790 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Wed, 21 Feb 2024 11:38:07 -0500 Subject: [PATCH 2/2] test: better test for #12352 --- test/database/sets.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/database/sets.js b/test/database/sets.js index fdd6ad9e84..126490aff8 100644 --- a/test/database/sets.js +++ b/test/database/sets.js @@ -37,6 +37,11 @@ describe('Set methods', () => { db.setAdd('parallelset', 2), db.setAdd('parallelset', 3), ]); + const members = await db.getSetMembers('parallelset'); + assert.strictEqual(members.length, 3); + assert(members.includes('1')); + assert(members.includes('2')); + assert(members.includes('3')); }); });