From 99fd00c4bf2f3f98a35bf1884c02bd2889f6b107 Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Tue, 20 Dec 2011 00:34:46 -0800 Subject: [PATCH 1/2] issue 33, server.close doesn't close server --- lib/server.js | 45 ++++++++++++++++++++++++++++++++------------- 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/lib/server.js b/lib/server.js index 11e6557..b62ff1a 100644 --- a/lib/server.js +++ b/lib/server.js @@ -282,18 +282,37 @@ MongolianServer.prototype.toString = function() { /** * Closes the current connection, passing the optional error object to any pending request callbacks. */ -MongolianServer.prototype.close = function(error) { - error = error || new Error("Connection closed") - if (this._connection.value) { - var callbacks = this._callbacks - this._callbacks = {} - this._callbackCount = 0 - this._connection.value.close() - this._connection.reset() - delete this._type - for (var requestId in callbacks) { - callbacks[requestId](error) - } - this.mongolian._replicaSet.emit('lost', this) +MongolianServer.prototype.close = function(error, callback) { + var self = this + + // function: error all callbacks + var _error_callbacks = function() { + error = error || new Error("Connection closed") + var callbacks = self._callbacks + self._callbacks = {} + self._callbackCount = 0 + for (var requestId in callbacks) { + callbacks[requestId](error) + } } + + // error some callbacks immediately + _error_callbacks() + + // close the connection when it becomes available + self._connection(function(err, connection) { + delete self._type + self.mongolian._replicaSet.emit('lost', self) + + // error any new callbacks + _error_callbacks() + + if (connection) { + connection.close() + } + + if (callback) { + callback(err) + } + }) } From 07cde56cdaefbdf5eaad2a8e5deb5914701825db Mon Sep 17 00:00:00 2001 From: Jae Kwon Date: Sat, 24 Dec 2011 16:38:33 -0800 Subject: [PATCH 2/2] added ability to debug user-callback errors --- lib/server.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/server.js b/lib/server.js index 11e6557..5edf6cc 100644 --- a/lib/server.js +++ b/lib/server.js @@ -237,7 +237,7 @@ function MongolianServer(mongolian, url) { connected = true callback(null, connection) }) - connection.on("message", function(message) { + connection.on('message', function(message) { var reply = new mongo.MongoReply reply.parseHeader(message, bsonSerializer) if (reply.messageLength != message.length) { @@ -249,11 +249,18 @@ function MongolianServer(mongolian, url) { delete self._callbacks[reply.responseTo] self._callbackCount-- reply.parseBody(message, bsonSerializer, null, function() { - cb(null,reply) + try { + cb(null,reply) + } catch(err) { + connection.emit('callbackError', err) + } }) } } }) + connection.on('callbackError', function(error) { + mongolian.log.error(self+": CallbackError: "+error.stack) + }) connection.start() })