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,6 +13,7 @@ module.exports = function (module) {
} }
value = value.map(v => helpers.valueToString(v)); value = value.map(v => helpers.valueToString(v));
try {
await module.client.collection('objects').updateOne({ await module.client.collection('objects').updateOne({
_key: key, _key: key,
}, { }, {
@@ -24,6 +25,13 @@ module.exports = function (module) {
}, { }, {
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()', () => {