From 2b2e1d4b9aa2ef18bc091cf54716e9b9b88f557e Mon Sep 17 00:00:00 2001 From: Matteo Pagliazzi Date: Fri, 9 Nov 2018 12:58:39 +0100 Subject: [PATCH] rewrite mongoose migration to avoid using recursion --- .../users/20181023_veteran_pet_ladder.js | 88 ++++++------------- 1 file changed, 28 insertions(+), 60 deletions(-) diff --git a/migrations/users/20181023_veteran_pet_ladder.js b/migrations/users/20181023_veteran_pet_ladder.js index cbe8044d53..265808d5aa 100644 --- a/migrations/users/20181023_veteran_pet_ladder.js +++ b/migrations/users/20181023_veteran_pet_ladder.js @@ -2,52 +2,10 @@ const MIGRATION_NAME = '20181023_veteran_pet_ladder'; import { model as User } from '../../website/server/models/user'; -function processUsers (lastId) { - let query = { - migration: {$ne: MIGRATION_NAME}, - 'flags.verifiedUsername': true, - }; - - const fields = { - 'items.pets': 1, - }; - - if (lastId) { - query._id = { - $gt: lastId, - }; - } - - return User.find(query) - .limit(250) - .sort({_id: 1}) - .select(fields) - .exec() - .then(updateUsers) - .catch((err) => { - console.log(err); - return exiting(1, `ERROR! ${err}`); - }); -} - const progressCount = 1000; let count = 0; -function updateUsers (users) { - if (!users || users.length === 0) { - console.warn('All appropriate users found and modified.'); - displayData(); - return; - } - - let userPromises = users.map(updateUser); - let lastUser = users[users.length - 1]; - - return Promise.all(userPromises) - .then(() => { - return processUsers(lastUser._id); - }); -} +const batchSize = 250; function updateUser (user) { count++; @@ -71,24 +29,34 @@ function updateUser (user) { return user.save(); } -function displayData () { - console.warn(`\n${count} users processed\n`); - return exiting(0); -} +module.exports = async function processUsers () { + let query = { + migration: {$ne: MIGRATION_NAME}, + 'flags.verifiedUsername': true, + }; -function exiting (code, msg) { - code = code || 0; // 0 = success - if (code && !msg) { - msg = 'ERROR!'; - } - if (msg) { - if (code) { - console.error(msg); + const fields = { + items: 1, + }; + + while (true) { // eslint-disable-line no-constant-condition + const users = await User // eslint-disable-line no-await-in-loop + .find(query) + .limit(batchSize) + .sort({_id: 1}) + .select(fields) + .exec(); + + if (users.length === 0) { + console.warn('All appropriate users found and modified.'); + console.warn(`\n${count} users processed\n`); + break; } else { - console.log(msg); + query._id = { + $gt: users[users.length - 1], + }; } - } - process.exit(code); -} -module.exports = processUsers; + await Promise.all(users.map(updateUser)); // eslint-disable-line no-await-in-loop + } +};