コード例 #1
0
ファイル: database_cloner.cpp プロジェクト: kiluax/mongo
    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());
    }
コード例 #2
0
ファイル: database_cloner.cpp プロジェクト: Machyne/mongo
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);
}