internal MongoConnection AcquireConnection(MongoDatabase database, MongoServerInstance serverInstance) { MongoConnection requestConnection = null; lock (_serverLock) { // if a thread has called RequestStart it wants all operations to take place on the same connection int threadId = Thread.CurrentThread.ManagedThreadId; Request request; if (_requests.TryGetValue(threadId, out request)) { if (request.Connection.ServerInstance != serverInstance) { var message = string.Format( "AcquireConnection called for server instance '{0}' but thread is in a RequestStart for server instance '{1}'.", serverInstance.Address, request.Connection.ServerInstance.Address); throw new MongoConnectionException(message); } requestConnection = request.Connection; } } // check authentication outside of lock if (requestConnection != null) { requestConnection.CheckAuthentication(database); // will throw exception if authentication fails return(requestConnection); } return(serverInstance.AcquireConnection(database)); }
// internal methods internal MongoConnection AcquireConnection(MongoDatabase database, ReadPreference readPreference) { MongoConnection requestConnection = null; lock (_serverLock) { // if a thread has called RequestStart it wants all operations to take place on the same connection int threadId = Thread.CurrentThread.ManagedThreadId; Request request; if (_requests.TryGetValue(threadId, out request)) { if (!readPreference.MatchesInstance(request.Connection.ServerInstance)) { throw new InvalidOperationException("The thread is in a RequestStart and the current server instance is not a match for the supplied read preference."); } requestConnection = request.Connection; } } // check authentication outside of lock if (requestConnection != null) { requestConnection.CheckAuthentication(database); // will throw exception if authentication fails return(requestConnection); } var serverInstance = _serverProxy.ChooseServerInstance(readPreference); return(serverInstance.AcquireConnection(database)); }