From 62d2b0bf0d80cadef3098e00f8db3a0f93b5d13c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20Bajto=C5=A1?= Date: Mon, 7 Dec 2015 14:05:06 +0100 Subject: [PATCH] change: skip cp lookup on no change Modify `Change.rectify` to look up the current checkpoint only when there was actually some change made. This should improve the performance of `rectifyAll` when called from a regular timer and there were no changes made since the last call. Before this commit, `rectifyAll` would perform N calls of `Checkpoint.current` where N is the number of model instances. With this commit in place, no call is made. --- common/models/change.js | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/common/models/change.js b/common/models/change.js index a591d7d5..be353a03 100644 --- a/common/models/change.js +++ b/common/models/change.js @@ -175,24 +175,31 @@ module.exports = function(Change) { if (err) throw new Error(err); }; - async.parallel([ - function getCurrentCheckpoint(next) { - change.constructor.getCheckpointModel().current(next); - }, - function getCurrentRevision(next) { - change.currentRevision(next); - } - ], doRectify); - - function doRectify(err, results) { + change.currentRevision(function(err, rev) { if (err) return cb(err); - var checkpoint = results[0]; - var rev = results[1]; + // avoid setting rev and prev to the same value + if (currentRev === rev) { + change.debug('rev and prev are equal (not updating anything)'); + return cb(null, change); + } + + // FIXME(@bajtos) Allo callers to pass in the checkpoint value + // (or even better - a memoized async function to get the cp value) + // That will enable `rectifyAll` to cache the checkpoint value + change.constructor.getCheckpointModel().current( + function(err, checkpoint) { + if (err) return cb(err); + doRectify(checkpoint, rev); + } + ); + }); + + function doRectify(checkpoint, rev) { if (rev) { - // avoid setting rev and prev to the same value if (currentRev === rev) { - change.debug('rev and prev are equal (not updating anything)'); + change.debug('ASSERTION FAILED: Change currentRev==rev ' + + 'should have been already handled'); return cb(null, change); } else { change.rev = rev;