Status DatabasesCloner::startup() { UniqueLock lk(_mutex); invariant(!_active); _active = true; if (!_status.isOK() && _status.code() != ErrorCodes::NotYetInitialized) { return _status; } _status = Status::OK(); // Schedule listDatabase command which will kick off the database cloner per result db. Request listDBsReq(_source, "admin", BSON("listDatabases" << true), rpc::ServerSelectionMetadata(true, boost::none).toBSON()); _listDBsScheduler = stdx::make_unique<RemoteCommandRetryScheduler>( _exec, listDBsReq, stdx::bind(&DatabasesCloner::_onListDatabaseFinish, this, stdx::placeholders::_1), RemoteCommandRetryScheduler::makeRetryPolicy( numListDatabasesRetries, executor::RemoteCommandRequest::kNoTimeout, RemoteCommandRetryScheduler::kAllRetriableErrors)); auto s = _listDBsScheduler->startup(); if (!s.isOK()) { _setStatus_inlock(s); _failed_inlock(lk); } return _status; }
// Initial Sync Status DatabasesCloner::start() { _active = true; if (!_status.isOK() && _status.code() != ErrorCodes::NotYetInitialized) { return _status; } _status = Status::OK(); log() << "starting cloning of all databases"; // Schedule listDatabase command which will kick off the database cloner per result db. Request listDBsReq(_source, "admin", BSON("listDatabases" << true), rpc::ServerSelectionMetadata(true, boost::none).toBSON()); CBHStatus s = _exec->scheduleRemoteCommand( listDBsReq, stdx::bind(&DatabasesCloner::_onListDatabaseFinish, this, stdx::placeholders::_1)); if (!s.isOK()) { _setStatus(s); _failed(); } _doNextActions(); return _status; }
Status DatabasesCloner::startup() noexcept { LockGuard lk(_mutex); switch (_state) { case State::kPreStart: _state = State::kRunning; break; case State::kRunning: return Status(ErrorCodes::InternalError, "databases cloner already started"); case State::kShuttingDown: return Status(ErrorCodes::ShutdownInProgress, "databases cloner shutting down"); case State::kComplete: return Status(ErrorCodes::ShutdownInProgress, "databases cloner completed"); } if (!_status.isOK() && _status.code() != ErrorCodes::NotYetInitialized) { return _status; } // Schedule listDatabase command which will kick off the database cloner per result db. We only // retrieve database names since computing & fetching all database stats can be costly on the // remote node when there are a large number of collections. Request listDBsReq(_source, "admin", BSON("listDatabases" << true << "nameOnly" << true), ReadPreferenceSetting::secondaryPreferredMetadata(), nullptr); _listDBsScheduler = stdx::make_unique<RemoteCommandRetryScheduler>( _exec, listDBsReq, [this](const auto& x) { this->_onListDatabaseFinish(x); }, RemoteCommandRetryScheduler::makeRetryPolicy( numInitialSyncListDatabasesAttempts.load(), executor::RemoteCommandRequest::kNoTimeout, RemoteCommandRetryScheduler::kAllRetriableErrors)); _status = _listDBsScheduler->startup(); if (!_status.isOK()) { _state = State::kComplete; return _status; } return Status::OK(); }