summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaloian Manassiev <kaloian.manassiev@mongodb.com>2014-12-12 10:10:50 -0500
committerKaloian Manassiev <kaloian.manassiev@mongodb.com>2014-12-12 10:10:50 -0500
commitab7a8649faf5c21901c719bbc88840ba7382a5d0 (patch)
tree8a00cc8f917fc7751b565f8fe496ecd3e9e12f8c
parent5950976bb7c42acec51850614edcebe6ad8bb233 (diff)
downloadmongo-ab7a8649faf5c21901c719bbc88840ba7382a5d0.tar.gz
SERVER-16429 Get rid of assertWriteLocked which was doing incomplete check
-rw-r--r--src/mongo/db/catalog/database.cpp8
-rw-r--r--src/mongo/db/catalog/index_catalog.cpp15
-rw-r--r--src/mongo/db/commands/create_indexes.cpp3
-rw-r--r--src/mongo/db/commands/test_commands.cpp31
-rw-r--r--src/mongo/db/commands/write_commands/batch_executor.cpp7
-rw-r--r--src/mongo/db/concurrency/d_concurrency_test.cpp5
-rw-r--r--src/mongo/db/concurrency/lock_state.cpp35
-rw-r--r--src/mongo/db/concurrency/lock_state.h10
-rw-r--r--src/mongo/db/concurrency/locker.h5
-rw-r--r--src/mongo/db/instance.cpp2
-rw-r--r--src/mongo/db/storage/mmap_v1/catalog/namespace_details.cpp8
-rw-r--r--src/mongo/db/storage/mmap_v1/catalog/namespace_index.cpp24
-rw-r--r--src/mongo/db/storage/mmap_v1/mmap_v1_database_catalog_entry.cpp2
-rw-r--r--src/mongo/db/storage/mmap_v1/mmap_v1_extent_manager.cpp4
-rw-r--r--src/mongo/dbtests/documentsourcetests.cpp22
-rw-r--r--src/mongo/dbtests/rollbacktests.cpp26
-rw-r--r--src/mongo/dbtests/threadedtests.cpp2
-rw-r--r--src/mongo/s/d_state.cpp14
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 );