diff --git a/packages/constraint-solver/constraint-solver-input.js b/packages/constraint-solver/constraint-solver-input.js index 7d8cd7e91d..e4fd5bf392 100644 --- a/packages/constraint-solver/constraint-solver-input.js +++ b/packages/constraint-solver/constraint-solver-input.js @@ -148,7 +148,19 @@ CS.Input.prototype.isEqual = function (otherInput) { // This equality test is also overly sensitive to order, // missing opportunities to declare two inputs equal when only // the order has changed. - return _.isEqual(a.toJSONable(), b.toJSONable()); + + // Omit `catalogCache` -- it's not actually part of the serialized + // input object (it's only in `toJSONable()` for tests). + // + // Moreover, catalogCache is populated as-needed so their values for + // `a` and `b` will very likely be different even if they represent + // the same input. So by omitting `catalogCache` we no longer need + // to reload the entire relevant part of the catalog from SQLite on + // every rebuild! + return _.isEqual( + _.omit(a.toJSONable(), "catalogCache"), + _.omit(b.toJSONable(), "catalogCache") + ); }; CS.Input.prototype.toJSONable = function () { diff --git a/packages/constraint-solver/constraint-solver.js b/packages/constraint-solver/constraint-solver.js index 17593be080..7f89d69556 100644 --- a/packages/constraint-solver/constraint-solver.js +++ b/packages/constraint-solver/constraint-solver.js @@ -56,11 +56,6 @@ CS.PackagesResolver.prototype.resolve = function (dependencies, constraints, 'upgradeIndirectDepPatchVersions')); }); - Profile.time( - "Input#loadFromCatalog (sqlite)", - function () { - input.loadFromCatalog(self.catalogLoader); - }); var resultCache = self._options.resultCache; if (resultCache && resultCache.lastInput && @@ -68,6 +63,12 @@ CS.PackagesResolver.prototype.resolve = function (dependencies, constraints, return resultCache.lastOutput; } + Profile.time( + "Input#loadFromCatalog (sqlite)", + function () { + input.loadFromCatalog(self.catalogLoader); + }); + if (options.previousSolution && options.missingPreviousVersionIsError) { Profile.time("check for previous versions in catalog", function () { _.each(options.previousSolution, function (version, pkg) {