Skip to content

Commit 4c1bda0

Browse files
committed
Changing error handling to not catch errors generated from user code.
1 parent 55f9190 commit 4c1bda0

File tree

6 files changed

+44
-69
lines changed

6 files changed

+44
-69
lines changed

lib/mongodb/connection.js

Lines changed: 11 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -184,16 +184,13 @@ var setupConnectionPool = function(self, poolSize, reconnect) {
184184
// Ensure we clean up if needed
185185
try {
186186
self.emit("data", buffer);
187-
} catch(err) {
188-
// debug("====================================================== 0")
189-
self.emit("error", {err:"socketHandler", trace:err, bin:buffer, parseState:conObj});
190-
}
191-
192-
// Reset the variables
193-
conObj.buffer = new Buffer(0); conObj.bytesRead = 0; conObj.sizeOfMessage = 0;
194-
// If message is longer than the current one, keep parsing
195-
if(remainingBytes < result.length) {
196-
receiveListener(result.slice(remainingBytes, result.length), fd);
187+
} finally {
188+
// Reset the variables
189+
conObj.buffer = new Buffer(0); conObj.bytesRead = 0; conObj.sizeOfMessage = 0;
190+
// If message is longer than the current one, keep parsing
191+
if(remainingBytes < result.length) {
192+
receiveListener(result.slice(remainingBytes, result.length), fd);
193+
}
197194
}
198195
}
199196
} else if(conObj != null){
@@ -221,30 +218,17 @@ var setupConnectionPool = function(self, poolSize, reconnect) {
221218
conObj.bytesRead = result.length; conObj.sizeOfMessage = sizeOfMessage;
222219
} else if(sizeOfMessage == result.length) {
223220

224-
// Catches the error, and ensures we do not get a crazy ripple killing the connection
225-
// Ensure we clean up if needed
226-
try {
227-
self.emit("data", result);
228-
} catch(err) {
229-
// debug("====================================================== 1")
230-
self.emit("error", {err:"socketHandler", trace:err, bin:result, parseState:conObj});
231-
}
232-
233-
// self.emit("data", result);
221+
//Try/finally not needed here as there is no more code to be executed afterwards
222+
self.emit("data", result);
234223
} else if(sizeOfMessage < result.length) {
235224

236225
// Catches the error, and ensures we do not get a crazy ripple killing the connection
237226
// Ensure we clean up if needed
238227
try {
239228
self.emit("data", result.slice(0, sizeOfMessage));
240-
} catch(err) {
241-
// debug("====================================================== 2")
242-
self.emit("error", {err:"socketHandler", trace:err, bin:result, parseState:conObj});
229+
} finally {
230+
receiveListener(result.slice(sizeOfMessage, result.length), fd);
243231
}
244-
245-
// self.emit("data", result.slice(0, sizeOfMessage));
246-
// receiveListener(result.slice(sizeOfMessage, result.length), fd);
247-
receiveListener(result.slice(sizeOfMessage, result.length), fd);
248232
}
249233
} else {
250234
conObj.stubBuffer = result;

lib/mongodb/connection/connection.js

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -97,19 +97,13 @@ var dataHandler = function(self) {
9797
// Emit current complete message
9898
try {
9999
self.emit("message", self.buffer);
100-
} catch(err) {
101-
// We got a parse Error fire it off then keep going
102-
self.emit("parseError", {err:"socketHandler", trace:err, bin:buffer, parseState:{
103-
sizeOfMessage:self.sizeOfMessage,
104-
bytesRead:self.bytesRead,
105-
stubBuffer:self.stubBuffer}});
100+
} finally {
101+
// Reset state of buffer
102+
self.buffer = null;
103+
self.sizeOfMessage = 0;
104+
self.bytesRead = 0;
105+
self.stubBuffer = null;
106106
}
107-
108-
// Reset state of buffer
109-
self.buffer = null;
110-
self.sizeOfMessage = 0;
111-
self.bytesRead = 0;
112-
self.stubBuffer = null;
113107
}
114108
} else {
115109
// Stub buffer is kept in case we don't get enough bytes to determine the
@@ -171,18 +165,12 @@ var dataHandler = function(self) {
171165
} else if(sizeOfMessage == data.length) {
172166
try {
173167
emit("message", data);
168+
} finally {
174169
// Reset state of buffer
175170
self.buffer = null;
176171
self.sizeOfMessage = 0;
177172
self.bytesRead = 0;
178173
self.stubBuffer = null;
179-
180-
} catch (err) {
181-
// We got a parse Error fire it off then keep going
182-
self.emit("parseError", {err:"socketHandler", trace:err, bin:buffer, parseState:{
183-
sizeOfMessage:self.sizeOfMessage,
184-
bytesRead:self.bytesRead,
185-
stubBuffer:self.stubBuffer}});
186174
}
187175
}
188176

lib/mongodb/connections/repl_set_servers.js

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -275,19 +275,21 @@ ReplSetServers.prototype.connect = function(parent, callback) {
275275
try {
276276
// Parse the data as a reply object
277277
reply = new MongoReply(parent, message);
278-
// Emit error if there is one
279-
reply.responseHasError ? parent.emit(reply.responseTo.toString(), reply.documents[0], reply) : parent.emit(reply.responseTo.toString(), null, reply);
280278
} catch(err) {
281279
// Catch and emit
282280
var errObj = {err:"unparsable", bin:message, trace:err};
283281
server.logger.error("mongoreplyParserError", errObj);
284282
parent.emit("error", errObj);
285283
}
286284

287-
// Remove the listener
288-
if(parent.notReplied[reply.responseTo.toString()]) {
289-
delete parent.notReplied[reply.responseTo.toString()];
290-
parent.removeListener(reply.responseTo.toString(), parent.listeners(reply.responseTo.toString())[0]);
285+
try{
286+
reply.responseHasError ? parent.emit(reply.responseTo.toString(), reply.documents[0], reply) : parent.emit(reply.responseTo.toString(), null, reply);
287+
} finally {
288+
// Remove the listener
289+
if(parent.notReplied[reply.responseTo.toString()]) {
290+
delete parent.notReplied[reply.responseTo.toString()];
291+
parent.removeListener(reply.responseTo.toString(), parent.listeners(reply.responseTo.toString())[0]);
292+
}
291293
}
292294
});
293295
});

lib/mongodb/connections/server.js

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,18 +90,22 @@ Server.prototype.connect = function(parent, callback) {
9090
// Parse the data as a reply object
9191
reply = new MongoReply(parent, message);
9292
// Emit message
93-
parent.emit(reply.responseTo.toString(), null, reply);
93+
9494
} catch(err) {
9595
// Catch and emit
9696
var errObj = {err:"unparsable", bin:message, trace:err};
9797
server.logger.error("mongoreplyParserError", errObj);
9898
parent.emit("error", errObj);
9999
}
100100

101-
// Remove the listener
102-
if(reply != null && parent.notReplied[reply.responseTo.toString()]) {
103-
delete parent.notReplied[reply.responseTo.toString()];
104-
parent.removeListener(reply.responseTo.toString(), parent.listeners(reply.responseTo.toString())[0]);
101+
try {
102+
parent.emit(reply.responseTo.toString(), null, reply);
103+
} finally {
104+
// Remove the listener
105+
if(reply != null && parent.notReplied[reply.responseTo.toString()]) {
106+
delete parent.notReplied[reply.responseTo.toString()];
107+
parent.removeListener(reply.responseTo.toString(), parent.listeners(reply.responseTo.toString())[0]);
108+
}
105109
}
106110
});
107111

test/exception_handling_test.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ var tests = testCase({
4747
client.createCollection('shouldCorrectlyHandleThrownError', function(err, r) {
4848
try {
4949
client.collection('shouldCorrectlyHandleThrownError', function(err, collection) {
50-
debug(someUndefinedVariable);
50+
test.done();
51+
//debug(someUndefinedVariable);
5152
});
5253
} catch (err) {
5354
test.ok(err != null);
@@ -66,7 +67,8 @@ var tests = testCase({
6667
client.createCollection('shouldCorrectlyHandleThrownErrorInRename', function(err, r) {
6768
client.collection('shouldCorrectlyHandleThrownError', function(err, collection) {
6869
collection.rename("shouldCorrectlyHandleThrownErrorInRename2", function(err, result) {
69-
debug(someUndefinedVariable);
70+
test.done();
71+
//debug(someUndefinedVariable);
7072
})
7173
});
7274
});

test/find_test.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -48,19 +48,14 @@ var tests = testCase({
4848
'Error thrown in handler test': function(test){
4949
// Should not be called
5050
var exceptionHandler = function(exception) {
51-
test.ok(false);
52-
console.log('Exception caught: ' + exception.message);
53-
console.log(inspect(exception.stack.toString()))
51+
numberOfFailsCounter++;
52+
//console.log('Exception caught: ' + exception.message);
53+
//console.log(inspect(exception.stack.toString()))
5454
};
5555

5656
// Number of times we should fail
5757
var numberOfFailsCounter = 0;
5858

59-
// Error handler
60-
client.on("error", function(err) {
61-
numberOfFailsCounter = numberOfFailsCounter + 1;
62-
});
63-
6459
process.on('uncaughtException', exceptionHandler)
6560

6661
client.createCollection('error_test', function(err, collection) {
@@ -78,8 +73,7 @@ var tests = testCase({
7873
var findOne = function(){
7974
collection.findOne({name: 'test1'}, function(err, doc) {
8075
counter++;
81-
process.nextTick(findOne);
82-
76+
8377
if(counter > POOL_SIZE){
8478
process.removeListener('uncaughtException', exceptionHandler);
8579

@@ -89,6 +83,7 @@ var tests = testCase({
8983
test.done();
9084
});
9185
} else {
86+
process.nextTick(findOne);
9287
throw new Error('Some error');
9388
}
9489
});

0 commit comments

Comments
 (0)