本文整理汇总了C++中DBConnectionPool类的典型用法代码示例。如果您正苦于以下问题:C++ DBConnectionPool类的具体用法?C++ DBConnectionPool怎么用?C++ DBConnectionPool使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了DBConnectionPool类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: isConnectionGood
bool DBConnectionPool::isConnectionGood(const string& hostName, DBClientBase* conn) {
if (conn == NULL) {
return false;
}
if (conn->isFailed()) {
return false;
}
{
scoped_lock sl(_mutex);
PoolForHost& pool = _pools[PoolKey(hostName, conn->getSoTimeout())];
if (pool.isBadSocketCreationTime(conn->getSockCreationMicroSec())) {
return false;
}
}
return true;
}
示例2: defaultIsVersionable
namespace mongo {
// The code in shardconnection may run not only in mongos context. When elsewhere, chunk shard versioning
// is disabled. To enable chunk shard versioning, provide the check/resetShardVerionCB's below
//
// TODO: better encapsulate this mechanism.
bool defaultIsVersionable( DBClientBase * conn ){
return false;
}
bool defaultInitShardVersion( DBClientBase & conn, BSONObj& result ){
return false;
}
bool defaultForceRemoteCheckShardVersion( const string& ns ){
return true;
}
bool defaultCheckShardVersion( DBClientBase & conn , const string& ns , bool authoritative , int tryNumber ) {
// no-op in mongod
return false;
}
void defaultResetShardVersion( DBClientBase * conn ) {
// no-op in mongod
}
boost::function1<bool, DBClientBase* > isVersionableCB = defaultIsVersionable;
boost::function2<bool, DBClientBase&, BSONObj& > initShardVersionCB = defaultInitShardVersion;
boost::function1<bool, const string& > forceRemoteCheckShardVersionCB = defaultForceRemoteCheckShardVersion;
boost::function4<bool, DBClientBase&, const string&, bool, int> checkShardVersionCB = defaultCheckShardVersion;
boost::function1<void, DBClientBase*> resetShardVersionCB = defaultResetShardVersion;
DBConnectionPool shardConnectionPool;
// Only print the non-top-level-shard-conn warning once if not verbose
volatile bool printedShardConnWarning = false;
/**
* holds all the actual db connections for a client to various servers
* 1 per thread, so doesn't have to be thread safe
*/
class ClientConnections : boost::noncopyable {
public:
struct Status : boost::noncopyable {
Status() : created(0), avail(0) {}
long long created;
DBClientBase* avail;
};
ClientConnections() {}
~ClientConnections() {
for ( HostMap::iterator i=_hosts.begin(); i!=_hosts.end(); ++i ) {
string addr = i->first;
Status* ss = i->second;
assert( ss );
if ( ss->avail ) {
/* if we're shutting down, don't want to initiate release mechanism as it is slow,
and isn't needed since all connections will be closed anyway */
if ( inShutdown() ) {
if( isVersionableCB( ss->avail ) ) resetShardVersionCB( ss->avail );
delete ss->avail;
}
else
release( addr , ss->avail );
ss->avail = 0;
}
delete ss;
}
_hosts.clear();
}
DBClientBase * get( const string& addr , const string& ns, bool ignoreDirect = false ) {
_check( ns );
// Determine if non-shard conn is RS member for warning
// All shards added to _hosts if not present in _check()
if( ( logLevel >= 1 || ! printedShardConnWarning ) && ! ignoreDirect && _hosts.find( addr ) == _hosts.end() ){
vector<Shard> all;
Shard::getAllShards( all );
bool isRSMember = false;
string parentShard;
for ( unsigned i = 0; i < all.size(); i++ ) {
string connString = all[i].getConnString();
if( connString.find( addr ) != string::npos && connString.find( '/' ) != string::npos ){
isRSMember = true;
parentShard = connString;
break;
}
}
if( isRSMember ){
printedShardConnWarning = true;
warning() << "adding shard sub-connection " << addr << " (parent " << parentShard << ") as sharded, this is safe but unexpected" << endl;
//.........这里部分代码省略.........
示例3: ActiveClientConnections
namespace mongo {
DBConnectionPool shardConnectionPool;
class ClientConnections;
/**
* Class which tracks ClientConnections (the client connection pool) for each incoming
* connection, allowing stats access.
*/
class ActiveClientConnections {
public:
ActiveClientConnections() : _mutex( "ActiveClientConnections" ) {
}
void add( const ClientConnections* cc ) {
scoped_lock lock( _mutex );
_clientConnections.insert( cc );
}
void remove( const ClientConnections* cc ) {
scoped_lock lock( _mutex );
_clientConnections.erase( cc );
}
// Implemented after ClientConnections
void appendInfo( BSONObjBuilder& b );
private:
mongo::mutex _mutex;
set<const ClientConnections*> _clientConnections;
} activeClientConnections;
/**
* Command to allow access to the sharded conn pool information in mongos.
* TODO: Refactor with other connection pooling changes
*/
class ShardedPoolStats : public Command {
public:
ShardedPoolStats() : Command( "shardConnPoolStats" ) {}
virtual void help( stringstream &help ) const { help << "stats about the shard connection pool"; }
virtual LockType locktype() const { return NONE; }
virtual bool slaveOk() const { return true; }
// Same privs as connPoolStats
virtual void addRequiredPrivileges( const std::string& dbname,
const BSONObj& cmdObj,
std::vector<Privilege>* out )
{
ActionSet actions;
actions.addAction( ActionType::connPoolStats );
out->push_back( Privilege( AuthorizationManager::SERVER_RESOURCE_NAME, actions ) );
}
virtual bool run ( const string&, mongo::BSONObj&, int, std::string&, mongo::BSONObjBuilder& result, bool ) {
// Base pool info
shardConnectionPool.appendInfo( result );
// Thread connection info
activeClientConnections.appendInfo( result );
return true;
}
} shardedPoolStatsCmd;
/**
* holds all the actual db connections for a client to various servers
* 1 per thread, so doesn't have to be thread safe
*/
class ClientConnections : boost::noncopyable {
public:
struct Status : boost::noncopyable {
Status() : created(0), avail(0) {}
// May be read concurrently, but only written from
// this thread.
long long created;
DBClientBase* avail;
};
// Gets or creates the status object for the host
Status* _getStatus( const string& addr ) {
scoped_spinlock lock( _lock );
Status* &temp = _hosts[addr];
if ( ! temp )
temp = new Status();
return temp;
}
ClientConnections() {
// Start tracking client connections
activeClientConnections.add( this );
}
~ClientConnections() {
// Stop tracking these client connections
activeClientConnections.remove( this );
//.........这里部分代码省略.........
示例4: add
//.........这里部分代码省略.........
void release(const string& addr, DBClientBase* conn) {
shardConnectionPool.release(addr, conn);
}
/**
* Appends info about the client connection pool to a BOBuilder
* Safe to call with activeClientConnections lock
*/
void appendInfo(BSONObjBuilder& b) const {
scoped_spinlock lock(_lock);
BSONArrayBuilder hostsArrB(b.subarrayStart("hosts"));
for (HostMap::const_iterator i = _hosts.begin(); i != _hosts.end(); ++i) {
BSONObjBuilder bb(hostsArrB.subobjStart());
bb.append("host", i->first);
bb.append("created", i->second->created);
bb.appendBool("avail", static_cast<bool>(i->second->avail));
bb.done();
}
hostsArrB.done();
BSONArrayBuilder nsArrB(b.subarrayStart("seenNS"));
for (set<string>::const_iterator i = _seenNS.begin(); i != _seenNS.end(); ++i) {
nsArrB.append(*i);
}
nsArrB.done();
}
// Protects only the creation of new entries in the _hosts and _seenNS map
// from external threads. Reading _hosts / _seenNS in this thread doesn't
// need protection.
mutable SpinLock _lock;
typedef map<string, Status*, DBConnectionPool::serverNameCompare> HostMap;
HostMap _hosts;
set<string> _seenNS;
/**
* Clears the connections kept by this pool (ie, not including the global pool)
*/
void clearPool() {
for (HostMap::iterator iter = _hosts.begin(); iter != _hosts.end(); ++iter) {
if (iter->second->avail != NULL) {
delete iter->second->avail;
}
delete iter->second;
}
_hosts.clear();
}
void forgetNS(const string& ns) {
scoped_spinlock lock(_lock);
_seenNS.erase(ns);
}
// -----
static thread_specific_ptr<ClientConnections> _perThread;
static ClientConnections* threadInstance() {
ClientConnections* cc = _perThread.get();
if (!cc) {
cc = new ClientConnections();
_perThread.reset(cc);
}
示例5: L
namespace mongo {
DBConnectionPool pool;
DBClientBase* DBConnectionPool::get(const string& host) {
boostlock L(poolMutex);
PoolForHost *&p = pools[host];
if ( p == 0 )
p = new PoolForHost();
if ( p->pool.empty() ) {
string errmsg;
DBClientBase *c;
if( host.find(',') == string::npos ) {
DBClientConnection *cc = new DBClientConnection(true);
if ( !cc->connect(host.c_str(), errmsg) ) {
delete cc;
uassert( (string)"dbconnectionpool: connect failed" + host , false);
return 0;
}
c = cc;
}
else {
DBClientPaired *p = new DBClientPaired();
if( !p->connect(host) ) {
delete p;
uassert( (string)"dbconnectionpool: connect failed [2] " + host , false);
return 0;
}
c = p;
}
return c;
}
DBClientBase *c = p->pool.front();
p->pool.pop();
return c;
}
void DBConnectionPool::flush(){
boostlock L(poolMutex);
for ( map<string,PoolForHost*>::iterator i = pools.begin(); i != pools.end(); i++ ){
PoolForHost* p = i->second;
vector<DBClientBase*> all;
while ( ! p->pool.empty() ){
DBClientBase * c = p->pool.front();
p->pool.pop();
all.push_back( c );
bool res;
c->isMaster( res );
}
for ( vector<DBClientBase*>::iterator i=all.begin(); i != all.end(); i++ ){
p->pool.push( *i );
}
}
}
class PoolFlushCmd : public Command {
public:
PoolFlushCmd() : Command( "connpoolsync" ){}
virtual bool run(const char*, mongo::BSONObj&, std::string&, mongo::BSONObjBuilder& result, bool){
pool.flush();
result << "ok" << 1;
return true;
}
virtual bool slaveOk(){
return true;
}
} poolFlushCmd;
} // namespace mongo
示例6: while
namespace mongo {
// ------ PoolForHost ------
PoolForHost::~PoolForHost() {
while ( ! _pool.empty() ) {
StoredConnection sc = _pool.top();
delete sc.conn;
_pool.pop();
}
}
void PoolForHost::done( DBConnectionPool * pool, DBClientBase * c ) {
if ( _pool.size() >= _maxPerHost ) {
pool->onDestroy( c );
delete c;
}
else {
_pool.push(c);
}
}
DBClientBase * PoolForHost::get( DBConnectionPool * pool , double socketTimeout ) {
time_t now = time(0);
while ( ! _pool.empty() ) {
StoredConnection sc = _pool.top();
_pool.pop();
if ( ! sc.ok( now ) ) {
pool->onDestroy( sc.conn );
delete sc.conn;
continue;
}
assert( sc.conn->getSoTimeout() == socketTimeout );
return sc.conn;
}
return NULL;
}
void PoolForHost::flush() {
vector<StoredConnection> all;
while ( ! _pool.empty() ) {
StoredConnection c = _pool.top();
_pool.pop();
all.push_back( c );
bool res;
c.conn->isMaster( res );
}
for ( vector<StoredConnection>::iterator i=all.begin(); i != all.end(); ++i ) {
_pool.push( *i );
}
}
void PoolForHost::getStaleConnections( vector<DBClientBase*>& stale ) {
time_t now = time(0);
vector<StoredConnection> all;
while ( ! _pool.empty() ) {
StoredConnection c = _pool.top();
_pool.pop();
if ( c.ok( now ) )
all.push_back( c );
else
stale.push_back( c.conn );
}
for ( size_t i=0; i<all.size(); i++ ) {
_pool.push( all[i] );
}
}
PoolForHost::StoredConnection::StoredConnection( DBClientBase * c ) {
conn = c;
when = time(0);
}
bool PoolForHost::StoredConnection::ok( time_t now ) {
// if connection has been idle for 30 minutes, kill it
return ( now - when ) < 1800;
}
void PoolForHost::createdOne( DBClientBase * base) {
if ( _created == 0 )
_type = base->type();
_created++;
}
unsigned PoolForHost::_maxPerHost = 50;
// ------ DBConnectionPool ------
//.........这里部分代码省略.........
示例7: while
namespace mongo {
// ------ PoolForHost ------
PoolForHost::~PoolForHost(){
while ( ! _pool.empty() ){
StoredConnection sc = _pool.top();
delete sc.conn;
_pool.pop();
}
}
void PoolForHost::done( DBClientBase * c ) {
_pool.push(c);
}
DBClientBase * PoolForHost::get() {
time_t now = time(0);
while ( ! _pool.empty() ){
StoredConnection sc = _pool.top();
_pool.pop();
if ( sc.ok( now ) )
return sc.conn;
delete sc.conn;
}
return NULL;
}
void PoolForHost::flush() {
vector<StoredConnection> all;
while ( ! _pool.empty() ){
StoredConnection c = _pool.top();
_pool.pop();
all.push_back( c );
bool res;
c.conn->isMaster( res );
}
for ( vector<StoredConnection>::iterator i=all.begin(); i != all.end(); ++i ){
_pool.push( *i );
}
}
PoolForHost::StoredConnection::StoredConnection( DBClientBase * c ){
conn = c;
when = time(0);
}
bool PoolForHost::StoredConnection::ok( time_t now ){
// if connection has been idle for an hour, kill it
return ( now - when ) < 3600;
}
// ------ DBConnectionPool ------
DBConnectionPool pool;
DBClientBase* DBConnectionPool::_get(const string& ident) {
scoped_lock L(_mutex);
PoolForHost& p = _pools[ident];
return p.get();
}
DBClientBase* DBConnectionPool::_finishCreate( const string& host , DBClientBase* conn ){
{
scoped_lock L(_mutex);
PoolForHost& p = _pools[host];
p.createdOne();
}
onCreate( conn );
onHandedOut( conn );
return conn;
}
DBClientBase* DBConnectionPool::get(const ConnectionString& url) {
DBClientBase * c = _get( url.toString() );
if ( c ){
onHandedOut( c );
return c;
}
string errmsg;
c = url.connect( errmsg );
uassert( 13328 , _name + ": connect failed " + url.toString() + " : " + errmsg , c );
return _finishCreate( url.toString() , c );
}
DBClientBase* DBConnectionPool::get(const string& host) {
DBClientBase * c = _get( host );
if ( c ){
onHandedOut( c );
return c;
}
string errmsg;
//.........这里部分代码省略.........
示例8: checkVersions
void checkVersions( const string& ns ) {
vector<Shard> all;
Shard::getAllShards( all );
// Now only check top-level shard connections
for ( unsigned i=0; i<all.size(); i++ ) {
Shard& shard = all[i];
try {
string sconnString = shard.getConnString();
Status* s = _getStatus( sconnString );
if( ! s->avail ) {
s->avail = shardConnectionPool.get( sconnString );
s->created++; // After, so failed creation doesn't get counted
}
versionManager.checkShardVersionCB( s->avail, ns, false, 1 );
}
catch ( const std::exception& e ) {
warning() << "problem while initially checking shard versions on"
<< " " << shard.getName() << causedBy(e) << endl;
throw;
}
}
}
示例9: get
DBClientBase * get( const string& addr , const string& ns ) {
_check( ns );
Status* s = _getStatus( addr );
auto_ptr<DBClientBase> c; // Handles cleanup if there's an exception thrown
if ( s->avail ) {
c.reset( s->avail );
s->avail = 0;
shardConnectionPool.onHandedOut( c.get() ); // May throw an exception
} else {
c.reset( shardConnectionPool.get( addr ) );
s->created++; // After, so failed creation doesn't get counted
}
return c.release();
}
示例10: checkVersions
void checkVersions( const string& ns ) {
vector<Shard> all;
Shard::getAllShards( all );
// Don't report exceptions here as errors in GetLastError
LastError::Disabled ignoreForGLE(lastError.get(false));
// Now only check top-level shard connections
for ( unsigned i=0; i<all.size(); i++ ) {
Shard& shard = all[i];
try {
string sconnString = shard.getConnString();
Status* s = _getStatus( sconnString );
if( ! s->avail ) {
s->avail = shardConnectionPool.get( sconnString );
s->created++; // After, so failed creation doesn't get counted
}
versionManager.checkShardVersionCB( s->avail, ns, false, 1 );
}
catch ( const DBException& ex ) {
warning() << "problem while initially checking shard versions on" << " "
<< shard.getName() << causedBy( ex ) << endl;
// NOTE: This is only a heuristic, to avoid multiple stale version retries
// across multiple shards, and does not affect correctness.
}
}
}
示例11: run
virtual bool run( OperationContext* txn, const string&, mongo::BSONObj&, int, std::string&, mongo::BSONObjBuilder& result, bool ) {
// Base pool info
shardConnectionPool.appendInfo( result );
// Thread connection info
activeClientConnections.appendInfo( result );
return true;
}
示例12: checkVersions
void checkVersions( const string& ns ) {
vector<Shard> all;
Shard::getAllShards( all );
// Now only check top-level shard connections
for ( unsigned i=0; i<all.size(); i++ ) {
Shard& shard = all[i];
try {
string sconnString = shard.getConnString();
Status* &s = _hosts[sconnString];
if ( ! s ){
s = new Status();
}
if( ! s->avail )
s->avail = shardConnectionPool.get( sconnString );
versionManager.checkShardVersionCB( s->avail, ns, false, 1 );
} catch(...) {
LOGATMOST(2) << "exception in checkAllVersions shard:" << shard.getName() << endl;
throw;
}
}
}
示例13: get
DBClientBase * get( const string& addr , const string& ns, bool ignoreDirect = false ) {
_check( ns );
// Determine if non-shard conn is RS member for warning
// All shards added to _hosts if not present in _check()
if( ( logLevel >= 1 || ! printedShardConnWarning ) && ! ignoreDirect && _hosts.find( addr ) == _hosts.end() ){
vector<Shard> all;
Shard::getAllShards( all );
bool isRSMember = false;
string parentShard;
for ( unsigned i = 0; i < all.size(); i++ ) {
string connString = all[i].getConnString();
if( connString.find( addr ) != string::npos && connString.find( '/' ) != string::npos ){
isRSMember = true;
parentShard = connString;
break;
}
}
if( isRSMember ){
printedShardConnWarning = true;
warning() << "adding shard sub-connection " << addr << " (parent " << parentShard << ") as sharded, this is safe but unexpected" << endl;
printStackTrace();
}
}
Status* &s = _hosts[addr];
if ( ! s )
s = new Status();
if ( s->avail ) {
DBClientBase* c = s->avail;
s->avail = 0;
shardConnectionPool.onHandedOut( c );
return c;
}
s->created++;
return shardConnectionPool.get( addr );
}
示例14: get
DBClientBase * get( const string& addr , const string& ns ) {
_check( ns );
Status* &s = _hosts[addr];
if ( ! s )
s = new Status();
auto_ptr<DBClientBase> c; // Handles cleanup if there's an exception thrown
if ( s->avail ) {
c.reset( s->avail );
s->avail = 0;
shardConnectionPool.onHandedOut( c.get() ); // May throw an exception
} else {
s->created++;
c.reset( shardConnectionPool.get( addr ) );
}
if ( !noauth ) {
c->setAuthenticationTable( ClientBasic::getCurrent()->getAuthenticationInfo()->
getAuthTable() );
}
return c.release();
}
示例15: done
void done( const string& addr , DBClientBase* conn ) {
Status* s = _hosts[addr];
verify( s );
const bool isConnGood = shardConnectionPool.isConnectionGood(addr, conn);
if (s->avail != NULL) {
warning() << "Detected additional sharded connection in the "
"thread local pool for " << addr << endl;
if (DBException::traceExceptions) {
// There shouldn't be more than one connection checked out to the same
// host on the same thread.
printStackTrace();
}
if (!isConnGood) {
delete s->avail;
s->avail = NULL;
}
// Let the internal pool handle the bad connection, this can also
// update the lower bounds for the known good socket creation time
// for this host.
release(addr, conn);
return;
}
if (!isConnGood) {
// Let the internal pool handle the bad connection.
release(addr, conn);
return;
}
// Note: Although we try our best to clear bad connections as much as possible,
// some of them can still slip through because of how ClientConnections are being
// used - as thread local variables. This means that threads won't be able to
// see the s->avail connection of other threads.
s->avail = conn;
}