Browse Source

Fixed CSHARP-323. Don't let unhandled exceptions leave TimerCallback.

pull/69/head
rstam 14 years ago
parent
commit
8453358b46
  1. 14
      Driver/Internal/MongoConnectionPool.cs

14
Driver/Internal/MongoConnectionPool.cs

@ -249,11 +249,6 @@ namespace MongoDB.Driver.Internal {
private void TimerCallback(
object state // not used
) {
var server = serverInstance.Server;
if (server.State == MongoServerState.Disconnected || server.State == MongoServerState.Disconnecting) {
return;
}
// if another timer callback occurs before we are done with the first one just exit
if (inTimerCallback) {
// Console.WriteLine("MongoConnectionPool[{0}] TimerCallback skipped because previous callback has not completed.", serverInstance.SequentialId);
@ -263,6 +258,11 @@ namespace MongoDB.Driver.Internal {
// Console.WriteLine("MongoConnectionPool[{0}]: TimerCallback called.", serverInstance.SequentialId);
inTimerCallback = true;
try {
var server = serverInstance.Server;
if (server.State == MongoServerState.Disconnected || server.State == MongoServerState.Disconnecting) {
return;
}
// on every timer callback verify the state of the server instance because it might have changed
// we do this even if this one instance is currently Disconnected so we can discover when a disconnected instance comes back online
serverInstance.VerifyState();
@ -300,6 +300,10 @@ namespace MongoDB.Driver.Internal {
if (poolSize < server.Settings.MinConnectionPoolSize) {
ThreadPool.QueueUserWorkItem(EnsureMinConnectionPoolSizeWorkItem, generationId);
}
} catch {
// don't let any unhandled exceptions leave TimerCallback
// server state will already have been change by earlier exception handling
// TODO: log exception?
} finally {
inTimerCallback = false;
}

Loading…
Cancel
Save