diff options
author | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2014-12-12 10:10:50 -0500 |
---|---|---|
committer | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2014-12-12 10:10:50 -0500 |
commit | ab7a8649faf5c21901c719bbc88840ba7382a5d0 (patch) | |
tree | 8a00cc8f917fc7751b565f8fe496ecd3e9e12f8c | |
parent | 5950976bb7c42acec51850614edcebe6ad8bb233 (diff) | |
download | mongo-ab7a8649faf5c21901c719bbc88840ba7382a5d0.tar.gz |
SERVER-16429 Get rid of assertWriteLocked which was doing incomplete check
-rw-r--r-- | src/mongo/db/catalog/database.cpp | 8 | ||||
-rw-r--r-- | src/mongo/db/catalog/index_catalog.cpp | 15 | ||||
-rw-r--r-- | src/mongo/db/commands/create_indexes.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/commands/test_commands.cpp | 31 | ||||
-rw-r--r-- | src/mongo/db/commands/write_commands/batch_executor.cpp | 7 | ||||
-rw-r--r-- | src/mongo/db/concurrency/d_concurrency_test.cpp | 5 | ||||
-rw-r--r-- | src/mongo/db/concurrency/lock_state.cpp | 35 | ||||
-rw-r--r-- | src/mongo/db/concurrency/lock_state.h | 10 | ||||
-rw-r--r-- | src/mongo/db/concurrency/locker.h | 5 | ||||
-rw-r--r-- | src/mongo/db/instance.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/storage/mmap_v1/catalog/namespace_details.cpp | 8 | ||||
-rw-r--r-- | src/mongo/db/storage/mmap_v1/catalog/namespace_index.cpp | 24 | ||||
-rw-r--r-- | src/mongo/db/storage/mmap_v1/mmap_v1_database_catalog_entry.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp | 4 | ||||
-rw-r--r-- | src/mongo/dbtests/documentsourcetests.cpp | 22 | ||||
-rw-r--r-- | src/mongo/dbtests/rollbacktests.cpp | 26 | ||||
-rw-r--r-- | src/mongo/dbtests/threadedtests.cpp | 2 | ||||
-rw-r--r-- | src/mongo/s/d_state.cpp | 14 |
18 files changed, 104 insertions, 119 deletions
diff --git a/src/mongo/db/catalog/database.cpp b/src/mongo/db/catalog/database.cpp index 88c46cce27c..24c0ea01821 100644 --- a/src/mongo/db/catalog/database.cpp +++ b/src/mongo/db/catalog/database.cpp @@ -218,8 +218,7 @@ namespace mongo { } void Database::clearTmpCollections(OperationContext* txn) { - - txn->lockState()->assertWriteLocked( _name ); + invariant(txn->lockState()->isDbLockedForMode(name(), MODE_X)); list<string> collections; _dbEntry->getCollectionNamespaces( &collections ); @@ -554,10 +553,11 @@ namespace mongo { void dropDatabase(OperationContext* txn, Database* db ) { invariant( db ); - string name = db->name(); // just to have safe + // Store the name so we have if for after the db object is deleted + const string name = db->name(); LOG(1) << "dropDatabase " << name << endl; - txn->lockState()->assertWriteLocked( name ); + invariant(txn->lockState()->isDbLockedForMode(name, MODE_X)); BackgroundOperation::assertNoBgOpInProgForDb(name.c_str()); diff --git a/src/mongo/db/catalog/index_catalog.cpp b/src/mongo/db/catalog/index_catalog.cpp index 2095798ec19..3919ce67704 100644 --- a/src/mongo/db/catalog/index_catalog.cpp +++ b/src/mongo/db/catalog/index_catalog.cpp @@ -344,7 +344,8 @@ namespace { } // namespace Status IndexCatalog::createIndexOnEmptyCollection(OperationContext* txn, BSONObj spec) { - txn->lockState()->assertWriteLocked( _collection->_database->name() ); + invariant(txn->lockState()->isCollectionLockedForMode(_collection->ns().toString(), + MODE_X)); invariant(_collection->numRecords(txn) == 0); _checkMagic(); @@ -694,7 +695,8 @@ namespace { Status IndexCatalog::dropAllIndexes(OperationContext* txn, bool includingIdIndex) { - txn->lockState()->assertWriteLocked( _collection->_database->name() ); + invariant(txn->lockState()->isCollectionLockedForMode(_collection->ns().toString(), + MODE_X)); BackgroundOperation::assertNoBgOpInProgForNs( _collection->ns().ns() ); @@ -765,8 +767,8 @@ namespace { Status IndexCatalog::dropIndex(OperationContext* txn, IndexDescriptor* desc ) { - - txn->lockState()->assertWriteLocked( _collection->_database->name() ); + invariant(txn->lockState()->isCollectionLockedForMode(_collection->ns().toString(), + MODE_X)); IndexCatalogEntry* entry = _entries.find( desc ); if ( !entry ) @@ -1036,9 +1038,10 @@ namespace { const IndexDescriptor* IndexCatalog::refreshEntry( OperationContext* txn, const IndexDescriptor* oldDesc ) { - txn->lockState()->assertWriteLocked( _collection->_database->name() ); + invariant(txn->lockState()->isCollectionLockedForMode(_collection->ns().ns(), + MODE_X)); - std::string indexName = oldDesc->indexName(); + const std::string indexName = oldDesc->indexName(); invariant( _collection->getCatalogEntry()->isIndexReady( txn, indexName ) ); // Notify other users of the IndexCatalog that we're about to invalidate 'oldDesc'. diff --git a/src/mongo/db/commands/create_indexes.cpp b/src/mongo/db/commands/create_indexes.cpp index 67cd6bdff33..9c9bb8905d0 100644 --- a/src/mongo/db/commands/create_indexes.cpp +++ b/src/mongo/db/commands/create_indexes.cpp @@ -247,7 +247,8 @@ namespace mongo { static Status checkUniqueIndexConstraints(OperationContext* txn, const StringData& ns, const BSONObj& newIdxKey) { - txn->lockState()->assertWriteLocked( ns ); + + invariant(txn->lockState()->isCollectionLockedForMode(ns, MODE_X)); if ( shardingState.enabled() ) { CollectionMetadataPtr metadata( diff --git a/src/mongo/db/commands/test_commands.cpp b/src/mongo/db/commands/test_commands.cpp index 28ed71e00e8..68dab0470f1 100644 --- a/src/mongo/db/commands/test_commands.cpp +++ b/src/mongo/db/commands/test_commands.cpp @@ -199,27 +199,36 @@ namespace mongo { } virtual bool run(OperationContext* txn, const string& dbname , BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) { - string coll = cmdObj[ "emptycapped" ].valuestrsafe(); + const std::string coll = cmdObj[ "emptycapped" ].valuestrsafe(); uassert( 13428, "emptycapped must specify a collection", !coll.empty() ); - NamespaceString nss( dbname, coll ); - Client::WriteContext ctx(txn, nss.ns() ); - WriteUnitOfWork wuow(txn); - Database* db = ctx.db(); - Collection* collection = ctx.getCollection(); - massert( 13429, "emptycapped no such collection", collection ); + const NamespaceString nss( dbname, coll ); + + AutoGetDb autoDb(txn, dbname, MODE_X); + + Database* db = autoDb.getDb(); + massert(13429, "no such database", db); + + Collection* collection = db->getCollection(txn, nss.ns()); + massert(28584, "no such collection", collection); std::vector<BSONObj> indexes = stopIndexBuilds(txn, db, cmdObj); + WriteUnitOfWork wuow(txn); + Status status = collection->truncate(txn); - if ( !status.isOK() ) - return appendCommandStatus( result, status ); + if (!status.isOK()) { + return appendCommandStatus(result, status); + } IndexBuilder::restoreIndexes(indexes); - if (!fromRepl) - repl::logOp(txn, "c",(dbname + ".$cmd").c_str(), cmdObj); + if (!fromRepl) { + repl::logOp(txn, "c", (dbname + ".$cmd").c_str(), cmdObj); + } + wuow.commit(); + return true; } }; diff --git a/src/mongo/db/commands/write_commands/batch_executor.cpp b/src/mongo/db/commands/write_commands/batch_executor.cpp index 1be8e88f502..760696862f2 100644 --- a/src/mongo/db/commands/write_commands/batch_executor.cpp +++ b/src/mongo/db/commands/write_commands/batch_executor.cpp @@ -433,7 +433,7 @@ namespace mongo { WriteOpResult* result) { const NamespaceString& nss = request.getTargetingNSS(); - txn->lockState()->assertWriteLocked( nss.ns() ); + dassert(txn->lockState()->isCollectionLockedForMode(nss.ns(), MODE_IX)); ChunkVersion requestShardVersion = request.isMetadataSet() && request.getMetadata()->isShardVersionSet() ? @@ -486,7 +486,7 @@ namespace mongo { WriteOpResult* result) { const NamespaceString& nss = request.getTargetingNSS(); - txn->lockState()->assertWriteLocked( nss.ns() ); + dassert(txn->lockState()->isCollectionLockedForMode(nss.ns(), MODE_IX)); if ( !request.isUniqueIndexRequest() ) return true; @@ -1103,8 +1103,7 @@ namespace mongo { WriteOpResult* result ) { const string& insertNS = collection->ns().ns(); - - txn->lockState()->assertWriteLocked( insertNS ); + invariant(txn->lockState()->isCollectionLockedForMode(insertNS, MODE_IX)); WriteUnitOfWork wunit(txn); StatusWith<RecordId> status = collection->insertDocument( txn, docToInsert, true ); diff --git a/src/mongo/db/concurrency/d_concurrency_test.cpp b/src/mongo/db/concurrency/d_concurrency_test.cpp index cdc28b34d25..b874a1c1b4d 100644 --- a/src/mongo/db/concurrency/d_concurrency_test.cpp +++ b/src/mongo/db/concurrency/d_concurrency_test.cpp @@ -176,7 +176,7 @@ namespace mongo { Lock::DBLock r1(&ls, "db1", MODE_X); Lock::DBLock r2(&ls, "db1", MODE_X); - ASSERT(ls.isWriteLocked("db1")); + ASSERT(ls.isDbLockedForMode("db1", MODE_X)); } TEST(DConcurrency, MultipleConflictingDBLocksOnSameThread) { @@ -185,7 +185,8 @@ namespace mongo { Lock::DBLock r1(&ls, "db1", MODE_X); Lock::DBLock r2(&ls, "db1", MODE_S); - ASSERT(ls.isWriteLocked("db1")); + ASSERT(ls.isDbLockedForMode("db1", MODE_X)); + ASSERT(ls.isDbLockedForMode("db1", MODE_S)); } TEST(DConcurrency, IsDbLockedForSMode) { diff --git a/src/mongo/db/concurrency/lock_state.cpp b/src/mongo/db/concurrency/lock_state.cpp index a80a2a966a4..aed2fffe15f 100644 --- a/src/mongo/db/concurrency/lock_state.cpp +++ b/src/mongo/db/concurrency/lock_state.cpp @@ -161,11 +161,6 @@ namespace { } template<bool IsForMMAPV1> - bool LockerImpl<IsForMMAPV1>::hasAnyReadLock() const { - return isLockHeldForMode(resourceIdGlobal, MODE_IS); - } - - template<bool IsForMMAPV1> bool LockerImpl<IsForMMAPV1>::isLocked() const { return getLockMode(resourceIdGlobal) != MODE_NONE; } @@ -176,24 +171,8 @@ namespace { } template<bool IsForMMAPV1> - bool LockerImpl<IsForMMAPV1>::isWriteLocked(const StringData& ns) const { - if (isWriteLocked()) { - return true; - } - - const StringData db = nsToDatabaseSubstring(ns); - const ResourceId resIdNs(RESOURCE_DATABASE, db); - - return isLockHeldForMode(resIdNs, MODE_X); - } - - template<bool IsForMMAPV1> - void LockerImpl<IsForMMAPV1>::assertWriteLocked(const StringData& ns) const { - if (!isWriteLocked(ns)) { - dump(); - msgasserted( - 16105, mongoutils::str::stream() << "expected to be write locked for " << ns); - } + bool LockerImpl<IsForMMAPV1>::isReadLocked() const { + return isLockHeldForMode(resourceIdGlobal, MODE_IS); } template<bool IsForMMAPV1> @@ -774,8 +753,7 @@ namespace { AutoAcquireFlushLockForMMAPV1Commit::AutoAcquireFlushLockForMMAPV1Commit(Locker* locker) - : _locker(static_cast<MMAPV1LockerImpl*>(locker)), - _isReleased(false) { + : _locker(static_cast<MMAPV1LockerImpl*>(locker)) { invariant(LOCK_OK == _locker->lock(resourceIdMMAPV1Flush, MODE_S)); } @@ -784,19 +762,16 @@ namespace { invariant(LOCK_OK == _locker->lock(resourceIdMMAPV1Flush, MODE_X)); // Lock bumps the recursive count. Drop it back down so that the destructor doesn't - // complain + // complain. invariant(!_locker->unlock(resourceIdMMAPV1Flush)); } void AutoAcquireFlushLockForMMAPV1Commit::release() { invariant(_locker->unlock(resourceIdMMAPV1Flush)); - _isReleased = true; } AutoAcquireFlushLockForMMAPV1Commit::~AutoAcquireFlushLockForMMAPV1Commit() { - if (!_isReleased) { - invariant(_locker->unlock(resourceIdMMAPV1Flush)); - } + invariant(_locker->unlock(resourceIdMMAPV1Flush)); } diff --git a/src/mongo/db/concurrency/lock_state.h b/src/mongo/db/concurrency/lock_state.h index d034b158e8b..05c063804e7 100644 --- a/src/mongo/db/concurrency/lock_state.h +++ b/src/mongo/db/concurrency/lock_state.h @@ -213,13 +213,10 @@ namespace mongo { virtual bool isW() const; virtual bool isR() const; - virtual bool hasAnyReadLock() const; virtual bool isLocked() const; virtual bool isWriteLocked() const; - virtual bool isWriteLocked(const StringData& ns) const; - - virtual void assertWriteLocked(const StringData& ns) const; + virtual bool isReadLocked() const; virtual bool hasLockPending() const { return getWaitingResource().isValid() || _lockPendingParallelWriter; } @@ -252,7 +249,7 @@ namespace mongo { ~AutoYieldFlushLockForMMAPV1Commit(); private: - MMAPV1LockerImpl* _locker; + MMAPV1LockerImpl* const _locker; }; @@ -296,8 +293,7 @@ namespace mongo { void release(); private: - MMAPV1LockerImpl* _locker; - bool _isReleased;; + MMAPV1LockerImpl* const _locker; }; diff --git a/src/mongo/db/concurrency/locker.h b/src/mongo/db/concurrency/locker.h index fff17db48ef..352ab67328c 100644 --- a/src/mongo/db/concurrency/locker.h +++ b/src/mongo/db/concurrency/locker.h @@ -253,13 +253,10 @@ namespace mongo { virtual bool isW() const = 0; virtual bool isR() const = 0; - virtual bool hasAnyReadLock() const = 0; // explicitly r or R virtual bool isLocked() const = 0; virtual bool isWriteLocked() const = 0; - virtual bool isWriteLocked(const StringData& ns) const = 0; - - virtual void assertWriteLocked(const StringData& ns) const = 0; + virtual bool isReadLocked() const = 0; /** * Pending means we are currently trying to get a lock (could be the parallel batch writer diff --git a/src/mongo/db/instance.cpp b/src/mongo/db/instance.cpp index 8ba0cfbe52e..51464fa184d 100644 --- a/src/mongo/db/instance.cpp +++ b/src/mongo/db/instance.cpp @@ -490,7 +490,7 @@ namespace { if ( currentOp.shouldDBProfile( debug.executionTime ) ) { // performance profiling is on - if (txn->lockState()->hasAnyReadLock()) { + if (txn->lockState()->isReadLocked()) { MONGO_LOG_COMPONENT(1, logComponentForOp(op)) << "note: not profiling because recursive read lock" << endl; } diff --git a/src/mongo/db/storage/mmap_v1/catalog/namespace_details.cpp b/src/mongo/db/storage/mmap_v1/catalog/namespace_details.cpp index 5df604dca16..825178ea8c4 100644 --- a/src/mongo/db/storage/mmap_v1/catalog/namespace_details.cpp +++ b/src/mongo/db/storage/mmap_v1/catalog/namespace_details.cpp @@ -53,9 +53,6 @@ namespace mongo { - - BSONObj idKeyPattern = fromjson("{\"_id\":1}"); - NamespaceDetails::NamespaceDetails( const DiskLoc &loc, bool capped ) { BOOST_STATIC_ASSERT( sizeof(NamespaceDetails::Extra) <= sizeof(NamespaceDetails) ); @@ -91,7 +88,10 @@ namespace mongo { const StringData& ns, NamespaceIndex& ni, int nindexessofar) { - txn->lockState()->assertWriteLocked(ns); + + // Namespace details must always be changed under an exclusive DB lock + const NamespaceString nss(ns); + invariant(txn->lockState()->isDbLockedForMode(nss.db(), MODE_X)); int i = (nindexessofar - NIndexesBase) / NIndexesExtra; verify( i >= 0 && i <= 1 ); diff --git a/src/mongo/db/storage/mmap_v1/catalog/namespace_index.cpp b/src/mongo/db/storage/mmap_v1/catalog/namespace_index.cpp index 02c7c04122a..eec7b86e3b8 100644 --- a/src/mongo/db/storage/mmap_v1/catalog/namespace_index.cpp +++ b/src/mongo/db/storage/mmap_v1/catalog/namespace_index.cpp @@ -63,25 +63,33 @@ namespace mongo { } void NamespaceIndex::add_ns( OperationContext* txn, - const StringData& ns, const NamespaceDetails* details ) { + const StringData& ns, + const NamespaceDetails* details ) { Namespace n(ns); add_ns( txn, n, details ); } void NamespaceIndex::add_ns( OperationContext* txn, - const Namespace& ns, const NamespaceDetails* details ) { - string nsString = ns.toString(); - txn->lockState()->assertWriteLocked( nsString ); - massert( 17315, "no . in ns", nsString.find( '.' ) != string::npos ); + const Namespace& ns, + const NamespaceDetails* details ) { + const NamespaceString nss(ns.toString()); + invariant(txn->lockState()->isDbLockedForMode(nss.db(), MODE_X)); + + massert(17315, "no . in ns", nsIsFull(nss.toString())); + init( txn ); uassert( 10081, "too many namespaces/collections", _ht->put(txn, ns, *details)); } void NamespaceIndex::kill_ns( OperationContext* txn, const StringData& ns) { - txn->lockState()->assertWriteLocked(ns); - if ( !_ht.get() ) + const NamespaceString nss(ns.toString()); + invariant(txn->lockState()->isDbLockedForMode(nss.db(), MODE_X)); + + if (!_ht.get()) { return; - Namespace n(ns); + } + + const Namespace n(ns); _ht->kill(txn, n); if (ns.size() <= Namespace::MaxNsColletionLen) { diff --git a/src/mongo/db/storage/mmap_v1/mmap_v1_database_catalog_entry.cpp b/src/mongo/db/storage/mmap_v1/mmap_v1_database_catalog_entry.cpp index 405aafa6994..0fe029516f5 100644 --- a/src/mongo/db/storage/mmap_v1/mmap_v1_database_catalog_entry.cpp +++ b/src/mongo/db/storage/mmap_v1/mmap_v1_database_catalog_entry.cpp @@ -227,7 +227,7 @@ namespace mongo { } Status MMAPV1DatabaseCatalogEntry::dropCollection(OperationContext* txn, const StringData& ns) { - invariant(txn->lockState()->isWriteLocked(ns)); + invariant(txn->lockState()->isCollectionLockedForMode(ns, MODE_X)); _removeFromCache(txn->recoveryUnit(), ns); NamespaceDetails* details = _namespaceIndex.details( ns ); diff --git a/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp b/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp index e14a5f7b4c8..a579723a964 100644 --- a/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp +++ b/src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp @@ -190,7 +190,9 @@ namespace mongo { int sizeNeeded, bool preallocateNextFile) { - invariant(txn->lockState()->isWriteLocked(_dbname)); + // Database must be stable and we need to be in some sort of an update operation in order + // to add a new file. + invariant(txn->lockState()->isDbLockedForMode(_dbname, MODE_IX)); const int allocFileId = _files.size(); diff --git a/src/mongo/dbtests/documentsourcetests.cpp b/src/mongo/dbtests/documentsourcetests.cpp index 4e5a44742a9..67476ff42b2 100644 --- a/src/mongo/dbtests/documentsourcetests.cpp +++ b/src/mongo/dbtests/documentsourcetests.cpp @@ -205,11 +205,11 @@ namespace DocumentSourceTests { void run() { createSource(); // The DocumentSourceCursor doesn't hold a read lock. - ASSERT( !_opCtx.lockState()->hasAnyReadLock() ); + ASSERT( !_opCtx.lockState()->isReadLocked() ); // The collection is empty, so the source produces no results. ASSERT( !source()->getNext() ); // Exhausting the source releases the read lock. - ASSERT( !_opCtx.lockState()->hasAnyReadLock() ); + ASSERT( !_opCtx.lockState()->isReadLocked() ); } }; @@ -220,7 +220,7 @@ namespace DocumentSourceTests { client.insert( ns, BSON( "a" << 1 ) ); createSource(); // The DocumentSourceCursor doesn't hold a read lock. - ASSERT( !_opCtx.lockState()->hasAnyReadLock() ); + ASSERT( !_opCtx.lockState()->isReadLocked() ); // The cursor will produce the expected result. boost::optional<Document> next = source()->getNext(); ASSERT(bool(next)); @@ -228,7 +228,7 @@ namespace DocumentSourceTests { // There are no more results. ASSERT( !source()->getNext() ); // Exhausting the source releases the read lock. - ASSERT( !_opCtx.lockState()->hasAnyReadLock() ); + ASSERT( !_opCtx.lockState()->isReadLocked() ); } }; @@ -238,10 +238,10 @@ namespace DocumentSourceTests { void run() { createSource(); // The DocumentSourceCursor doesn't hold a read lock. - ASSERT( !_opCtx.lockState()->hasAnyReadLock() ); + ASSERT( !_opCtx.lockState()->isReadLocked() ); source()->dispose(); // Releasing the cursor releases the read lock. - ASSERT( !_opCtx.lockState()->hasAnyReadLock() ); + ASSERT( !_opCtx.lockState()->isReadLocked() ); // The source is marked as exhausted. ASSERT( !source()->getNext() ); } @@ -264,10 +264,10 @@ namespace DocumentSourceTests { ASSERT(bool(next)); ASSERT_EQUALS(Value(2), next->getField("a")); // The DocumentSourceCursor doesn't hold a read lock. - ASSERT( !_opCtx.lockState()->hasAnyReadLock() ); + ASSERT( !_opCtx.lockState()->isReadLocked() ); source()->dispose(); // Disposing of the source releases the lock. - ASSERT( !_opCtx.lockState()->hasAnyReadLock() ); + ASSERT( !_opCtx.lockState()->isReadLocked() ); // The source cannot be advanced further. ASSERT( !source()->getNext() ); } @@ -356,7 +356,7 @@ namespace DocumentSourceTests { client.insert( ns, BSON( "a" << 2 ) ); createSource(); // The DocumentSourceCursor doesn't hold a read lock. - ASSERT( !_opCtx.lockState()->hasAnyReadLock() ); + ASSERT( !_opCtx.lockState()->isReadLocked() ); createLimit( 1 ); limit()->setSource( source() ); // The limit's result is as expected. @@ -366,7 +366,7 @@ namespace DocumentSourceTests { // The limit is exhausted. ASSERT( !limit()->getNext() ); // The limit disposes the source, releasing the read lock. - ASSERT( !_opCtx.lockState()->hasAnyReadLock() ); + ASSERT( !_opCtx.lockState()->isReadLocked() ); } }; @@ -395,7 +395,7 @@ namespace DocumentSourceTests { ASSERT( !limit()->getNext() ); // The limit disposes the match, which disposes the source and releases the read // lock. - ASSERT( !_opCtx.lockState()->hasAnyReadLock() ); + ASSERT( !_opCtx.lockState()->isReadLocked() ); } }; diff --git a/src/mongo/dbtests/rollbacktests.cpp b/src/mongo/dbtests/rollbacktests.cpp index 9f124d9a647..11771128e84 100644 --- a/src/mongo/dbtests/rollbacktests.cpp +++ b/src/mongo/dbtests/rollbacktests.cpp @@ -477,11 +477,9 @@ namespace { createCollection( &txn, nss ); ScopedTransaction transaction(&txn, MODE_IX); - Lock::DBLock dbIXLock( txn.lockState(), nss.db(), MODE_IX ); - Lock::CollectionLock collXLock( txn.lockState(), ns, MODE_X ); + AutoGetDb autoDb(&txn, nss.db(), MODE_X); - Client::Context ctx( &txn, ns ); - Collection* coll = ctx.db()->getCollection( &txn, ns ); + Collection* coll = autoDb.getDb()->getCollection( &txn, ns ); IndexCatalog* catalog = coll->getIndexCatalog(); string idxName = "a"; @@ -520,11 +518,9 @@ namespace { createCollection( &txn, nss ); ScopedTransaction transaction(&txn, MODE_IX); - Lock::DBLock dbIXLock( txn.lockState(), nss.db(), MODE_IX ); - Lock::CollectionLock collXLock( txn.lockState(), ns, MODE_X ); + AutoGetDb autoDb(&txn, nss.db(), MODE_X); - Client::Context ctx( &txn, ns ); - Collection* coll = ctx.db()->getCollection( &txn, ns ); + Collection* coll = autoDb.getDb()->getCollection(&txn, ns); IndexCatalog* catalog = coll->getIndexCatalog(); string idxName = "a"; @@ -575,11 +571,9 @@ namespace { createCollection( &txn, nss ); ScopedTransaction transaction(&txn, MODE_IX); - Lock::DBLock dbIXLock( txn.lockState(), nss.db(), MODE_IX ); - Lock::CollectionLock collXLock( txn.lockState(), ns, MODE_X ); + AutoGetDb autoDb(&txn, nss.db(), MODE_X); - Client::Context ctx( &txn, ns ); - Collection* coll = ctx.db()->getCollection( &txn, ns ); + Collection* coll = autoDb.getDb()->getCollection(&txn, ns); IndexCatalog* catalog = coll->getIndexCatalog(); string idxName = "a"; @@ -620,11 +614,9 @@ namespace { createCollection( &txn, nss ); ScopedTransaction transaction(&txn, MODE_IX); - Lock::DBLock dbIXLock( txn.lockState(), nss.db(), MODE_IX ); - Lock::CollectionLock collXLock( txn.lockState(), ns, MODE_X ); + AutoGetDb autoDb(&txn, nss.db(), MODE_X); - Client::Context ctx( &txn, ns ); - Collection* coll = ctx.db()->getCollection( &txn, ns ); + Collection* coll = autoDb.getDb()->getCollection(&txn, ns); IndexCatalog* catalog = coll->getIndexCatalog(); string idxName = "a"; @@ -682,9 +674,11 @@ namespace { OperationContextImpl txn; NamespaceString nss( ns ); dropDatabase( &txn, nss ); + ScopedTransaction transaction(&txn, MODE_IX); Lock::DBLock dbXLock( txn.lockState(), nss.db(), MODE_X ); Client::Context ctx( &txn, nss.ns() ); + string idxNameA = "indexA"; string idxNameB = "indexB"; string idxNameC = "indexC"; diff --git a/src/mongo/dbtests/threadedtests.cpp b/src/mongo/dbtests/threadedtests.cpp index fe6e3945e53..2a708b4bfe9 100644 --- a/src/mongo/dbtests/threadedtests.cpp +++ b/src/mongo/dbtests/threadedtests.cpp @@ -125,7 +125,7 @@ namespace ThreadedTests { } else if( i % 7 == 1 ) { Lock::GlobalRead r(txn.lockState()); - ASSERT(txn.lockState()->hasAnyReadLock()); + ASSERT(txn.lockState()->isReadLocked()); } else if( i % 7 == 4 && tnumber == 1 /*only one upgrader legal*/ ) { diff --git a/src/mongo/s/d_state.cpp b/src/mongo/s/d_state.cpp index 4addb2b72e1..e45afddb60e 100644 --- a/src/mongo/s/d_state.cpp +++ b/src/mongo/s/d_state.cpp @@ -198,7 +198,7 @@ namespace mongo { const BSONObj& max, ChunkVersion version) { - txn->lockState()->assertWriteLocked( ns ); + invariant(txn->lockState()->isCollectionLockedForMode(ns, MODE_X)); scoped_lock lk( _mutex ); CollectionMetadataMap::const_iterator it = _collMetadata.find( ns ); @@ -227,8 +227,8 @@ namespace mongo { void ShardingState::undoDonateChunk(OperationContext* txn, const string& ns, CollectionMetadataPtr prevMetadata) { - - txn->lockState()->assertWriteLocked( ns ); + + invariant(txn->lockState()->isCollectionLockedForMode(ns, MODE_X)); scoped_lock lk( _mutex ); log() << "ShardingState::undoDonateChunk acquired _mutex" << endl; @@ -245,7 +245,7 @@ namespace mongo { const OID& epoch, string* errMsg ) { - txn->lockState()->assertWriteLocked( ns ); + invariant(txn->lockState()->isCollectionLockedForMode(ns, MODE_X)); scoped_lock lk( _mutex ); CollectionMetadataMap::const_iterator it = _collMetadata.find( ns ); @@ -290,7 +290,7 @@ namespace mongo { const OID& epoch, string* errMsg ) { - txn->lockState()->assertWriteLocked( ns ); + invariant(txn->lockState()->isCollectionLockedForMode(ns, MODE_X)); scoped_lock lk( _mutex ); CollectionMetadataMap::const_iterator it = _collMetadata.find( ns ); @@ -335,7 +335,7 @@ namespace mongo { const vector<BSONObj>& splitKeys, ChunkVersion version ) { - txn->lockState()->assertWriteLocked( ns ); + invariant(txn->lockState()->isCollectionLockedForMode(ns, MODE_X)); scoped_lock lk( _mutex ); CollectionMetadataMap::const_iterator it = _collMetadata.find( ns ); @@ -359,7 +359,7 @@ namespace mongo { const BSONObj& maxKey, ChunkVersion mergedVersion ) { - txn->lockState()->assertWriteLocked( ns ); + invariant(txn->lockState()->isCollectionLockedForMode(ns, MODE_X)); scoped_lock lk( _mutex ); CollectionMetadataMap::const_iterator it = _collMetadata.find( ns ); |