void configureSystemIndexes(OperationContext* txn, const StringData& dbname) { int authzVersion; Status status = getGlobalAuthorizationManager()->getAuthorizationVersion( txn, &authzVersion); if (!status.isOK()) { return; } if (dbname == "admin" && authzVersion == AuthorizationManager::schemaVersion26Final) { NamespaceString systemUsers(dbname, "system.users"); // Make sure the old unique index from v2.4 on system.users doesn't exist. Client::WriteContext wctx(txn, systemUsers); Collection* collection = wctx.ctx().db()->getCollection(txn, NamespaceString(systemUsers)); if (!collection) { return; } IndexCatalog* indexCatalog = collection->getIndexCatalog(); IndexDescriptor* oldIndex = NULL; while ((oldIndex = indexCatalog->findIndexByKeyPattern(v1SystemUsersKeyPattern))) { indexCatalog->dropIndex(txn, oldIndex); } wctx.commit(); } }
Status verifySystemIndexes(OperationContext* txn) { const NamespaceString systemUsers = AuthorizationManager::usersCollectionNamespace; // Make sure the old unique index from v2.4 on system.users doesn't exist. ScopedTransaction scopedXact(txn, MODE_IX); AutoGetDb autoDb(txn, systemUsers.db(), MODE_X); if (!autoDb.getDb()) { return Status::OK(); } Collection* collection = autoDb.getDb()->getCollection(NamespaceString(systemUsers)); if (!collection) { return Status::OK(); } IndexCatalog* indexCatalog = collection->getIndexCatalog(); IndexDescriptor* oldIndex = NULL; if (indexCatalog && (oldIndex = indexCatalog->findIndexByKeyPattern(txn, v1SystemUsersKeyPattern))) { return Status(ErrorCodes::AuthSchemaIncompatible, "Old 2.4 style user index identified. " "The authentication schema needs to be updated by " "running authSchemaUpgrade on a 2.6 server."); } return Status::OK(); }
void configureSystemIndexes(OperationContext* txn) { int authzVersion; Status status = getGlobalAuthorizationManager()->getAuthorizationVersion( txn, &authzVersion); if (!status.isOK()) { return; } if (authzVersion >= AuthorizationManager::schemaVersion26Final) { const NamespaceString systemUsers("admin", "system.users"); // Make sure the old unique index from v2.4 on system.users doesn't exist. AutoGetDb autoDb(txn, systemUsers.db(), MODE_X); if (!autoDb.getDb()) { return; } Collection* collection = autoDb.getDb()->getCollection(txn, NamespaceString(systemUsers)); if (!collection) { return; } IndexCatalog* indexCatalog = collection->getIndexCatalog(); IndexDescriptor* oldIndex = NULL; WriteUnitOfWork wunit(txn); while ((oldIndex = indexCatalog->findIndexByKeyPattern(txn, v1SystemUsersKeyPattern))) { indexCatalog->dropIndex(txn, oldIndex); } wunit.commit(); } }
IndexScan* createIndexScan(MatchExpression* expr, WorkingSet* ws) { IndexCatalog* catalog = _coll->getIndexCatalog(); IndexDescriptor* descriptor = catalog->findIndexByKeyPattern(&_txn, BSON("x" << 1)); invariant(descriptor); // We are not testing indexing here so use maximal bounds IndexScanParams params; params.descriptor = descriptor; params.bounds.isSimpleRange = true; params.bounds.startKey = BSON("" << 0); params.bounds.endKey = BSON("" << kDocuments+1); params.bounds.endKeyInclusive = true; params.direction = 1; // This child stage gets owned and freed by its parent CountStage return new IndexScan(&_txn, params, ws, expr); }
IndexScan* createIndexScanSimpleRange(BSONObj startKey, BSONObj endKey) { IndexCatalog* catalog = _coll->getIndexCatalog(); IndexDescriptor* descriptor = catalog->findIndexByKeyPattern(&_txn, BSON("x" << 1)); invariant(descriptor); // We are not testing indexing here so use maximal bounds IndexScanParams params; params.descriptor = descriptor; params.bounds.isSimpleRange = true; params.bounds.startKey = startKey; params.bounds.endKey = endKey; params.bounds.endKeyInclusive = true; params.direction = 1; // This child stage gets owned and freed by the caller. MatchExpression* filter = NULL; return new IndexScan(&_txn, params, &_ws, filter); }
IndexScan* createIndexScan(BSONObj startKey, BSONObj endKey, bool startInclusive, bool endInclusive, int direction = 1) { IndexCatalog* catalog = _coll->getIndexCatalog(); IndexDescriptor* descriptor = catalog->findIndexByKeyPattern(&_txn, BSON("x" << 1)); invariant(descriptor); IndexScanParams params; params.descriptor = descriptor; params.direction = direction; OrderedIntervalList oil("x"); BSONObjBuilder bob; bob.appendAs(startKey.firstElement(), ""); bob.appendAs(endKey.firstElement(), ""); oil.intervals.push_back(Interval(bob.obj(), startInclusive, endInclusive)); params.bounds.fields.push_back(oil); MatchExpression* filter = NULL; return new IndexScan(&_txn, params, &_ws, filter); }
PlanStage::StageState TwoDNear::work(WorkingSetID* out) { ++_commonStats.works; // Adds the amount of time taken by work() to executionTimeMillis. ScopedTimer timer(&_commonStats.executionTimeMillis); if (!_initted) { _initted = true; if ( !_params.collection ) return PlanStage::IS_EOF; IndexCatalog* indexCatalog = _params.collection->getIndexCatalog(); IndexDescriptor* desc = indexCatalog->findIndexByKeyPattern(_params.indexKeyPattern); if ( desc == NULL ) return PlanStage::IS_EOF; TwoDAccessMethod* am = static_cast<TwoDAccessMethod*>( indexCatalog->getIndex( desc ) ); auto_ptr<twod_exec::GeoSearch> search; search.reset(new twod_exec::GeoSearch(_params.collection, am, _params.nearQuery.centroid.oldPoint, _params.numWanted, _params.filter, _params.nearQuery.maxDistance, _params.nearQuery.isNearSphere ? twod_exec::GEO_SPHERE : twod_exec::GEO_PLANE)); // This is where all the work is done. :( search->exec(); _specificStats.objectsLoaded = search->_objectsLoaded; _specificStats.nscanned = search->_lookedAt; for (twod_exec::GeoHopper::Holder::iterator it = search->_points.begin(); it != search->_points.end(); it++) { WorkingSetID id = _workingSet->allocate(); WorkingSetMember* member = _workingSet->get(id); member->loc = it->_loc; member->obj = _params.collection->docFor(member->loc); member->state = WorkingSetMember::LOC_AND_UNOWNED_OBJ; if (_params.addDistMeta) { member->addComputed(new GeoDistanceComputedData(it->_distance)); } if (_params.addPointMeta) { member->addComputed(new GeoNearPointComputedData(it->_pt)); } _results.push(Result(id, it->_distance)); _invalidationMap.insert(pair<DiskLoc, WorkingSetID>(it->_loc, id)); } } if (isEOF()) { return PlanStage::IS_EOF; } Result result = _results.top(); _results.pop(); *out = result.id; // Remove from invalidation map. WorkingSetMember* member = _workingSet->get(*out); // The WSM may have been mutated or deleted so it may not have a loc. if (member->hasLoc()) { typedef multimap<DiskLoc, WorkingSetID>::iterator MMIT; pair<MMIT, MMIT> range = _invalidationMap.equal_range(member->loc); for (MMIT it = range.first; it != range.second; ++it) { if (it->second == *out) { _invalidationMap.erase(it); break; } } } ++_commonStats.advanced; return PlanStage::ADVANCED; }
PlanStage::StageState TwoD::work(WorkingSetID* out) { if (isEOF()) { return PlanStage::IS_EOF; } if (!_initted) { _initted = true; if ( !_params.collection ) return PlanStage::IS_EOF; IndexCatalog* indexCatalog = _params.collection->getIndexCatalog(); _descriptor = indexCatalog->findIndexByKeyPattern(_params.indexKeyPattern); if ( _descriptor == NULL ) return PlanStage::IS_EOF; _am = static_cast<TwoDAccessMethod*>( indexCatalog->getIndex( _descriptor ) ); verify( _am ); if (NULL != _params.gq.getGeometry()._cap.get()) { _browse.reset(new twod_exec::GeoCircleBrowse(_params, _am)); } else if (NULL != _params.gq.getGeometry()._polygon.get()) { _browse.reset(new twod_exec::GeoPolygonBrowse(_params, _am)); } else { verify(NULL != _params.gq.getGeometry()._box.get()); _browse.reset(new twod_exec::GeoBoxBrowse(_params, _am)); } // Fill out static portion of plan stats. // We will retrieve the geo hashes used by the geo browser // when the search is complete. _specificStats.type = _browse->_type; _specificStats.field = _params.gq.getField(); _specificStats.converterParams = _browse->_converter->getParams(); return PlanStage::NEED_TIME; } verify(NULL != _browse.get()); if (!_browse->ok()) { // Grab geo hashes before disposing geo browser. _specificStats.expPrefixes.swap(_browse->_expPrefixes); _browse.reset(); return PlanStage::IS_EOF; } WorkingSetID id = _workingSet->allocate(); WorkingSetMember* member = _workingSet->get(id); member->loc = _browse->currLoc(); member->obj = _params.collection->docFor(member->loc); member->state = WorkingSetMember::LOC_AND_UNOWNED_OBJ; _browse->advance(); *out = id; _commonStats.advanced++; _commonStats.works++; return PlanStage::ADVANCED; }