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));
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) {

View File

@@ -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()', () => {