Skip to content

Commit

Permalink
fix: retry setAdd on e11000 error
Browse files Browse the repository at this point in the history
  • Loading branch information
barisusakli committed Feb 21, 2024
1 parent debaa2b commit 4a405ce
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 10 deletions.
28 changes: 18 additions & 10 deletions src/database/mongo/sets.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
8 changes: 8 additions & 0 deletions test/database/sets.js
Original file line number Diff line number Diff line change
Expand Up @@ -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()', () => {
Expand Down

0 comments on commit 4a405ce

Please sign in to comment.