本文整理汇总了C++中ReplicaSetMonitorPtr类的典型用法代码示例。如果您正苦于以下问题:C++ ReplicaSetMonitorPtr类的具体用法?C++ ReplicaSetMonitorPtr怎么用?C++ ReplicaSetMonitorPtr使用的例子?那么, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了ReplicaSetMonitorPtr类的15个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: while
void ReplicaSetMonitor::checkAll() {
set<string> seen;
while ( true ) {
ReplicaSetMonitorPtr m;
{
for ( map<string,ReplicaSetMonitorPtr>::iterator i=_sets.begin(); i!=_sets.end(); ++i ) {
string name = i->first;
if ( seen.count( name ) )
continue;
LOG(0) << "checking replica set: " << name << endl;
seen.insert( name );
m = i->second;
break;
}
}
if ( ! m )
break;
m->check();
}
}
示例2: bb
void DBConnectionPool::appendInfo( BSONObjBuilder& b ) {
int avail = 0;
long long created = 0;
map<ConnectionString::ConnectionType,long long> createdByType;
BSONObjBuilder bb( b.subobjStart( "hosts" ) );
{
boost::lock_guard<boost::mutex> lk( _mutex );
for ( PoolMap::iterator i=_pools.begin(); i!=_pools.end(); ++i ) {
if ( i->second.numCreated() == 0 )
continue;
string s = str::stream() << i->first.ident << "::" << i->first.timeout;
BSONObjBuilder temp( bb.subobjStart( s ) );
temp.append( "available" , i->second.numAvailable() );
temp.appendNumber( "created" , i->second.numCreated() );
temp.done();
avail += i->second.numAvailable();
created += i->second.numCreated();
long long& x = createdByType[i->second.type()];
x += i->second.numCreated();
}
}
bb.done();
// Always report all replica sets being tracked
set<string> replicaSets = ReplicaSetMonitor::getAllTrackedSets();
BSONObjBuilder setBuilder( b.subobjStart( "replicaSets" ) );
for ( set<string>::iterator i=replicaSets.begin(); i!=replicaSets.end(); ++i ) {
string rs = *i;
ReplicaSetMonitorPtr m = ReplicaSetMonitor::get( rs );
if ( ! m ) {
warning() << "no monitor for set: " << rs << endl;
continue;
}
BSONObjBuilder temp( setBuilder.subobjStart( rs ) );
m->appendInfo( temp );
temp.done();
}
setBuilder.done();
{
BSONObjBuilder temp( bb.subobjStart( "createdByType" ) );
for ( map<ConnectionString::ConnectionType,long long>::iterator i=createdByType.begin(); i!=createdByType.end(); ++i ) {
temp.appendNumber( ConnectionString::typeToString( i->first ) , i->second );
}
temp.done();
}
b.append( "totalAvailable" , avail );
b.appendNumber( "totalCreated" , created );
}
示例3: LOG
DBClientConnection* DBClientReplicaSet::selectNodeUsingTags(
shared_ptr<ReadPreferenceSetting> readPref) {
if (!shouldReevaluate() && checkLastHost(readPref.get())) {
LOG( 3 ) << "dbclient_rs selecting compatible last used node " << _lastSlaveOkHost
<< endl;
return _lastSlaveOkConn.get();
}
ReplicaSetMonitorPtr monitor = _getMonitor();
_lastSlaveOkHost = monitor->getHostOrRefresh(*readPref);
if ( _lastSlaveOkHost.empty() ){
LOG( 3 ) << "dbclient_rs no compatible node found" << endl;
return NULL;
}
_lastReadPref = readPref;
// Primary connection is special because it is the only connection that is
// versioned in mongos. Therefore, we have to make sure that this object
// maintains only one connection to the primary and use that connection
// every time we need to talk to the primary.
if (monitor->isPrimary(_lastSlaveOkHost)) {
checkMaster();
_lastSlaveOkConn = _master;
_lastSlaveOkHost = _masterHost; // implied, but still assign just to be safe
LOG( 3 ) << "dbclient_rs selecting primary node " << _lastSlaveOkHost << endl;
return _master.get();
}
string errmsg;
ConnectionString connStr(_lastSlaveOkHost);
// Needs to perform a dynamic_cast because we need to set the replSet
// callback. We should eventually not need this after we remove the
// callback.
DBClientConnection* newConn = dynamic_cast<DBClientConnection*>(
connStr.connect(errmsg, _so_timeout));
// Assert here instead of returning NULL since the contract of this method is such
// that returning NULL means none of the nodes were good, which is not the case here.
uassert(16532, str::stream() << "Failed to connect to " << _lastSlaveOkHost.toString(),
newConn != NULL);
_lastSlaveOkConn.reset(newConn);
_lastSlaveOkConn->setReplSetClientCallback(this);
_lastSlaveOkConn->setRunCommandHook(_runCommandHook);
_lastSlaveOkConn->setPostRunCommandHook(_postRunCommandHook);
_auth(_lastSlaveOkConn.get());
LOG( 3 ) << "dbclient_rs selecting node " << _lastSlaveOkHost << endl;
return _lastSlaveOkConn.get();
}
示例4: getServerAddress
// This can't throw an exception because it is called in the destructor of ScopedDbConnection
string DBClientReplicaSet::getServerAddress() const {
ReplicaSetMonitorPtr rsm = ReplicaSetMonitor::get( _setName, true );
if ( !rsm ) {
warning() << "Trying to get server address for DBClientReplicaSet, but no "
"ReplicaSetMonitor exists for " << _setName << endl;
return str::stream() << _setName << "/" ;
}
return rsm->getServerAddress();
}
示例5: log
void DBClientReplicaSet::isntMaster() {
log() << "got not master for: " << _masterHost << endl;
// Can't use _getMonitor because that will create a new monitor from the cached seed if
// the monitor doesn't exist.
ReplicaSetMonitorPtr monitor = ReplicaSetMonitor::get( _setName );
if ( monitor ) {
monitor->failedHost( _masterHost );
}
_master.reset();
}
示例6: if
void ParallelSortClusteredCursor::setupVersionAndHandleSlaveOk(
OperationContext* txn,
PCStatePtr state,
const ShardId& shardId,
std::shared_ptr<Shard> primary,
const NamespaceString& ns,
const string& vinfo,
std::shared_ptr<ChunkManager> manager) {
if (manager) {
state->manager = manager;
} else if (primary) {
state->primary = primary;
}
verify(!primary || shardId == primary->getId());
// Setup conn
if (!state->conn) {
const auto shard = grid.shardRegistry()->getShard(txn, shardId);
state->conn.reset(new ShardConnection(shard->getConnString(), ns.ns(), manager));
}
const DBClientBase* rawConn = state->conn->getRawConn();
bool allowShardVersionFailure = rawConn->type() == ConnectionString::SET &&
DBClientReplicaSet::isSecondaryQuery(_qSpec.ns(), _qSpec.query(), _qSpec.options());
bool connIsDown = rawConn->isFailed();
if (allowShardVersionFailure && !connIsDown) {
// If the replica set connection believes that it has a valid primary that is up,
// confirm that the replica set monitor agrees that the suspected primary is indeed up.
const DBClientReplicaSet* replConn = dynamic_cast<const DBClientReplicaSet*>(rawConn);
invariant(replConn);
ReplicaSetMonitorPtr rsMonitor = ReplicaSetMonitor::get(replConn->getSetName());
if (!rsMonitor->isHostUp(replConn->getSuspectedPrimaryHostAndPort())) {
connIsDown = true;
}
}
if (allowShardVersionFailure && connIsDown) {
// If we're doing a secondary-allowed query and the primary is down, don't attempt to
// set the shard version.
state->conn->donotCheckVersion();
// A side effect of this short circuiting is the mongos will not be able figure out that
// the primary is now up on it's own and has to rely on other threads to refresh node
// states.
OCCASIONALLY {
const DBClientReplicaSet* repl = dynamic_cast<const DBClientReplicaSet*>(rawConn);
dassert(repl);
warning() << "Primary for " << repl->getServerAddress()
<< " was down before, bypassing setShardVersion."
<< " The local replica set view and targeting may be stale.";
}
} else {
示例7: containsNode
bool Shard::containsNode( const string& node ) const {
if ( _addr == node )
return true;
if ( _cs.type() == ConnectionString::SET ) {
ReplicaSetMonitorPtr rs = ReplicaSetMonitor::get( _cs.getSetName(), true );
return rs->contains( node );
}
return false;
}
示例8: replMonitorStats
BSONObj replMonitorStats(const BSONObj& a, void* data) {
uassert(17134, "replMonitorStats requires a single string argument (the ReplSet name)",
a.nFields() == 1 && a.firstElement().type() == String);
ReplicaSetMonitorPtr rsm = ReplicaSetMonitor::get(a.firstElement().valuestrsafe(),true);
if (!rsm) {
return BSON("" << "no ReplSetMonitor exists by that name");
}
BSONObjBuilder result;
rsm->appendInfo(result);
return result.obj();
}
示例9: if
void ParallelSortClusteredCursor::setupVersionAndHandleSlaveOk(
OperationContext* txn,
PCStatePtr state,
const ShardId& shardId,
std::shared_ptr<Shard> primary,
const NamespaceString& ns,
const string& vinfo,
std::shared_ptr<ChunkManager> manager) {
if (manager) {
state->manager = manager;
} else if (primary) {
state->primary = primary;
}
verify(!primary || shardId == primary->getId());
// Setup conn
if (!state->conn) {
const auto shard = uassertStatusOK(Grid::get(txn)->shardRegistry()->getShard(txn, shardId));
state->conn.reset(new ShardConnection(shard->getConnString(), ns.ns(), manager));
}
const DBClientBase* rawConn = state->conn->getRawConn();
bool allowShardVersionFailure = rawConn->type() == ConnectionString::SET &&
DBClientReplicaSet::isSecondaryQuery(_qSpec.ns(), _qSpec.query(), _qSpec.options());
// Skip shard version checking if primary is known to be down.
if (allowShardVersionFailure) {
const DBClientReplicaSet* replConn = dynamic_cast<const DBClientReplicaSet*>(rawConn);
invariant(replConn);
ReplicaSetMonitorPtr rsMonitor = ReplicaSetMonitor::get(replConn->getSetName());
uassert(16388,
str::stream() << "cannot access unknown replica set: " << replConn->getSetName(),
rsMonitor != nullptr);
if (!rsMonitor->isKnownToHaveGoodPrimary()) {
state->conn->donotCheckVersion();
// A side effect of this short circuiting is the mongos will not be able figure out
// that the primary is now up on it's own and has to rely on other threads to refresh
// node states.
OCCASIONALLY {
const DBClientReplicaSet* repl = dynamic_cast<const DBClientReplicaSet*>(rawConn);
dassert(repl);
warning() << "Primary for " << repl->getServerAddress()
<< " was down before, bypassing setShardVersion."
<< " The local replica set view and targeting may be stale.";
}
return;
}
}
示例10: dassert
Status DBClientShardResolver::findMaster( const std::string connString,
ConnectionString* resolvedHost ) {
std::string errMsg;
ConnectionString rawHost = ConnectionString::parse( connString, errMsg );
dassert( errMsg == "" );
dassert( rawHost.type() == ConnectionString::SET
|| rawHost.type() == ConnectionString::MASTER );
if ( rawHost.type() == ConnectionString::MASTER ) {
*resolvedHost = rawHost;
return Status::OK();
}
//
// If we need to, then get the particular node we're targeting in the replica set
//
// Don't create the monitor unless we need to - fast path
ReplicaSetMonitorPtr replMonitor = ReplicaSetMonitor::get(rawHost.getSetName());
if (!replMonitor) {
// Slow path
std::set<HostAndPort> seedServers(rawHost.getServers().begin(),
rawHost.getServers().end());
ReplicaSetMonitor::createIfNeeded(rawHost.getSetName(), seedServers);
replMonitor = ReplicaSetMonitor::get(rawHost.getSetName());
}
if (!replMonitor) {
return Status( ErrorCodes::ReplicaSetNotFound,
string("unknown replica set ") + rawHost.getSetName() );
}
try {
// This can throw when we don't find a master!
HostAndPort masterHostAndPort = replMonitor->getMasterOrUassert();
*resolvedHost = ConnectionString::parse( masterHostAndPort.toString(), errMsg );
dassert( errMsg == "" );
return Status::OK();
}
catch ( const DBException& ) {
return Status( ErrorCodes::HostNotFound,
string("could not contact primary for replica set ")
+ replMonitor->getName() );
}
// Unreachable
dassert( false );
return Status( ErrorCodes::UnknownError, "" );
}
示例11: _getMonitor
DBClientConnection * DBClientReplicaSet::checkMaster() {
ReplicaSetMonitorPtr monitor = _getMonitor();
HostAndPort h = monitor->getMasterOrUassert();
if ( h == _masterHost && _master ) {
// a master is selected. let's just make sure connection didn't die
if ( ! _master->isFailed() )
return _master.get();
monitor->failedHost( _masterHost );
h = monitor->getMasterOrUassert(); // old master failed, try again.
}
_masterHost = h;
ConnectionString connStr(_masterHost);
string errmsg;
DBClientConnection* newConn = NULL;
try {
// Needs to perform a dynamic_cast because we need to set the replSet
// callback. We should eventually not need this after we remove the
// callback.
newConn = dynamic_cast<DBClientConnection*>(
connStr.connect(errmsg, _so_timeout));
}
catch (const AssertionException& ex) {
errmsg = ex.toString();
}
if (newConn == NULL || !errmsg.empty()) {
monitor->failedHost(_masterHost);
uasserted(13639, str::stream() << "can't connect to new replica set master ["
<< _masterHost.toString() << "]"
<< (errmsg.empty()? "" : ", err: ") << errmsg);
}
_master.reset(newConn);
_master->setReplSetClientCallback(this);
_master->setRunCommandHook(_runCommandHook);
_master->setPostRunCommandHook(_postRunCommandHook);
_auth( _master.get() );
return _master.get();
}
示例12: containsNode
bool Shard::containsNode( const string& node ) const {
if ( _addr == node )
return true;
if ( _cs.type() == ConnectionString::SET ) {
ReplicaSetMonitorPtr rs = ReplicaSetMonitor::get( _cs.getSetName(), true );
if (!rs) {
// Possibly still yet to be initialized. See SERVER-8194.
warning() << "Monitor not found for a known shard: " << _cs.getSetName() << endl;
return false;
}
return rs->contains( node );
}
return false;
}
示例13: dassert
Status DBClientShardResolver::findMaster( const std::string connString,
ConnectionString* resolvedHost ) {
std::string errMsg;
ConnectionString rawHost = ConnectionString::parse( connString, errMsg );
dassert( errMsg == "" );
dassert( rawHost.type() == ConnectionString::SET
|| rawHost.type() == ConnectionString::MASTER );
if ( rawHost.type() == ConnectionString::MASTER ) {
*resolvedHost = rawHost;
return Status::OK();
}
//
// If we need to, then get the particular node we're targeting in the replica set
//
// Does not reload the monitor if it doesn't currently exist
ReplicaSetMonitorPtr replMonitor = ReplicaSetMonitor::get( rawHost.getSetName(),
false );
if ( !replMonitor ) {
return Status( ErrorCodes::ReplicaSetNotFound,
string("unknown replica set ") + rawHost.getSetName() );
}
try {
// This can throw when we don't find a master!
HostAndPort masterHostAndPort = replMonitor->getMasterOrUassert();
*resolvedHost = ConnectionString::parse( masterHostAndPort.toString( true ), errMsg );
dassert( errMsg == "" );
return Status::OK();
}
catch ( const DBException& ) {
return Status( ErrorCodes::HostNotFound,
string("could not contact primary for replica set ")
+ replMonitor->getName() );
}
// Unreachable
dassert( false );
return Status( ErrorCodes::UnknownError, "" );
}
示例14: handleNotMasterResponse
void DBClientConnection::handleNotMasterResponse(const BSONObj& replyBody,
StringData errorMsgFieldName) {
const BSONElement errorMsgElem = replyBody[errorMsgFieldName];
const BSONElement codeElem = replyBody["code"];
if (!isNotMasterErrorString(errorMsgElem) &&
!ErrorCodes::isNotMasterError(ErrorCodes::Error(codeElem.numberInt()))) {
return;
}
ReplicaSetMonitorPtr monitor = ReplicaSetMonitor::get(_parentReplSetName);
if (monitor) {
monitor->failedHost(_serverAddress,
{ErrorCodes::NotMaster,
str::stream() << "got not master from: " << _serverAddress
<< " of repl set: "
<< _parentReplSetName});
}
_markFailed(kSetFlag);
}
示例15: TEST
// Ensure nothing breaks when out-of-band failedHost is called during scan
TEST(ReplicaSetMonitorTests, OutOfBandFailedHost) {
SetStatePtr state = boost::make_shared<SetState>("name", basicSeedsSet);
ReplicaSetMonitorPtr rsm = boost::make_shared<ReplicaSetMonitor>(state);
Refresher refresher = rsm->startOrContinueRefresh();
for (size_t i = 0; i != basicSeeds.size(); ++i) {
NextStep ns = refresher.getNextStep();
}
for (size_t i = 0; i != basicSeeds.size(); ++i) {
bool primary = (i == 0);
refresher.receivedIsMaster(basicSeeds[i], -1, BSON(
"setName" << "name"
<< "ismaster" << primary
<< "secondary" << !primary
<< "hosts" << BSON_ARRAY("a" << "b" << "c")
<< "ok" << true
));
if (i >= 1) {
HostAndPort a("a");
rsm->failedHost(a);
Node* node = state->findNode(a);
ASSERT(node);
ASSERT(!node->isUp);
ASSERT(!node->isMaster);
}
else {
Node* node = state->findNode(HostAndPort("a"));
ASSERT(node);
ASSERT(node->isUp);
ASSERT(node->isMaster);
}
}
}