diff options
author | Spencer T Brody <spencer@mongodb.com> | 2015-04-15 13:24:09 -0400 |
---|---|---|
committer | Spencer T Brody <spencer@mongodb.com> | 2015-04-16 16:02:48 -0400 |
commit | 492e26db0702abd8b44794fb718f76b26afecefd (patch) | |
tree | 8b1878dc5d8e2fe17b5d5ac34160cb639d7bab6e /src/mongo/client/connection_string_connect.cpp | |
parent | aa303eb3b5898842a0f5730472413d2b2fdc0930 (diff) | |
download | mongo-492e26db0702abd8b44794fb718f76b26afecefd.tar.gz |
SERVER-18070 Split ConnectionString out into its own library
Diffstat (limited to 'src/mongo/client/connection_string_connect.cpp')
-rw-r--r-- | src/mongo/client/connection_string_connect.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/src/mongo/client/connection_string_connect.cpp b/src/mongo/client/connection_string_connect.cpp new file mode 100644 index 00000000000..303f4ef9fa0 --- /dev/null +++ b/src/mongo/client/connection_string_connect.cpp @@ -0,0 +1,111 @@ +/* Copyright 2009 10gen Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the GNU Affero General Public License in all respects + * for all of the code used other than as permitted herein. If you modify + * file(s) with this exception, you may extend this exception to your + * version of the file(s), but you are not obligated to do so. If you do not + * wish to do so, delete this exception statement from your version. If you + * delete this exception statement from all source files in the program, + * then also delete it in the license file. + */ + +#define MONGO_LOG_DEFAULT_COMPONENT ::mongo::logger::LogComponent::kNetwork + +#include "mongo/platform/basic.h" + +#include "mongo/client/connection_string.h" + +#include <list> + +#include "mongo/client/dbclientinterface.h" +#include "mongo/client/dbclient_rs.h" +#include "mongo/client/syncclusterconnection.h" +#include "mongo/util/assert_util.h" +#include "mongo/util/log.h" + +namespace mongo { + + boost::mutex ConnectionString::_connectHookMutex; + ConnectionString::ConnectionHook* ConnectionString::_connectHook = NULL; + + DBClientBase* ConnectionString::connect( std::string& errmsg, double socketTimeout ) const { + + switch ( _type ) { + case MASTER: { + DBClientConnection * c = new DBClientConnection(true); + c->setSoTimeout( socketTimeout ); + LOG(1) << "creating new connection to:" << _servers[0]; + if ( ! c->connect( _servers[0] , errmsg ) ) { + delete c; + return 0; + } + LOG(1) << "connected connection!"; + return c; + } + + case PAIR: + case SET: { + DBClientReplicaSet * set = new DBClientReplicaSet( _setName , _servers , socketTimeout ); + if( ! set->connect() ) { + delete set; + errmsg = "connect failed to replica set "; + errmsg += toString(); + return 0; + } + return set; + } + + case SYNC: { + // TODO , don't copy + std::list<HostAndPort> l; + for ( unsigned i=0; i<_servers.size(); i++ ) + l.push_back( _servers[i] ); + SyncClusterConnection* c = new SyncClusterConnection( l, socketTimeout ); + return c; + } + + case CUSTOM: { + + // Lock in case other things are modifying this at the same time + boost::lock_guard<boost::mutex> lk( _connectHookMutex ); + + // Allow the replacement of connections with other connections - useful for testing. + + uassert( 16335, "custom connection to " + this->toString() + + " specified with no connection hook", _connectHook ); + + // Double-checked lock, since this will never be active during normal operation + DBClientBase* replacementConn = _connectHook->connect( *this, errmsg, socketTimeout ); + + log() << "replacing connection to " << this->toString() << " with " + << ( replacementConn ? replacementConn->getServerAddress() : "(empty)" ); + + return replacementConn; + } + + case INVALID: + throw UserException( 13421 , "trying to connect to invalid ConnectionString" ); + break; + } + + verify( 0 ); + return 0; + } + +} // namepspace mongo |