Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        // 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));
        }