Status _findAllCollections(const ConnectionString& configLoc, bool optionalEpochs, OwnedPointerMap<string, CollectionType>* collections) { scoped_ptr<ScopedDbConnection> connPtr; try { connPtr.reset(ScopedDbConnection::getInternalScopedDbConnection(configLoc, 30)); ScopedDbConnection& conn = *connPtr; scoped_ptr<DBClientCursor> cursor(_safeCursor(conn->query(CollectionType::ConfigNS, Query()))); while (cursor->more()) { BSONObj collDoc = cursor->nextSafe(); CollectionType* coll = new CollectionType(); string errMsg; coll->parseBSON(collDoc, &errMsg); // Needed for the v3 to v4 upgrade bool epochNotSet = !coll->isEpochSet() || !coll->getEpoch().isSet(); if (optionalEpochs && epochNotSet) { // Set our epoch to something here, just to allow coll->setEpoch(OID::gen()); } if (errMsg != "" || !coll->isValid(&errMsg)) { return Status(ErrorCodes::UnsupportedFormat, stream() << "invalid collection " << collDoc << " read from the config server" << causedBy(errMsg)); } if (coll->isDroppedSet() && coll->getDropped()) { continue; } if (optionalEpochs && epochNotSet) { coll->setEpoch(OID()); } collections->mutableMap().insert(make_pair(coll->getNS(), coll)); } } catch (const DBException& e) { return e.toStatus(); } connPtr->done(); return Status::OK(); }