void DatabaseCloner::_collectionClonerCallback(const Status& status, const NamespaceString& nss) { boost::lock_guard<boost::mutex> lk(_mutex); _active = false; // Forward collection cloner result to caller. // Failure to clone a collection does not stop the database cloner // from cloning the rest of the collections in the listCollections result. _collectionWork(status, nss); _currentCollectionClonerIter++; LOG(1) << " cloning collection " << _currentCollectionClonerIter->getSourceNamespace(); if (_currentCollectionClonerIter != _collectionCloners.end()) { Status startStatus = _startCollectionCloner(*_currentCollectionClonerIter); if (!startStatus.isOK()) { LOG(1) << " failed to start collection cloning on " << _currentCollectionClonerIter->getSourceNamespace() << ": " << startStatus; _work(startStatus); return; } _active = true; return; } _work(Status::OK()); }
void DatabaseCloner::_collectionClonerCallback(const Status& status, const NamespaceString& nss) { auto newStatus = status; UniqueLock lk(_mutex); if (!status.isOK()) { newStatus = {status.code(), str::stream() << "While cloning collection '" << nss.toString() << "' there was an error '" << status.reason() << "'" }; _failedNamespaces.push_back({newStatus, nss}); } ++_stats.clonedCollections; // Forward collection cloner result to caller. // Failure to clone a collection does not stop the database cloner // from cloning the rest of the collections in the listCollections result. lk.unlock(); _collectionWork(newStatus, nss); lk.lock(); _currentCollectionClonerIter++; if (_currentCollectionClonerIter != _collectionCloners.end()) { Status startStatus = _startCollectionCloner(*_currentCollectionClonerIter); if (!startStatus.isOK()) { LOG(1) << " failed to start collection cloning on " << _currentCollectionClonerIter->getSourceNamespace() << ": " << redact(startStatus); _finishCallback_inlock(lk, startStatus); return; } return; } Status finalStatus(Status::OK()); if (_failedNamespaces.size() > 0) { finalStatus = {ErrorCodes::InitialSyncFailure, str::stream() << "Failed to clone " << _failedNamespaces.size() << " collection(s) in '" << _dbname << "' from " << _source.toString() }; } _finishCallback_inlock(lk, finalStatus); }