From 07232a8cf6376c5289a2d005c46602bc334c5997 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bar=C4=B1=C5=9F=20Soner=20U=C5=9Fakl=C4=B1?= Date: Thu, 23 Dec 2021 11:28:48 -0500 Subject: [PATCH] fix: retry incrObjtFieldBy --- src/database/mongo/hash.js | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) diff --git a/src/database/mongo/hash.js b/src/database/mongo/hash.js index bb6c4d488f..732a3e2af9 100644 --- a/src/database/mongo/hash.js +++ b/src/database/mongo/hash.js @@ -239,17 +239,26 @@ module.exports = function (module) { const result = await module.getObjectsFields(key, [field]); return result.map(data => data && data[field]); } - - const result = await module.client.collection('objects').findOneAndUpdate({ - _key: key, - }, { - $inc: increment, - }, { - returnDocument: 'after', - upsert: true, - }); - - cache.del(key); - return result && result.value ? result.value[field] : null; + try { + const result = await module.client.collection('objects').findOneAndUpdate({ + _key: key, + }, { + $inc: increment, + }, { + returnDocument: 'after', + upsert: true, + }); + cache.del(key); + return result && result.value ? result.value[field] : null; + } catch (err) { + // if there is duplicate key error retry the upsert + // https://github.com/NodeBB/NodeBB/issues/4467 + // https://jira.mongodb.org/browse/SERVER-14322 + // https://docs.mongodb.org/manual/reference/command/findAndModify/#upsert-and-unique-index + if (err && err.message.startsWith('E11000 duplicate key error')) { + return await module.incrObjectFieldBy(key, field, value); + } + throw err; + } }; };