fix: retry setAdd on e11000 error

This commit is contained in:
Barış Soner Uşaklı
2024-02-21 11:36:04 -05:00
parent debaa2b9cd
commit 4a405ce032
2 changed files with 26 additions and 10 deletions

View File

@@ -13,17 +13,25 @@ module.exports = function (module) {
} }
value = value.map(v => helpers.valueToString(v)); value = value.map(v => helpers.valueToString(v));
await module.client.collection('objects').updateOne({ try {
_key: key, await module.client.collection('objects').updateOne({
}, { _key: key,
$addToSet: { }, {
members: { $addToSet: {
$each: value, 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) { module.setsAdd = async function (keys, value) {

View File

@@ -30,6 +30,14 @@ describe('Set methods', () => {
assert.deepStrictEqual(members, []); assert.deepStrictEqual(members, []);
assert(!exists); 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()', () => { describe('getSetMembers()', () => {