From bbf9ae0c2b5bdbe22bc6f4719bb1f1ab4ffd5ada Mon Sep 17 00:00:00 2001 From: David Glasser Date: Tue, 9 Oct 2012 22:49:57 -0700 Subject: [PATCH] Fix Mongo write error handling. Previously, if we did a Mongo write inside a method and Mongo returned an error (eg, duplicate key in a unique index), the write fence would never fire and the client would never quiesce. Now we make sure to fire the write fence (and mark the collection dirty) even on error. --- packages/mongo-livedata/mongo_driver.js | 51 +++++-------------------- 1 file changed, 9 insertions(+), 42 deletions(-) diff --git a/packages/mongo-livedata/mongo_driver.js b/packages/mongo-livedata/mongo_driver.js index 47d057befd..cbc77a6d75 100644 --- a/packages/mongo-livedata/mongo_driver.js +++ b/packages/mongo-livedata/mongo_driver.js @@ -105,13 +105,6 @@ _Mongo.prototype.insert = function (collection_name, document) { var write = self._maybeBeginWrite(); - var finish = Meteor.bindEnvironment(function () { - Meteor.refresh({collection: collection_name}); - write.committed(); - }, function (e) { - Meteor._debug("Exception while completing insert: " + e.stack); - }); - var future = new Future; self._withCollection(collection_name, function (err, collection) { if (err) { @@ -120,17 +113,13 @@ _Mongo.prototype.insert = function (collection_name, document) { } collection.insert(document, {safe: true}, function (err) { - if (err) { - future.ret(err); - return; - } - - finish(); - future.ret(); + future.ret(err); }); }); var err = future.wait(); + Meteor.refresh({collection: collection_name}); + write.committed(); if (err) throw err; }; @@ -147,13 +136,6 @@ _Mongo.prototype.remove = function (collection_name, selector) { var write = self._maybeBeginWrite(); - var finish = Meteor.bindEnvironment(function () { - Meteor.refresh({collection: collection_name}); - write.committed(); - }, function (e) { - Meteor._debug("Exception while completing remove: " + e.stack); - }); - // XXX does not allow options. matches the client. selector = _Mongo._rewriteSelector(selector); @@ -165,17 +147,13 @@ _Mongo.prototype.remove = function (collection_name, selector) { } collection.remove(selector, {safe: true}, function (err) { - if (err) { - future.ret(err); - return; - } - - finish(); - future.ret(); + future.ret(err); }); }); var err = future.wait(); + Meteor.refresh({collection: collection_name}); + write.committed(); if (err) throw err; }; @@ -192,13 +170,6 @@ _Mongo.prototype.update = function (collection_name, selector, mod, options) { var write = self._maybeBeginWrite(); - var finish = Meteor.bindEnvironment(function () { - Meteor.refresh({collection: collection_name}); - write.committed(); - }, function (e) { - Meteor._debug("Exception while completing update: " + e.stack); - }); - selector = _Mongo._rewriteSelector(selector); if (!options) options = {}; @@ -215,17 +186,13 @@ _Mongo.prototype.update = function (collection_name, selector, mod, options) { if (options.multi) opts.multi = true; collection.update(selector, mod, opts, function (err) { - if (err) { - future.ret(err); - return; - } - - finish(); - future.ret(); + future.ret(err); }); }); var err = future.wait(); + Meteor.refresh({collection: collection_name}); + write.committed(); if (err) throw err; };