diff options
author | Jason Rassi <rassi@10gen.com> | 2014-10-20 18:38:32 -0400 |
---|---|---|
committer | Jason Rassi <rassi@10gen.com> | 2014-11-20 12:52:25 -0500 |
commit | 4c221b5ce50c3eaabc0348432b6df6c41aeabee5 (patch) | |
tree | a2093f79d0409087c2ef4ac3e610da20dc663bbe /src | |
parent | 429dc5819eb37e21d9e5c4573aae8421efd50ed7 (diff) | |
download | mongo-4c221b5ce50c3eaabc0348432b6df6c41aeabee5.tar.gz |
SERVER-15675 PlanStage::invalidate() needs OperationContext
PlanStage::invalidate() is always called by a different thread than
the stage's owning thread. The method should use the active
OperationContext (the caller's) rather than the stage's
OperationContext.
Diffstat (limited to 'src')
79 files changed, 210 insertions, 209 deletions
diff --git a/src/mongo/db/catalog/collection.cpp b/src/mongo/db/catalog/collection.cpp index 3e00dd56bb6..3ee01cbb42c 100644 --- a/src/mongo/db/catalog/collection.cpp +++ b/src/mongo/db/catalog/collection.cpp @@ -253,7 +253,7 @@ namespace mongo { BSONObj doc = docFor( txn, loc ); /* check if any cursors point to us. if so, advance them. */ - _cursorCache.invalidateDocument(loc, INVALIDATION_DELETION); + _cursorCache.invalidateDocument(txn, loc, INVALIDATION_DELETION); _indexCatalog.unindexRecord(txn, doc, loc, false); @@ -281,7 +281,7 @@ namespace mongo { } /* check if any cursors point to us. if so, advance them. */ - _cursorCache.invalidateDocument(loc, INVALIDATION_DELETION); + _cursorCache.invalidateDocument(txn, loc, INVALIDATION_DELETION); _indexCatalog.unindexRecord(txn, doc, loc, noWarn); @@ -390,7 +390,7 @@ namespace mongo { } // Broadcast the mutation so that query results stay correct. - _cursorCache.invalidateDocument(oldLocation, INVALIDATION_MUTATION); + _cursorCache.invalidateDocument(txn, oldLocation, INVALIDATION_MUTATION); return newLocation; } @@ -400,7 +400,7 @@ namespace mongo { const char* oldBuffer, size_t oldSize ) { moveCounter.increment(); - _cursorCache.invalidateDocument(oldLocation, INVALIDATION_DELETION); + _cursorCache.invalidateDocument(txn, oldLocation, INVALIDATION_DELETION); _indexCatalog.unindexRecord(txn, BSONObj(oldBuffer), oldLocation, true); return Status::OK(); } @@ -413,7 +413,7 @@ namespace mongo { const mutablebson::DamageVector& damages ) { // Broadcast the mutation so that query results stay correct. - _cursorCache.invalidateDocument(loc, INVALIDATION_MUTATION); + _cursorCache.invalidateDocument(txn, loc, INVALIDATION_MUTATION); return _recordStore->updateWithDamages( txn, loc, oldRec, damageSource, damages ); } diff --git a/src/mongo/db/catalog/collection_cursor_cache.cpp b/src/mongo/db/catalog/collection_cursor_cache.cpp index 700064b1b7d..582ca22c715 100644 --- a/src/mongo/db/catalog/collection_cursor_cache.cpp +++ b/src/mongo/db/catalog/collection_cursor_cache.cpp @@ -346,7 +346,8 @@ namespace mongo { } } - void CollectionCursorCache::invalidateDocument( const DiskLoc& dl, + void CollectionCursorCache::invalidateDocument( OperationContext* txn, + const DiskLoc& dl, InvalidationType type ) { if ( supportsDocLocking() ) { // If a storage engine supports doc locking, then we do not need to invalidate. @@ -361,13 +362,13 @@ namespace mongo { ++it ) { PlanExecutor* exec = *it; - exec->invalidate(dl, type); + exec->invalidate(txn, dl, type); } for ( CursorMap::const_iterator i = _cursors.begin(); i != _cursors.end(); ++i ) { PlanExecutor* exec = i->second->getExecutor(); if ( exec ) { - exec->invalidate(dl, type); + exec->invalidate(txn, dl, type); } } } diff --git a/src/mongo/db/catalog/collection_cursor_cache.h b/src/mongo/db/catalog/collection_cursor_cache.h index e0aa6f9ad51..e9822b46c01 100644 --- a/src/mongo/db/catalog/collection_cursor_cache.h +++ b/src/mongo/db/catalog/collection_cursor_cache.h @@ -65,7 +65,8 @@ namespace mongo { * Broadcast a document invalidation to all relevant PlanExecutor(s). invalidateDocument * must called *before* the provided DiskLoc is about to be deleted or mutated. */ - void invalidateDocument( const DiskLoc& dl, + void invalidateDocument( OperationContext* txn, + const DiskLoc& dl, InvalidationType type ); /* diff --git a/src/mongo/db/exec/and_hash.cpp b/src/mongo/db/exec/and_hash.cpp index b1737ee6d1c..531ff3c432c 100644 --- a/src/mongo/db/exec/and_hash.cpp +++ b/src/mongo/db/exec/and_hash.cpp @@ -52,12 +52,10 @@ namespace mongo { // static const char* AndHashStage::kStageType = "AND_HASH"; - AndHashStage::AndHashStage(OperationContext* txn, - WorkingSet* ws, + AndHashStage::AndHashStage(WorkingSet* ws, const MatchExpression* filter, const Collection* collection) - : _txn(txn), - _collection(collection), + : _collection(collection), _ws(ws), _filter(filter), _hashingChildren(true), @@ -66,13 +64,11 @@ namespace mongo { _memUsage(0), _maxMemUsage(kDefaultMaxMemUsageBytes) {} - AndHashStage::AndHashStage(OperationContext* txn, - WorkingSet* ws, + AndHashStage::AndHashStage(WorkingSet* ws, const MatchExpression* filter, const Collection* collection, size_t maxMemUsage) - : _txn(txn), - _collection(collection), + : _collection(collection), _ws(ws), _filter(filter), _hashingChildren(true), @@ -454,7 +450,6 @@ namespace mongo { } void AndHashStage::restoreState(OperationContext* opCtx) { - _txn = opCtx; ++_commonStats.unyields; for (size_t i = 0; i < _children.size(); ++i) { @@ -462,13 +457,13 @@ namespace mongo { } } - void AndHashStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void AndHashStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; if (isEOF()) { return; } for (size_t i = 0; i < _children.size(); ++i) { - _children[i]->invalidate(dl, type); + _children[i]->invalidate(txn, dl, type); } // Invalidation can happen to our warmup results. If that occurs just @@ -477,7 +472,7 @@ namespace mongo { if (WorkingSet::INVALID_ID != _lookAheadResults[i]) { WorkingSetMember* member = _ws->get(_lookAheadResults[i]); if (member->hasLoc() && member->loc == dl) { - WorkingSetCommon::fetchAndInvalidateLoc(_txn, member, _collection); + WorkingSetCommon::fetchAndInvalidateLoc(txn, member, _collection); _ws->flagForReview(_lookAheadResults[i]); _lookAheadResults[i] = WorkingSet::INVALID_ID; } @@ -507,7 +502,7 @@ namespace mongo { _memUsage -= member->getMemUsage(); // The loc is about to be invalidated. Fetch it and clear the loc. - WorkingSetCommon::fetchAndInvalidateLoc(_txn, member, _collection); + WorkingSetCommon::fetchAndInvalidateLoc(txn, member, _collection); // Add the WSID to the to-be-reviewed list in the WS. _ws->flagForReview(id); diff --git a/src/mongo/db/exec/and_hash.h b/src/mongo/db/exec/and_hash.h index 6f9e62f8931..1a16c4bd846 100644 --- a/src/mongo/db/exec/and_hash.h +++ b/src/mongo/db/exec/and_hash.h @@ -52,16 +52,14 @@ namespace mongo { */ class AndHashStage : public PlanStage { public: - AndHashStage(OperationContext* txn, - WorkingSet* ws, + AndHashStage(WorkingSet* ws, const MatchExpression* filter, const Collection* collection); /** * For testing only. Allows tests to set memory usage threshold. */ - AndHashStage(OperationContext* txn, - WorkingSet* ws, + AndHashStage(WorkingSet* ws, const MatchExpression* filter, const Collection* collection, size_t maxMemUsage); @@ -81,7 +79,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; @@ -103,7 +101,6 @@ namespace mongo { StageState workChild(size_t childNo, WorkingSetID* out); // Not owned by us. - OperationContext* _txn; const Collection* _collection; // Not owned by us. diff --git a/src/mongo/db/exec/and_sorted.cpp b/src/mongo/db/exec/and_sorted.cpp index 6cae3b1f038..5405ff76fe0 100644 --- a/src/mongo/db/exec/and_sorted.cpp +++ b/src/mongo/db/exec/and_sorted.cpp @@ -39,12 +39,10 @@ namespace mongo { // static const char* AndSortedStage::kStageType = "AND_SORTED"; - AndSortedStage::AndSortedStage(OperationContext* txn, - WorkingSet* ws, + AndSortedStage::AndSortedStage(WorkingSet* ws, const MatchExpression* filter, const Collection* collection) - : _txn(txn), - _collection(collection), + : _collection(collection), _ws(ws), _filter(filter), _targetNode(numeric_limits<size_t>::max()), @@ -278,7 +276,6 @@ namespace mongo { } void AndSortedStage::restoreState(OperationContext* opCtx) { - _txn = opCtx; ++_commonStats.unyields; for (size_t i = 0; i < _children.size(); ++i) { @@ -286,13 +283,15 @@ namespace mongo { } } - void AndSortedStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void AndSortedStage::invalidate(OperationContext* txn, + const DiskLoc& dl, + InvalidationType type) { ++_commonStats.invalidates; if (isEOF()) { return; } for (size_t i = 0; i < _children.size(); ++i) { - _children[i]->invalidate(dl, type); + _children[i]->invalidate(txn, dl, type); } if (dl == _targetLoc) { @@ -303,7 +302,7 @@ namespace mongo { ++_specificStats.flagged; // The DiskLoc could still be a valid result so flag it and save it for later. - WorkingSetCommon::fetchAndInvalidateLoc(_txn, _ws->get(_targetId), _collection); + WorkingSetCommon::fetchAndInvalidateLoc(txn, _ws->get(_targetId), _collection); _ws->flagForReview(_targetId); _targetId = WorkingSet::INVALID_ID; diff --git a/src/mongo/db/exec/and_sorted.h b/src/mongo/db/exec/and_sorted.h index 870cbd1b1ab..106095b6325 100644 --- a/src/mongo/db/exec/and_sorted.h +++ b/src/mongo/db/exec/and_sorted.h @@ -53,8 +53,7 @@ namespace mongo { */ class AndSortedStage : public PlanStage { public: - AndSortedStage(OperationContext* txn, - WorkingSet* ws, const MatchExpression* filter, const Collection* collection); + AndSortedStage(WorkingSet* ws, const MatchExpression* filter, const Collection* collection); virtual ~AndSortedStage(); void addChild(PlanStage* child); @@ -64,7 +63,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; @@ -87,7 +86,6 @@ namespace mongo { PlanStage::StageState moveTowardTargetLoc(WorkingSetID* out); // Not owned by us. - OperationContext* _txn; const Collection* _collection; // Not owned by us. diff --git a/src/mongo/db/exec/cached_plan.cpp b/src/mongo/db/exec/cached_plan.cpp index c05992db36f..42dce27c931 100644 --- a/src/mongo/db/exec/cached_plan.cpp +++ b/src/mongo/db/exec/cached_plan.cpp @@ -127,12 +127,14 @@ namespace mongo { ++_commonStats.unyields; } - void CachedPlanStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void CachedPlanStage::invalidate(OperationContext* txn, + const DiskLoc& dl, + InvalidationType type) { if (! _usingBackupChild) { - _mainChildPlan->invalidate(dl, type); + _mainChildPlan->invalidate(txn, dl, type); } if (NULL != _backupChildPlan.get()) { - _backupChildPlan->invalidate(dl, type); + _backupChildPlan->invalidate(txn, dl, type); } ++_commonStats.invalidates; } diff --git a/src/mongo/db/exec/cached_plan.h b/src/mongo/db/exec/cached_plan.h index b776dc156d2..0cc2fabdc47 100644 --- a/src/mongo/db/exec/cached_plan.h +++ b/src/mongo/db/exec/cached_plan.h @@ -64,7 +64,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/collection_scan.cpp b/src/mongo/db/exec/collection_scan.cpp index df49cadb07c..b0c1267c8c4 100644 --- a/src/mongo/db/exec/collection_scan.cpp +++ b/src/mongo/db/exec/collection_scan.cpp @@ -179,7 +179,9 @@ namespace mongo { return _iter->isEOF(); } - void CollectionScan::invalidate(const DiskLoc& dl, InvalidationType type) { + void CollectionScan::invalidate(OperationContext* txn, + const DiskLoc& dl, + InvalidationType type) { ++_commonStats.invalidates; // We don't care about mutations since we apply any filters to the result when we (possibly) diff --git a/src/mongo/db/exec/collection_scan.h b/src/mongo/db/exec/collection_scan.h index f79327f7c6c..46b02f415c0 100644 --- a/src/mongo/db/exec/collection_scan.h +++ b/src/mongo/db/exec/collection_scan.h @@ -55,7 +55,7 @@ namespace mongo { virtual StageState work(WorkingSetID* out); virtual bool isEOF(); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual void saveState(); virtual void restoreState(OperationContext* opCtx); diff --git a/src/mongo/db/exec/count.cpp b/src/mongo/db/exec/count.cpp index 1f4cbd3d48e..6bcd3d63ce6 100644 --- a/src/mongo/db/exec/count.cpp +++ b/src/mongo/db/exec/count.cpp @@ -178,10 +178,10 @@ namespace mongo { } } - void CountStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void CountStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; if (_child.get()) { - _child->invalidate(dl, type); + _child->invalidate(txn, dl, type); } } diff --git a/src/mongo/db/exec/count.h b/src/mongo/db/exec/count.h index e4ad071c826..a099ca71394 100644 --- a/src/mongo/db/exec/count.h +++ b/src/mongo/db/exec/count.h @@ -88,7 +88,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/count_scan.cpp b/src/mongo/db/exec/count_scan.cpp index 1b278f9b541..cff8b4ccaaa 100644 --- a/src/mongo/db/exec/count_scan.cpp +++ b/src/mongo/db/exec/count_scan.cpp @@ -201,7 +201,7 @@ namespace mongo { checkEnd(); } - void CountScan::invalidate(const DiskLoc& dl, InvalidationType type) { + void CountScan::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; // The only state we're responsible for holding is what DiskLocs to drop. If a document diff --git a/src/mongo/db/exec/count_scan.h b/src/mongo/db/exec/count_scan.h index 70ebb289dd5..b5399199116 100644 --- a/src/mongo/db/exec/count_scan.h +++ b/src/mongo/db/exec/count_scan.h @@ -75,7 +75,7 @@ namespace mongo { virtual bool isEOF(); virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/delete.cpp b/src/mongo/db/exec/delete.cpp index fb24f9ec29c..d13b8bf2ff8 100644 --- a/src/mongo/db/exec/delete.cpp +++ b/src/mongo/db/exec/delete.cpp @@ -175,9 +175,9 @@ namespace mongo { repl::getGlobalReplicationCoordinator()->canAcceptWritesForDatabase(ns.db())); } - void DeleteStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void DeleteStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; - _child->invalidate(dl, type); + _child->invalidate(txn, dl, type); } vector<PlanStage*> DeleteStage::getChildren() const { diff --git a/src/mongo/db/exec/delete.h b/src/mongo/db/exec/delete.h index 17dbc79a316..12a62697261 100644 --- a/src/mongo/db/exec/delete.h +++ b/src/mongo/db/exec/delete.h @@ -79,7 +79,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/distinct_scan.cpp b/src/mongo/db/exec/distinct_scan.cpp index 9129d82bd6a..ddbe6a49103 100644 --- a/src/mongo/db/exec/distinct_scan.cpp +++ b/src/mongo/db/exec/distinct_scan.cpp @@ -201,7 +201,7 @@ namespace mongo { } } - void DistinctScan::invalidate(const DiskLoc& dl, InvalidationType type) { + void DistinctScan::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; } diff --git a/src/mongo/db/exec/distinct_scan.h b/src/mongo/db/exec/distinct_scan.h index 54e87fbf000..83a85811782 100644 --- a/src/mongo/db/exec/distinct_scan.h +++ b/src/mongo/db/exec/distinct_scan.h @@ -104,7 +104,7 @@ namespace mongo { virtual bool isEOF(); virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/eof.cpp b/src/mongo/db/exec/eof.cpp index 46d9ba8c334..0ab4cbb166c 100644 --- a/src/mongo/db/exec/eof.cpp +++ b/src/mongo/db/exec/eof.cpp @@ -60,7 +60,7 @@ namespace mongo { ++_commonStats.unyields; } - void EOFStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void EOFStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; } diff --git a/src/mongo/db/exec/eof.h b/src/mongo/db/exec/eof.h index 25798a504a2..78c9aa6b1e7 100644 --- a/src/mongo/db/exec/eof.h +++ b/src/mongo/db/exec/eof.h @@ -47,7 +47,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/fetch.cpp b/src/mongo/db/exec/fetch.cpp index b1bde6dafc4..112bcbec1d3 100644 --- a/src/mongo/db/exec/fetch.cpp +++ b/src/mongo/db/exec/fetch.cpp @@ -162,10 +162,10 @@ namespace mongo { _child->restoreState(opCtx); } - void FetchStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void FetchStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; - _child->invalidate(dl, type); + _child->invalidate(txn, dl, type); // It's possible that the loc getting invalidated is the one we're about to // fetch. In this case we do a "forced fetch" and put the WSM in owned object state. @@ -173,7 +173,7 @@ namespace mongo { WorkingSetMember* member = _ws->get(_idBeingPagedIn); if (member->hasLoc() && (member->loc == dl)) { // Fetch it now and kill the diskloc. - WorkingSetCommon::fetchAndInvalidateLoc(_txn, member, _collection); + WorkingSetCommon::fetchAndInvalidateLoc(txn, member, _collection); } } } diff --git a/src/mongo/db/exec/fetch.h b/src/mongo/db/exec/fetch.h index 9a26c575733..b6374c49ed2 100644 --- a/src/mongo/db/exec/fetch.h +++ b/src/mongo/db/exec/fetch.h @@ -58,7 +58,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/group.cpp b/src/mongo/db/exec/group.cpp index 037a70f86c0..af6b5958384 100644 --- a/src/mongo/db/exec/group.cpp +++ b/src/mongo/db/exec/group.cpp @@ -267,9 +267,9 @@ namespace mongo { _child->restoreState(opCtx); } - void GroupStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void GroupStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; - _child->invalidate(dl, type); + _child->invalidate(txn, dl, type); } vector<PlanStage*> GroupStage::getChildren() const { diff --git a/src/mongo/db/exec/group.h b/src/mongo/db/exec/group.h index fb713c66d8a..96e06274ab4 100644 --- a/src/mongo/db/exec/group.h +++ b/src/mongo/db/exec/group.h @@ -90,7 +90,7 @@ namespace mongo { virtual bool isEOF(); virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/idhack.cpp b/src/mongo/db/exec/idhack.cpp index 36b326cf10d..261bfeac369 100644 --- a/src/mongo/db/exec/idhack.cpp +++ b/src/mongo/db/exec/idhack.cpp @@ -181,7 +181,7 @@ namespace mongo { ++_commonStats.unyields; } - void IDHackStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void IDHackStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; // It's possible that the loc getting invalidated is the one we're about to diff --git a/src/mongo/db/exec/idhack.h b/src/mongo/db/exec/idhack.h index ef328213666..a05cfe56365 100644 --- a/src/mongo/db/exec/idhack.h +++ b/src/mongo/db/exec/idhack.h @@ -55,7 +55,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); /** * ID Hack has a very strict criteria for the queries it supports. diff --git a/src/mongo/db/exec/index_scan.cpp b/src/mongo/db/exec/index_scan.cpp index 98b58bcb54a..b6cb55d54d9 100644 --- a/src/mongo/db/exec/index_scan.cpp +++ b/src/mongo/db/exec/index_scan.cpp @@ -276,7 +276,7 @@ namespace mongo { } } - void IndexScan::invalidate(const DiskLoc& dl, InvalidationType type) { + void IndexScan::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; // The only state we're responsible for holding is what DiskLocs to drop. If a document diff --git a/src/mongo/db/exec/index_scan.h b/src/mongo/db/exec/index_scan.h index 4121010d3f4..771982ea3b0 100644 --- a/src/mongo/db/exec/index_scan.h +++ b/src/mongo/db/exec/index_scan.h @@ -110,7 +110,7 @@ namespace mongo { virtual bool isEOF(); virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/keep_mutations.cpp b/src/mongo/db/exec/keep_mutations.cpp index 01f877a58e8..025e1ee5e27 100644 --- a/src/mongo/db/exec/keep_mutations.cpp +++ b/src/mongo/db/exec/keep_mutations.cpp @@ -124,9 +124,11 @@ namespace mongo { _child->restoreState(opCtx); } - void KeepMutationsStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void KeepMutationsStage::invalidate(OperationContext* txn, + const DiskLoc& dl, + InvalidationType type) { ++_commonStats.invalidates; - _child->invalidate(dl, type); + _child->invalidate(txn, dl, type); } vector<PlanStage*> KeepMutationsStage::getChildren() const { diff --git a/src/mongo/db/exec/keep_mutations.h b/src/mongo/db/exec/keep_mutations.h index 25dff6a0b0f..735f8738d99 100644 --- a/src/mongo/db/exec/keep_mutations.h +++ b/src/mongo/db/exec/keep_mutations.h @@ -53,7 +53,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/limit.cpp b/src/mongo/db/exec/limit.cpp index 6d9e0d87e9a..b92cb45b548 100644 --- a/src/mongo/db/exec/limit.cpp +++ b/src/mongo/db/exec/limit.cpp @@ -98,9 +98,9 @@ namespace mongo { _child->restoreState(opCtx); } - void LimitStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void LimitStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; - _child->invalidate(dl, type); + _child->invalidate(txn, dl, type); } vector<PlanStage*> LimitStage::getChildren() const { diff --git a/src/mongo/db/exec/limit.h b/src/mongo/db/exec/limit.h index b0068d46b6e..6d0936e412b 100644 --- a/src/mongo/db/exec/limit.h +++ b/src/mongo/db/exec/limit.h @@ -51,7 +51,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/merge_sort.cpp b/src/mongo/db/exec/merge_sort.cpp index 6c39f2f3615..f30991aeaba 100644 --- a/src/mongo/db/exec/merge_sort.cpp +++ b/src/mongo/db/exec/merge_sort.cpp @@ -38,12 +38,10 @@ namespace mongo { // static const char* MergeSortStage::kStageType = "SORT_MERGE"; - MergeSortStage::MergeSortStage(OperationContext* txn, - const MergeSortStageParams& params, + MergeSortStage::MergeSortStage(const MergeSortStageParams& params, WorkingSet* ws, const Collection* collection) - : _txn(txn), - _collection(collection), + : _collection(collection), _ws(ws), _pattern(params.pattern), _dedup(params.dedup), @@ -198,17 +196,18 @@ namespace mongo { } void MergeSortStage::restoreState(OperationContext* opCtx) { - _txn = opCtx; ++_commonStats.unyields; for (size_t i = 0; i < _children.size(); ++i) { _children[i]->restoreState(opCtx); } } - void MergeSortStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void MergeSortStage::invalidate(OperationContext* txn, + const DiskLoc& dl, + InvalidationType type) { ++_commonStats.invalidates; for (size_t i = 0; i < _children.size(); ++i) { - _children[i]->invalidate(dl, type); + _children[i]->invalidate(txn, dl, type); } // Go through our data and see if we're holding on to the invalidated loc. @@ -216,7 +215,7 @@ namespace mongo { WorkingSetMember* member = _ws->get(valueIt->id); if (member->hasLoc() && (dl == member->loc)) { // Force a fetch and flag. We could possibly merge this result back in later. - WorkingSetCommon::fetchAndInvalidateLoc(_txn, member, _collection); + WorkingSetCommon::fetchAndInvalidateLoc(txn, member, _collection); _ws->flagForReview(valueIt->id); ++_specificStats.forcedFetches; } diff --git a/src/mongo/db/exec/merge_sort.h b/src/mongo/db/exec/merge_sort.h index 55d7a08660b..f27958365ee 100644 --- a/src/mongo/db/exec/merge_sort.h +++ b/src/mongo/db/exec/merge_sort.h @@ -55,8 +55,7 @@ namespace mongo { */ class MergeSortStage : public PlanStage { public: - MergeSortStage(OperationContext* txn, - const MergeSortStageParams& params, + MergeSortStage(const MergeSortStageParams& params, WorkingSet* ws, const Collection* collection); virtual ~MergeSortStage(); @@ -68,7 +67,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; @@ -84,7 +83,6 @@ namespace mongo { private: // Not owned by us. - OperationContext* _txn; const Collection* _collection; // Not owned by us. diff --git a/src/mongo/db/exec/mock_stage.cpp b/src/mongo/db/exec/mock_stage.cpp index 89d78e39445..e95680bd2cd 100644 --- a/src/mongo/db/exec/mock_stage.cpp +++ b/src/mongo/db/exec/mock_stage.cpp @@ -72,7 +72,7 @@ namespace mongo { ++_commonStats.unyields; } - void MockStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void MockStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; } diff --git a/src/mongo/db/exec/mock_stage.h b/src/mongo/db/exec/mock_stage.h index 38bbc4ca4ac..f3347c84d9a 100644 --- a/src/mongo/db/exec/mock_stage.h +++ b/src/mongo/db/exec/mock_stage.h @@ -60,7 +60,7 @@ namespace mongo { // have correct yielding behavior. virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/mock_stage_test.cpp b/src/mongo/db/exec/mock_stage_test.cpp index ceb7c5215ff..8a3c3b07d24 100644 --- a/src/mongo/db/exec/mock_stage_test.cpp +++ b/src/mongo/db/exec/mock_stage_test.cpp @@ -94,7 +94,7 @@ namespace { // invalidates const DiskLoc dl(0, 0); - mock->invalidate(dl, INVALIDATION_MUTATION); + mock->invalidate(NULL, dl, INVALIDATION_MUTATION); ASSERT_EQUALS(stats->invalidates, 1U); // and now we are d1U, but must trigger EOF with getStats() diff --git a/src/mongo/db/exec/multi_iterator.cpp b/src/mongo/db/exec/multi_iterator.cpp index ea81e984512..fa3d10fbbb8 100644 --- a/src/mongo/db/exec/multi_iterator.cpp +++ b/src/mongo/db/exec/multi_iterator.cpp @@ -110,7 +110,9 @@ namespace mongo { } } - void MultiIteratorStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void MultiIteratorStage::invalidate(OperationContext* txn, + const DiskLoc& dl, + InvalidationType type) { switch ( type ) { case INVALIDATION_DELETION: for (size_t i = 0; i < _iterators.size(); i++) { diff --git a/src/mongo/db/exec/multi_iterator.h b/src/mongo/db/exec/multi_iterator.h index ba2aab31665..343c8c23cc5 100644 --- a/src/mongo/db/exec/multi_iterator.h +++ b/src/mongo/db/exec/multi_iterator.h @@ -62,7 +62,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); // // These should not be used. diff --git a/src/mongo/db/exec/multi_plan.cpp b/src/mongo/db/exec/multi_plan.cpp index 43686fe1116..04488cfdec3 100644 --- a/src/mongo/db/exec/multi_plan.cpp +++ b/src/mongo/db/exec/multi_plan.cpp @@ -445,23 +445,25 @@ namespace mongo { } } - void MultiPlanStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void MultiPlanStage::invalidate(OperationContext* txn, + const DiskLoc& dl, + InvalidationType type) { if (_failure) { return; } if (bestPlanChosen()) { CandidatePlan& bestPlan = _candidates[_bestPlanIdx]; - bestPlan.root->invalidate(dl, type); - invalidateHelper(_txn, bestPlan.ws, dl, &bestPlan.results, _collection); + bestPlan.root->invalidate(txn, dl, type); + invalidateHelper(txn, bestPlan.ws, dl, &bestPlan.results, _collection); if (hasBackupPlan()) { CandidatePlan& backupPlan = _candidates[_backupPlanIdx]; - backupPlan.root->invalidate(dl, type); - invalidateHelper(_txn, backupPlan.ws, dl, &backupPlan.results, _collection); + backupPlan.root->invalidate(txn, dl, type); + invalidateHelper(txn, backupPlan.ws, dl, &backupPlan.results, _collection); } } else { for (size_t ix = 0; ix < _candidates.size(); ++ix) { - _candidates[ix].root->invalidate(dl, type); - invalidateHelper(_txn, _candidates[ix].ws, dl, &_candidates[ix].results, _collection); + _candidates[ix].root->invalidate(txn, dl, type); + invalidateHelper(txn, _candidates[ix].ws, dl, &_candidates[ix].results, _collection); } } } diff --git a/src/mongo/db/exec/multi_plan.h b/src/mongo/db/exec/multi_plan.h index a3d2c7839d7..97da7eee427 100644 --- a/src/mongo/db/exec/multi_plan.h +++ b/src/mongo/db/exec/multi_plan.h @@ -63,7 +63,7 @@ namespace mongo { virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/near.cpp b/src/mongo/db/exec/near.cpp index a8050e7e89f..52e4c5858e4 100644 --- a/src/mongo/db/exec/near.cpp +++ b/src/mongo/db/exec/near.cpp @@ -317,10 +317,10 @@ namespace mongo { } } - void NearStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void NearStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_stats->common.invalidates; for (size_t i = 0; i < _childrenIntervals.size(); i++) { - _childrenIntervals[i]->covering->invalidate(dl, type); + _childrenIntervals[i]->covering->invalidate(txn, dl, type); } // If a result is in _resultBuffer and has a DiskLoc it will be in _nextIntervalSeen as @@ -332,7 +332,7 @@ namespace mongo { WorkingSetMember* member = _workingSet->get(seenIt->second); verify(member->hasLoc()); - WorkingSetCommon::fetchAndInvalidateLoc(_txn, member, _collection); + WorkingSetCommon::fetchAndInvalidateLoc(txn, member, _collection); verify(!member->hasLoc()); // Don't keep it around in the seen map since there's no valid DiskLoc anymore diff --git a/src/mongo/db/exec/near.h b/src/mongo/db/exec/near.h index fbb2a6d9cd0..4edc3dfc8f5 100644 --- a/src/mongo/db/exec/near.h +++ b/src/mongo/db/exec/near.h @@ -85,7 +85,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/oplogstart.cpp b/src/mongo/db/exec/oplogstart.cpp index 053ff806dde..5d33bd4f4ba 100644 --- a/src/mongo/db/exec/oplogstart.cpp +++ b/src/mongo/db/exec/oplogstart.cpp @@ -141,13 +141,13 @@ namespace mongo { bool OplogStart::isEOF() { return _done; } - void OplogStart::invalidate(const DiskLoc& dl, InvalidationType type) { + void OplogStart::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { if (_needInit) { return; } if (INVALIDATION_DELETION != type) { return; } if (_cs) { - _cs->invalidate(dl, type); + _cs->invalidate(txn, dl, type); } for (size_t i = 0; i < _subIterators.size(); i++) { diff --git a/src/mongo/db/exec/oplogstart.h b/src/mongo/db/exec/oplogstart.h index 17ae3f1d02c..a04e8a940f8 100644 --- a/src/mongo/db/exec/oplogstart.h +++ b/src/mongo/db/exec/oplogstart.h @@ -69,7 +69,7 @@ namespace mongo { virtual StageState work(WorkingSetID* out); virtual bool isEOF(); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual void saveState(); virtual void restoreState(OperationContext* opCtx); diff --git a/src/mongo/db/exec/or.cpp b/src/mongo/db/exec/or.cpp index 94b59f40c1e..e115edbbef0 100644 --- a/src/mongo/db/exec/or.cpp +++ b/src/mongo/db/exec/or.cpp @@ -155,13 +155,13 @@ namespace mongo { } } - void OrStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void OrStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; if (isEOF()) { return; } for (size_t i = 0; i < _children.size(); ++i) { - _children[i]->invalidate(dl, type); + _children[i]->invalidate(txn, dl, type); } // If we see DL again it is not the same record as it once was so we still want to diff --git a/src/mongo/db/exec/or.h b/src/mongo/db/exec/or.h index 8c15e8b04dc..71272a3c95f 100644 --- a/src/mongo/db/exec/or.h +++ b/src/mongo/db/exec/or.h @@ -56,7 +56,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/pipeline_proxy.cpp b/src/mongo/db/exec/pipeline_proxy.cpp index 0bb97680c2f..dce1651015f 100644 --- a/src/mongo/db/exec/pipeline_proxy.cpp +++ b/src/mongo/db/exec/pipeline_proxy.cpp @@ -81,10 +81,12 @@ namespace mongo { return true; } - void PipelineProxyStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void PipelineProxyStage::invalidate(OperationContext* txn, + const DiskLoc& dl, + InvalidationType type) { // propagate to child executor if still in use if (boost::shared_ptr<PlanExecutor> exec = _childExec.lock()) { - exec->invalidate(dl, type); + exec->invalidate(txn, dl, type); } } diff --git a/src/mongo/db/exec/pipeline_proxy.h b/src/mongo/db/exec/pipeline_proxy.h index 84e61a862ba..4427166e419 100644 --- a/src/mongo/db/exec/pipeline_proxy.h +++ b/src/mongo/db/exec/pipeline_proxy.h @@ -52,7 +52,7 @@ namespace mongo { virtual bool isEOF(); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); // // Manage our OperationContext. We intentionally don't propagate to the child diff --git a/src/mongo/db/exec/plan_stage.h b/src/mongo/db/exec/plan_stage.h index a135a4b1414..71432c06efa 100644 --- a/src/mongo/db/exec/plan_stage.h +++ b/src/mongo/db/exec/plan_stage.h @@ -201,9 +201,6 @@ namespace mongo { * any saved state and be ready to handle calls to work(). * * Can only be called after saveState. - * - * XXX: We may not need to pass down 'opCtx' if getMore'd queries use the same - * OperationContext they were created with. */ virtual void restoreState(OperationContext* opCtx) = 0; @@ -214,7 +211,9 @@ namespace mongo { * * Can only be called after a saveState but before a restoreState. */ - virtual void invalidate(const DiskLoc& dl, InvalidationType type) = 0; + virtual void invalidate(OperationContext* txn, + const DiskLoc& dl, + InvalidationType type) = 0; /** * Retrieve a list of this stage's children. This stage keeps ownership of diff --git a/src/mongo/db/exec/projection.cpp b/src/mongo/db/exec/projection.cpp index d32e80e005a..2ab07c40843 100644 --- a/src/mongo/db/exec/projection.cpp +++ b/src/mongo/db/exec/projection.cpp @@ -256,9 +256,11 @@ namespace mongo { _child->restoreState(opCtx); } - void ProjectionStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void ProjectionStage::invalidate(OperationContext* txn, + const DiskLoc& dl, + InvalidationType type) { ++_commonStats.invalidates; - _child->invalidate(dl, type); + _child->invalidate(txn, dl, type); } vector<PlanStage*> ProjectionStage::getChildren() const { diff --git a/src/mongo/db/exec/projection.h b/src/mongo/db/exec/projection.h index 51037d1b3b1..41b000ef482 100644 --- a/src/mongo/db/exec/projection.h +++ b/src/mongo/db/exec/projection.h @@ -85,7 +85,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/shard_filter.cpp b/src/mongo/db/exec/shard_filter.cpp index 3ce8eff00c7..4dc828b1a58 100644 --- a/src/mongo/db/exec/shard_filter.cpp +++ b/src/mongo/db/exec/shard_filter.cpp @@ -131,9 +131,11 @@ namespace mongo { _child->restoreState(opCtx); } - void ShardFilterStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void ShardFilterStage::invalidate(OperationContext* txn, + const DiskLoc& dl, + InvalidationType type) { ++_commonStats.invalidates; - _child->invalidate(dl, type); + _child->invalidate(txn, dl, type); } vector<PlanStage*> ShardFilterStage::getChildren() const { diff --git a/src/mongo/db/exec/shard_filter.h b/src/mongo/db/exec/shard_filter.h index 556732d0715..0125c4343c1 100644 --- a/src/mongo/db/exec/shard_filter.h +++ b/src/mongo/db/exec/shard_filter.h @@ -81,7 +81,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/skip.cpp b/src/mongo/db/exec/skip.cpp index 1439f530045..d16801adf36 100644 --- a/src/mongo/db/exec/skip.cpp +++ b/src/mongo/db/exec/skip.cpp @@ -101,9 +101,9 @@ namespace mongo { _child->restoreState(opCtx); } - void SkipStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void SkipStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; - _child->invalidate(dl, type); + _child->invalidate(txn, dl, type); } vector<PlanStage*> SkipStage::getChildren() const { diff --git a/src/mongo/db/exec/skip.h b/src/mongo/db/exec/skip.h index 41be7286e72..785697088b4 100644 --- a/src/mongo/db/exec/skip.h +++ b/src/mongo/db/exec/skip.h @@ -50,7 +50,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/sort.cpp b/src/mongo/db/exec/sort.cpp index 6dea39ec8f2..2105c370fcf 100644 --- a/src/mongo/db/exec/sort.cpp +++ b/src/mongo/db/exec/sort.cpp @@ -280,12 +280,10 @@ namespace mongo { return lhs.loc < rhs.loc; } - SortStage::SortStage(OperationContext* txn, - const SortStageParams& params, + SortStage::SortStage(const SortStageParams& params, WorkingSet* ws, PlanStage* child) - : _txn(txn), - _collection(params.collection), + : _collection(params.collection), _ws(ws), _child(child), _pattern(params.pattern), @@ -429,14 +427,13 @@ namespace mongo { } void SortStage::restoreState(OperationContext* opCtx) { - _txn = opCtx; ++_commonStats.unyields; _child->restoreState(opCtx); } - void SortStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void SortStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; - _child->invalidate(dl, type); + _child->invalidate(txn, dl, type); // If we have a deletion, we can fetch and carry on. // If we have a mutation, it's easier to fetch and use the previous document. @@ -453,7 +450,7 @@ namespace mongo { WorkingSetMember* member = _ws->get(it->second); verify(member->loc == dl); - WorkingSetCommon::fetchAndInvalidateLoc(_txn, member, _collection); + WorkingSetCommon::fetchAndInvalidateLoc(txn, member, _collection); // Remove the DiskLoc from our set of active DLs. _wsidByDiskLoc.erase(it); diff --git a/src/mongo/db/exec/sort.h b/src/mongo/db/exec/sort.h index 9a10ced5c2a..601f8d0e85e 100644 --- a/src/mongo/db/exec/sort.h +++ b/src/mongo/db/exec/sort.h @@ -142,8 +142,7 @@ namespace mongo { */ class SortStage : public PlanStage { public: - SortStage(OperationContext* txn, - const SortStageParams& params, + SortStage(const SortStageParams& params, WorkingSet* ws, PlanStage* child); @@ -154,7 +153,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; @@ -175,7 +174,6 @@ namespace mongo { // // Not owned by us. - OperationContext* _txn; const Collection* _collection; // Not owned by us. diff --git a/src/mongo/db/exec/sort_test.cpp b/src/mongo/db/exec/sort_test.cpp index 61afd9f9e9c..c890fb4dd15 100644 --- a/src/mongo/db/exec/sort_test.cpp +++ b/src/mongo/db/exec/sort_test.cpp @@ -47,7 +47,7 @@ namespace { // MockStage will be owned by SortStage. MockStage* ms = new MockStage(&ws); SortStageParams params; - SortStage sort(NULL, params, &ws, ms); + SortStage sort(params, &ws, ms); // Check initial EOF state. ASSERT_TRUE(ms->isEOF()); @@ -109,7 +109,7 @@ namespace { params.query = fromjson(queryStr); params.limit = limit; - SortStage sort(NULL, params, &ws, ms); + SortStage sort(params, &ws, ms); WorkingSetID id = WorkingSet::INVALID_ID; PlanStage::StageState state = PlanStage::NEED_TIME; diff --git a/src/mongo/db/exec/stagedebug_cmd.cpp b/src/mongo/db/exec/stagedebug_cmd.cpp index e39024a5205..493b28cb567 100644 --- a/src/mongo/db/exec/stagedebug_cmd.cpp +++ b/src/mongo/db/exec/stagedebug_cmd.cpp @@ -228,7 +228,7 @@ namespace mongo { uassert(16921, "Nodes argument must be provided to AND", nodeArgs["nodes"].isABSONObj()); - auto_ptr<AndHashStage> andStage(new AndHashStage(txn, workingSet, matcher, collection)); + auto_ptr<AndHashStage> andStage(new AndHashStage(workingSet, matcher, collection)); int nodesAdded = 0; BSONObjIterator it(nodeArgs["nodes"].Obj()); @@ -253,8 +253,8 @@ namespace mongo { uassert(16924, "Nodes argument must be provided to AND", nodeArgs["nodes"].isABSONObj()); - auto_ptr<AndSortedStage> andStage(new AndSortedStage(txn, workingSet, - matcher, collection)); + auto_ptr<AndSortedStage> andStage(new AndSortedStage(workingSet, matcher, + collection)); int nodesAdded = 0; BSONObjIterator it(nodeArgs["nodes"].Obj()); @@ -372,8 +372,8 @@ namespace mongo { params.pattern = nodeArgs["pattern"].Obj(); // Dedup is true by default. - auto_ptr<MergeSortStage> mergeStage(new MergeSortStage(txn, params, - workingSet, collection)); + auto_ptr<MergeSortStage> mergeStage(new MergeSortStage(params, workingSet, + collection)); BSONObjIterator it(nodeArgs["nodes"].Obj()); while (it.more()) { diff --git a/src/mongo/db/exec/subplan.cpp b/src/mongo/db/exec/subplan.cpp index eb834239d24..a8d27dd3faf 100644 --- a/src/mongo/db/exec/subplan.cpp +++ b/src/mongo/db/exec/subplan.cpp @@ -516,14 +516,14 @@ namespace mongo { } } - void SubplanStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void SubplanStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; if (_killed) { return; } if (NULL != _child.get()) { - _child->invalidate(dl, type); + _child->invalidate(txn, dl, type); } } diff --git a/src/mongo/db/exec/subplan.h b/src/mongo/db/exec/subplan.h index 15c81c7f62f..106464d1e58 100644 --- a/src/mongo/db/exec/subplan.h +++ b/src/mongo/db/exec/subplan.h @@ -67,7 +67,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/text.cpp b/src/mongo/db/exec/text.cpp index a3cfae5c336..60441eb2a81 100644 --- a/src/mongo/db/exec/text.cpp +++ b/src/mongo/db/exec/text.cpp @@ -125,12 +125,12 @@ namespace mongo { } } - void TextStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void TextStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; // Propagate invalidate to children. for (size_t i = 0; i < _scanners.size(); ++i) { - _scanners.mutableVector()[i]->invalidate(dl, type); + _scanners.mutableVector()[i]->invalidate(txn, dl, type); } // We store the score keyed by DiskLoc. We have to toss out our state when the DiskLoc diff --git a/src/mongo/db/exec/text.h b/src/mongo/db/exec/text.h index 15d2be2d0cb..8ef53bd680c 100644 --- a/src/mongo/db/exec/text.h +++ b/src/mongo/db/exec/text.h @@ -110,7 +110,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/exec/update.cpp b/src/mongo/db/exec/update.cpp index fab80fe18d8..5cdc0e9aeba 100644 --- a/src/mongo/db/exec/update.cpp +++ b/src/mongo/db/exec/update.cpp @@ -856,9 +856,9 @@ namespace mongo { uassertStatusOK(restoreUpdateState(opCtx)); } - void UpdateStage::invalidate(const DiskLoc& dl, InvalidationType type) { + void UpdateStage::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { ++_commonStats.invalidates; - _child->invalidate(dl, type); + _child->invalidate(txn, dl, type); } vector<PlanStage*> UpdateStage::getChildren() const { diff --git a/src/mongo/db/exec/update.h b/src/mongo/db/exec/update.h index 99345279c01..8fd8fc3df2d 100644 --- a/src/mongo/db/exec/update.h +++ b/src/mongo/db/exec/update.h @@ -87,7 +87,7 @@ namespace mongo { virtual void saveState(); virtual void restoreState(OperationContext* opCtx); - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); virtual std::vector<PlanStage*> getChildren() const; diff --git a/src/mongo/db/query/plan_executor.cpp b/src/mongo/db/query/plan_executor.cpp index 7863d53964f..3a46d47a9ce 100644 --- a/src/mongo/db/query/plan_executor.cpp +++ b/src/mongo/db/query/plan_executor.cpp @@ -251,8 +251,8 @@ namespace mongo { return !_killed; } - void PlanExecutor::invalidate(const DiskLoc& dl, InvalidationType type) { - if (!_killed) { _root->invalidate(dl, type); } + void PlanExecutor::invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { + if (!_killed) { _root->invalidate(txn, dl, type); } } PlanExecutor::ExecState PlanExecutor::getNext(BSONObj* objOut, DiskLoc* dlOut) { diff --git a/src/mongo/db/query/plan_executor.h b/src/mongo/db/query/plan_executor.h index 40bb3787dba..50a11c0d2f8 100644 --- a/src/mongo/db/query/plan_executor.h +++ b/src/mongo/db/query/plan_executor.h @@ -296,7 +296,7 @@ namespace mongo { * state. As such, if the plan yields, it must be notified of relevant writes so that * we can ensure that it doesn't crash if we try to access invalid state. */ - void invalidate(const DiskLoc& dl, InvalidationType type); + void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type); /** * Helper method to aid in displaying an ExecState for debug or other recreational purposes. diff --git a/src/mongo/db/query/stage_builder.cpp b/src/mongo/db/query/stage_builder.cpp index e097f5ab7f4..549a8f461d9 100644 --- a/src/mongo/db/query/stage_builder.cpp +++ b/src/mongo/db/query/stage_builder.cpp @@ -109,7 +109,7 @@ namespace mongo { params.pattern = sn->pattern; params.query = sn->query; params.limit = sn->limit; - return new SortStage(txn, params, ws, childStage); + return new SortStage(params, ws, childStage); } else if (STAGE_PROJECTION == root->getType()) { const ProjectionNode* pn = static_cast<const ProjectionNode*>(root); @@ -150,7 +150,7 @@ namespace mongo { } else if (STAGE_AND_HASH == root->getType()) { const AndHashNode* ahn = static_cast<const AndHashNode*>(root); - auto_ptr<AndHashStage> ret(new AndHashStage(txn, ws, ahn->filter.get(), collection)); + auto_ptr<AndHashStage> ret(new AndHashStage(ws, ahn->filter.get(), collection)); for (size_t i = 0; i < ahn->children.size(); ++i) { PlanStage* childStage = buildStages(txn, collection, qsol, ahn->children[i], ws); if (NULL == childStage) { return NULL; } @@ -170,7 +170,7 @@ namespace mongo { } else if (STAGE_AND_SORTED == root->getType()) { const AndSortedNode* asn = static_cast<const AndSortedNode*>(root); - auto_ptr<AndSortedStage> ret(new AndSortedStage(txn, ws, asn->filter.get(), collection)); + auto_ptr<AndSortedStage> ret(new AndSortedStage(ws, asn->filter.get(), collection)); for (size_t i = 0; i < asn->children.size(); ++i) { PlanStage* childStage = buildStages(txn, collection, qsol, asn->children[i], ws); if (NULL == childStage) { return NULL; } @@ -183,7 +183,7 @@ namespace mongo { MergeSortStageParams params; params.dedup = msn->dedup; params.pattern = msn->sort; - auto_ptr<MergeSortStage> ret(new MergeSortStage(txn, params, ws, collection)); + auto_ptr<MergeSortStage> ret(new MergeSortStage(params, ws, collection)); for (size_t i = 0; i < msn->children.size(); ++i) { PlanStage* childStage = buildStages(txn, collection, qsol, msn->children[i], ws); if (NULL == childStage) { return NULL; } diff --git a/src/mongo/dbtests/query_stage_and.cpp b/src/mongo/dbtests/query_stage_and.cpp index 392c296ca2d..30f2c00c547 100644 --- a/src/mongo/dbtests/query_stage_and.cpp +++ b/src/mongo/dbtests/query_stage_and.cpp @@ -173,7 +173,7 @@ namespace QueryStageAnd { addIndex(BSON("bar" << 1)); WorkingSet ws; - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, NULL, coll)); // Foo <= 20 IndexScanParams params; @@ -210,7 +210,7 @@ namespace QueryStageAnd { size_t memUsageBefore = ah->getMemUsage(); for (set<DiskLoc>::const_iterator it = data.begin(); it != data.end(); ++it) { if (coll->docFor(&_txn, *it)["foo"].numberInt() == 15) { - ah->invalidate(*it, INVALIDATION_DELETION); + ah->invalidate(&_txn, *it, INVALIDATION_DELETION); remove(coll->docFor(&_txn, *it)); break; } @@ -277,7 +277,7 @@ namespace QueryStageAnd { addIndex(BSON("baz" << 1)); WorkingSet ws; - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, NULL, coll)); // Foo <= 20 (descending) IndexScanParams params; @@ -313,7 +313,7 @@ namespace QueryStageAnd { size_t memUsageBefore = ah->getMemUsage(); for (set<DiskLoc>::const_iterator it = data.begin(); it != data.end(); ++it) { if (0 == deletedObj.woCompare(coll->docFor(&_txn, *it))) { - ah->invalidate(*it, INVALIDATION_DELETION); + ah->invalidate(&_txn, *it, INVALIDATION_DELETION); break; } } @@ -363,7 +363,7 @@ namespace QueryStageAnd { addIndex(BSON("bar" << 1)); WorkingSet ws; - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, NULL, coll)); // Foo <= 20 IndexScanParams params; @@ -418,7 +418,7 @@ namespace QueryStageAnd { // before hashed AND is done reading the first child (stage has to // hold 21 keys in buffer for Foo <= 20). WorkingSet ws; - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, NULL, coll, 20 * big.size())); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, NULL, coll, 20 * big.size())); // Foo <= 20 IndexScanParams params; @@ -471,7 +471,7 @@ namespace QueryStageAnd { // keys in last child's index are not buffered. There are 6 keys // that satisfy the criteria Foo <= 20 and Bar >= 10 and 5 <= baz <= 15. WorkingSet ws; - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, NULL, coll, 5 * big.size())); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, NULL, coll, 5 * big.size())); // Foo <= 20 IndexScanParams params; @@ -519,7 +519,7 @@ namespace QueryStageAnd { addIndex(BSON("baz" << 1)); WorkingSet ws; - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, NULL, coll)); // Foo <= 20 IndexScanParams params; @@ -586,7 +586,7 @@ namespace QueryStageAnd { // before hashed AND is done reading the second child (stage has to // hold 11 keys in buffer for Foo <= 20 and Bar >= 10). WorkingSet ws; - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, NULL, coll, 10 * big.size())); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, NULL, coll, 10 * big.size())); // Foo <= 20 IndexScanParams params; @@ -640,7 +640,7 @@ namespace QueryStageAnd { addIndex(BSON("bar" << 1)); WorkingSet ws; - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, NULL, coll)); // Foo <= 20 IndexScanParams params; @@ -701,7 +701,7 @@ namespace QueryStageAnd { addIndex(BSON("bar" << 1)); WorkingSet ws; - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, NULL, coll)); // Foo >= 100 IndexScanParams params; @@ -753,7 +753,7 @@ namespace QueryStageAnd { StatusWithMatchExpression swme = MatchExpressionParser::parse(filter); verify(swme.isOK()); auto_ptr<MatchExpression> filterExpr(swme.getValue()); - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, filterExpr.get(), coll)); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, filterExpr.get(), coll)); // Foo <= 20 IndexScanParams params; @@ -802,7 +802,7 @@ namespace QueryStageAnd { addIndex(BSON("bar" << 1)); WorkingSet ws; - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, NULL, coll)); // Foo <= 20 IndexScanParams params; @@ -861,7 +861,7 @@ namespace QueryStageAnd { addIndex(BSON("bar" << 1)); WorkingSet ws; - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, NULL, coll)); // Foo <= 20 IndexScanParams params; @@ -925,7 +925,7 @@ namespace QueryStageAnd { addIndex(BSON("bar" << 1)); WorkingSet ws; - scoped_ptr<AndSortedStage> ah(new AndSortedStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndSortedStage> ah(new AndSortedStage(&ws, NULL, coll)); // Scan over foo == 1 IndexScanParams params; @@ -957,7 +957,7 @@ namespace QueryStageAnd { // very first insert, which should be the very first thing in data. Let's invalidate it // and make sure it shows up in the flagged results. ah->saveState(); - ah->invalidate(*data.begin(), INVALIDATION_DELETION); + ah->invalidate(&_txn, *data.begin(), INVALIDATION_DELETION); remove(coll->docFor(&_txn, *data.begin())); ah->restoreState(&_txn); @@ -996,7 +996,7 @@ namespace QueryStageAnd { // Remove a result that's coming up. It's not the 'target' result of the AND so it's // not flagged. ah->saveState(); - ah->invalidate(*it, INVALIDATION_DELETION); + ah->invalidate(&_txn, *it, INVALIDATION_DELETION); remove(coll->docFor(&_txn, *it)); ah->restoreState(&_txn); @@ -1052,7 +1052,7 @@ namespace QueryStageAnd { addIndex(BSON("baz" << 1)); WorkingSet ws; - scoped_ptr<AndSortedStage> ah(new AndSortedStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndSortedStage> ah(new AndSortedStage(&ws, NULL, coll)); // Scan over foo == 1 IndexScanParams params; @@ -1097,7 +1097,7 @@ namespace QueryStageAnd { addIndex(BSON("bar" << 1)); WorkingSet ws; - scoped_ptr<AndSortedStage> ah(new AndSortedStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndSortedStage> ah(new AndSortedStage(&ws, NULL, coll)); // Foo == 7. Should be EOF. IndexScanParams params; @@ -1146,7 +1146,7 @@ namespace QueryStageAnd { addIndex(BSON("bar" << 1)); WorkingSet ws; - scoped_ptr<AndSortedStage> ah(new AndSortedStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndSortedStage> ah(new AndSortedStage(&ws, NULL, coll)); // foo == 7. IndexScanParams params; @@ -1195,7 +1195,7 @@ namespace QueryStageAnd { StatusWithMatchExpression swme = MatchExpressionParser::parse(filterObj); verify(swme.isOK()); auto_ptr<MatchExpression> filterExpr(swme.getValue()); - scoped_ptr<AndSortedStage> ah(new AndSortedStage(&_txn, &ws, filterExpr.get(), coll)); + scoped_ptr<AndSortedStage> ah(new AndSortedStage(&ws, filterExpr.get(), coll)); // Scan over foo == 1 IndexScanParams params; @@ -1237,7 +1237,7 @@ namespace QueryStageAnd { addIndex(BSON("bar" << 1)); WorkingSet ws; - scoped_ptr<AndHashStage> ah(new AndHashStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndHashStage> ah(new AndHashStage(&ws, NULL, coll)); // Scan over foo == 1 IndexScanParams params; @@ -1301,7 +1301,7 @@ namespace QueryStageAnd { addIndex(BSON("bar" << 1)); WorkingSet ws; - scoped_ptr<AndSortedStage> as(new AndSortedStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndSortedStage> as(new AndSortedStage(&ws, NULL, coll)); // Scan over foo == 1 IndexScanParams params; @@ -1355,7 +1355,7 @@ namespace QueryStageAnd { addIndex(BSON("bar" << 1)); WorkingSet ws; - scoped_ptr<AndSortedStage> as(new AndSortedStage(&_txn, &ws, NULL, coll)); + scoped_ptr<AndSortedStage> as(new AndSortedStage(&ws, NULL, coll)); // Scan over foo == 1 IndexScanParams params; diff --git a/src/mongo/dbtests/query_stage_collscan.cpp b/src/mongo/dbtests/query_stage_collscan.cpp index 0d2b5bec74c..f2e406e29fb 100644 --- a/src/mongo/dbtests/query_stage_collscan.cpp +++ b/src/mongo/dbtests/query_stage_collscan.cpp @@ -288,7 +288,7 @@ namespace QueryStageCollectionScan { // Remove locs[count]. scan->saveState(); - scan->invalidate(locs[count], INVALIDATION_DELETION); + scan->invalidate(&_txn, locs[count], INVALIDATION_DELETION); remove(coll->docFor(&_txn, locs[count])); scan->restoreState(&_txn); @@ -349,7 +349,7 @@ namespace QueryStageCollectionScan { // Remove locs[count]. scan->saveState(); - scan->invalidate(locs[count], INVALIDATION_DELETION); + scan->invalidate(&_txn, locs[count], INVALIDATION_DELETION); remove(coll->docFor(&_txn, locs[count])); scan->restoreState(&_txn); diff --git a/src/mongo/dbtests/query_stage_count.cpp b/src/mongo/dbtests/query_stage_count.cpp index 817dd2918cc..3593d0841e3 100644 --- a/src/mongo/dbtests/query_stage_count.cpp +++ b/src/mongo/dbtests/query_stage_count.cpp @@ -281,10 +281,10 @@ namespace QueryStageCount { if (interjection == 0) { // At this point, our first interjection, we've counted _locs[0] // and are about to count _locs[1] - count_stage.invalidate(_locs[interjection], INVALIDATION_DELETION); + count_stage.invalidate(&_txn, _locs[interjection], INVALIDATION_DELETION); remove(_locs[interjection]); - count_stage.invalidate(_locs[interjection+1], INVALIDATION_DELETION); + count_stage.invalidate(&_txn, _locs[interjection+1], INVALIDATION_DELETION); remove(_locs[interjection+1]); } } @@ -303,11 +303,11 @@ namespace QueryStageCount { // At the point which this is called we are in between the first and second record void interject(CountStage& count_stage, int interjection) { if (interjection == 0) { - count_stage.invalidate(_locs[0], INVALIDATION_MUTATION); + count_stage.invalidate(&_txn, _locs[0], INVALIDATION_MUTATION); OID id1 = _coll->docFor(&_txn, _locs[0]).getField("_id").OID(); update(_locs[0], BSON("_id" << id1 << "x" << 100)); - count_stage.invalidate(_locs[1], INVALIDATION_MUTATION); + count_stage.invalidate(&_txn, _locs[1], INVALIDATION_MUTATION); OID id2 = _coll->docFor(&_txn, _locs[1]).getField("_id").OID(); update(_locs[1], BSON("_id" << id2 << "x" << 100)); } diff --git a/src/mongo/dbtests/query_stage_delete.cpp b/src/mongo/dbtests/query_stage_delete.cpp index 56849e38f70..ed13459cc77 100644 --- a/src/mongo/dbtests/query_stage_delete.cpp +++ b/src/mongo/dbtests/query_stage_delete.cpp @@ -142,7 +142,7 @@ namespace QueryStageDelete { // Remove locs[targetDocIndex]; deleteStage.saveState(); - deleteStage.invalidate(locs[targetDocIndex], INVALIDATION_DELETION); + deleteStage.invalidate(&_txn, locs[targetDocIndex], INVALIDATION_DELETION); BSONObj targetDoc = coll->docFor(&_txn, locs[targetDocIndex]); ASSERT(!targetDoc.isEmpty()); remove(targetDoc); diff --git a/src/mongo/dbtests/query_stage_merge_sort.cpp b/src/mongo/dbtests/query_stage_merge_sort.cpp index e0cb3676077..059cfe9e7e7 100644 --- a/src/mongo/dbtests/query_stage_merge_sort.cpp +++ b/src/mongo/dbtests/query_stage_merge_sort.cpp @@ -135,7 +135,7 @@ namespace QueryStageMergeSortTests { // Sort by c:1 MergeSortStageParams msparams; msparams.pattern = BSON("c" << 1); - MergeSortStage* ms = new MergeSortStage(&_txn, msparams, ws, coll); + MergeSortStage* ms = new MergeSortStage(msparams, ws, coll); // a:1 IndexScanParams params; @@ -204,7 +204,7 @@ namespace QueryStageMergeSortTests { // Sort by c:1 MergeSortStageParams msparams; msparams.pattern = BSON("c" << 1); - MergeSortStage* ms = new MergeSortStage(&_txn, msparams, ws, coll); + MergeSortStage* ms = new MergeSortStage(msparams, ws, coll); // a:1 IndexScanParams params; @@ -272,7 +272,7 @@ namespace QueryStageMergeSortTests { MergeSortStageParams msparams; msparams.dedup = false; msparams.pattern = BSON("c" << 1); - MergeSortStage* ms = new MergeSortStage(&_txn, msparams, ws, coll); + MergeSortStage* ms = new MergeSortStage(msparams, ws, coll); // a:1 IndexScanParams params; @@ -342,7 +342,7 @@ namespace QueryStageMergeSortTests { // Sort by c:-1 MergeSortStageParams msparams; msparams.pattern = BSON("c" << -1); - MergeSortStage* ms = new MergeSortStage(&_txn, msparams, ws, coll); + MergeSortStage* ms = new MergeSortStage(msparams, ws, coll); // a:1 IndexScanParams params; @@ -411,7 +411,7 @@ namespace QueryStageMergeSortTests { // Sort by c:1 MergeSortStageParams msparams; msparams.pattern = BSON("c" << 1); - MergeSortStage* ms = new MergeSortStage(&_txn, msparams, ws, coll); + MergeSortStage* ms = new MergeSortStage(msparams, ws, coll); // a:1 IndexScanParams params; @@ -466,7 +466,7 @@ namespace QueryStageMergeSortTests { // Sort by foo:1 MergeSortStageParams msparams; msparams.pattern = BSON("foo" << 1); - MergeSortStage* ms = new MergeSortStage(&_txn, msparams, ws, coll); + MergeSortStage* ms = new MergeSortStage(msparams, ws, coll); IndexScanParams params; params.bounds.isSimpleRange = true; @@ -524,7 +524,7 @@ namespace QueryStageMergeSortTests { // Sort by foo:1 MergeSortStageParams msparams; msparams.pattern = BSON("foo" << 1); - auto_ptr<MergeSortStage> ms(new MergeSortStage(&_txn, msparams, &ws, coll)); + auto_ptr<MergeSortStage> ms(new MergeSortStage(msparams, &ws, coll)); IndexScanParams params; params.bounds.isSimpleRange = true; @@ -573,7 +573,7 @@ namespace QueryStageMergeSortTests { // Invalidate locs[11]. Should force a fetch. We don't get it back. ms->saveState(); - ms->invalidate(*it, INVALIDATION_DELETION); + ms->invalidate(&_txn, *it, INVALIDATION_DELETION); ms->restoreState(&_txn); // Make sure locs[11] was fetched for us. diff --git a/src/mongo/dbtests/query_stage_near.cpp b/src/mongo/dbtests/query_stage_near.cpp index 28c6bba36d3..961c2022897 100644 --- a/src/mongo/dbtests/query_stage_near.cpp +++ b/src/mongo/dbtests/query_stage_near.cpp @@ -88,7 +88,7 @@ namespace { virtual void restoreState(OperationContext* opCtx) { } - virtual void invalidate(const DiskLoc& dl, InvalidationType type) { + virtual void invalidate(OperationContext* txn, const DiskLoc& dl, InvalidationType type) { } virtual vector<PlanStage*> getChildren() const { return vector<PlanStage*>(); diff --git a/src/mongo/dbtests/query_stage_sort.cpp b/src/mongo/dbtests/query_stage_sort.cpp index f4d81acea2d..4dfa777d720 100644 --- a/src/mongo/dbtests/query_stage_sort.cpp +++ b/src/mongo/dbtests/query_stage_sort.cpp @@ -127,7 +127,7 @@ namespace QueryStageSortTests { PlanExecutor::make(&_txn, ws, new FetchStage(&_txn, ws, - new SortStage(&_txn, params, ws, ms), NULL, coll), + new SortStage(params, ws, ms), NULL, coll), coll, PlanExecutor::YIELD_MANUAL, &rawExec); ASSERT_OK(status); boost::scoped_ptr<PlanExecutor> exec(rawExec); @@ -281,7 +281,7 @@ namespace QueryStageSortTests { params.collection = coll; params.pattern = BSON("foo" << 1); params.limit = limit(); - auto_ptr<SortStage> ss(new SortStage(&_txn, params, &ws, ms.get())); + auto_ptr<SortStage> ss(new SortStage(params, &ws, ms.get())); const int firstRead = 10; @@ -295,7 +295,7 @@ namespace QueryStageSortTests { // We should have read in the first 'firstRead' locs. Invalidate the first. ss->saveState(); set<DiskLoc>::iterator it = locs.begin(); - ss->invalidate(*it++, INVALIDATION_DELETION); + ss->invalidate(&_txn, *it++, INVALIDATION_DELETION); ss->restoreState(&_txn); // Read the rest of the data from the mock stage. @@ -310,7 +310,7 @@ namespace QueryStageSortTests { // Let's just invalidate everything now. ss->saveState(); while (it != locs.end()) { - ss->invalidate(*it++, INVALIDATION_DELETION); + ss->invalidate(&_txn, *it++, INVALIDATION_DELETION); } ss->restoreState(&_txn); @@ -384,7 +384,7 @@ namespace QueryStageSortTests { ws, new FetchStage(&_txn, ws, - new SortStage(&_txn, params, ws, ms), NULL, coll), + new SortStage(params, ws, ms), NULL, coll), coll, PlanExecutor::YIELD_MANUAL, &rawExec); boost::scoped_ptr<PlanExecutor> exec(rawExec); diff --git a/src/mongo/dbtests/query_stage_update.cpp b/src/mongo/dbtests/query_stage_update.cpp index 0fd932a0c80..75df12f9978 100644 --- a/src/mongo/dbtests/query_stage_update.cpp +++ b/src/mongo/dbtests/query_stage_update.cpp @@ -307,7 +307,7 @@ namespace QueryStageUpdate { // Remove locs[targetDocIndex]; updateStage->saveState(); - updateStage->invalidate(locs[targetDocIndex], INVALIDATION_DELETION); + updateStage->invalidate(&_txn, locs[targetDocIndex], INVALIDATION_DELETION); BSONObj targetDoc = coll->docFor(&_txn, locs[targetDocIndex]); ASSERT(!targetDoc.isEmpty()); remove(targetDoc); diff --git a/src/mongo/s/d_migrate.cpp b/src/mongo/s/d_migrate.cpp index 34c303ab6ad..528f57764d8 100644 --- a/src/mongo/s/d_migrate.cpp +++ b/src/mongo/s/d_migrate.cpp @@ -695,7 +695,9 @@ namespace mongo { */ class DeleteNotificationStage : public PlanStage { public: - virtual void invalidate(const DiskLoc& dl, InvalidationType type); + virtual void invalidate(OperationContext* txn, + const DiskLoc& dl, + InvalidationType type); virtual StageState work(WorkingSetID* out) { invariant( false ); @@ -737,7 +739,8 @@ namespace mongo { } migrateFromStatus; - void MigrateFromStatus::DeleteNotificationStage::invalidate(const DiskLoc& dl, + void MigrateFromStatus::DeleteNotificationStage::invalidate(OperationContext *txn, + const DiskLoc& dl, InvalidationType type) { if ( type == INVALIDATION_DELETION ) { migrateFromStatus.aboutToDelete( dl ); |