diff options
author | Geert Bosch <geert@mongodb.com> | 2019-04-16 17:33:20 -0400 |
---|---|---|
committer | Geert Bosch <geert@mongodb.com> | 2019-04-17 15:40:11 -0400 |
commit | e0cafae280e508ef887bd08978dcbc5630c08a34 (patch) | |
tree | 225fea823d49fcbe836a0f64d3afdfd7573ebfc5 /src/mongo/db/concurrency | |
parent | bf774fb0a5e9bed81bc475585deb70812a2c9c41 (diff) | |
download | mongo-e0cafae280e508ef887bd08978dcbc5630c08a34.tar.gz |
SERVER-40688 Make CollectionLock take NamespaceString
Diffstat (limited to 'src/mongo/db/concurrency')
-rw-r--r-- | src/mongo/db/concurrency/d_concurrency.cpp | 9 | ||||
-rw-r--r-- | src/mongo/db/concurrency/d_concurrency.h | 2 | ||||
-rw-r--r-- | src/mongo/db/concurrency/d_concurrency_bm.cpp | 12 | ||||
-rw-r--r-- | src/mongo/db/concurrency/d_concurrency_test.cpp | 21 |
4 files changed, 24 insertions, 20 deletions
diff --git a/src/mongo/db/concurrency/d_concurrency.cpp b/src/mongo/db/concurrency/d_concurrency.cpp index 0debd7b7ce8..29076651b50 100644 --- a/src/mongo/db/concurrency/d_concurrency.cpp +++ b/src/mongo/db/concurrency/d_concurrency.cpp @@ -277,13 +277,12 @@ void Lock::DBLock::relockWithMode(LockMode newMode) { Lock::CollectionLock::CollectionLock(OperationContext* opCtx, - StringData ns, + const NamespaceString& nss, LockMode mode, Date_t deadline) - : _id(RESOURCE_COLLECTION, ns), _opCtx(opCtx) { - massert(28538, "need a non-empty collection name", nsIsFull(ns)); - - dassert(opCtx->lockState()->isDbLockedForMode(nsToDatabaseSubstring(ns), + : _id(RESOURCE_COLLECTION, nss.ns()), _opCtx(opCtx) { + invariant(nss.coll().size(), str::stream() << "expected non-empty collection name:" << nss); + dassert(opCtx->lockState()->isDbLockedForMode(nss.db(), isSharedLockMode(mode) ? MODE_IS : MODE_IX)); LockMode actualLockMode = mode; if (!supportsDocLocking()) { diff --git a/src/mongo/db/concurrency/d_concurrency.h b/src/mongo/db/concurrency/d_concurrency.h index 7300824373c..5e9bd6a94a2 100644 --- a/src/mongo/db/concurrency/d_concurrency.h +++ b/src/mongo/db/concurrency/d_concurrency.h @@ -357,7 +357,7 @@ public: public: CollectionLock(OperationContext* opCtx, - StringData ns, + const NamespaceString& nss, LockMode mode, Date_t deadline = Date_t::max()); CollectionLock(CollectionLock&&); diff --git a/src/mongo/db/concurrency/d_concurrency_bm.cpp b/src/mongo/db/concurrency/d_concurrency_bm.cpp index de643c34374..c375ffdd73f 100644 --- a/src/mongo/db/concurrency/d_concurrency_bm.cpp +++ b/src/mongo/db/concurrency/d_concurrency_bm.cpp @@ -100,7 +100,8 @@ BENCHMARK_DEFINE_F(DConcurrencyTest, BM_CollectionIntentSharedLock)(benchmark::S for (auto keepRunning : state) { Lock::DBLock dlk(clients[state.thread_index].second.get(), "test", MODE_IS); - Lock::CollectionLock clk(clients[state.thread_index].second.get(), "test.coll", MODE_IS); + Lock::CollectionLock clk( + clients[state.thread_index].second.get(), NamespaceString("test.coll"), MODE_IS); } if (state.thread_index == 0) { @@ -118,7 +119,8 @@ BENCHMARK_DEFINE_F(DConcurrencyTest, BM_CollectionIntentExclusiveLock)(benchmark for (auto keepRunning : state) { Lock::DBLock dlk(clients[state.thread_index].second.get(), "test", MODE_IX); - Lock::CollectionLock clk(clients[state.thread_index].second.get(), "test.coll", MODE_IX); + Lock::CollectionLock clk( + clients[state.thread_index].second.get(), NamespaceString("test.coll"), MODE_IX); } if (state.thread_index == 0) { @@ -136,7 +138,8 @@ BENCHMARK_DEFINE_F(DConcurrencyTest, BM_MMAPv1CollectionSharedLock)(benchmark::S for (auto keepRunning : state) { Lock::DBLock dlk(clients[state.thread_index].second.get(), "test", MODE_IS); - Lock::CollectionLock clk(clients[state.thread_index].second.get(), "test.coll", MODE_S); + Lock::CollectionLock clk( + clients[state.thread_index].second.get(), NamespaceString("test.coll"), MODE_S); } if (state.thread_index == 0) { @@ -154,7 +157,8 @@ BENCHMARK_DEFINE_F(DConcurrencyTest, BM_MMAPv1CollectionExclusiveLock)(benchmark for (auto keepRunning : state) { Lock::DBLock dlk(clients[state.thread_index].second.get(), "test", MODE_IX); - Lock::CollectionLock clk(clients[state.thread_index].second.get(), "test.coll", MODE_X); + Lock::CollectionLock clk( + clients[state.thread_index].second.get(), NamespaceString("test.coll"), MODE_X); } if (state.thread_index == 0) { diff --git a/src/mongo/db/concurrency/d_concurrency_test.cpp b/src/mongo/db/concurrency/d_concurrency_test.cpp index 7e2b70472bd..cbe7d62bf35 100644 --- a/src/mongo/db/concurrency/d_concurrency_test.cpp +++ b/src/mongo/db/concurrency/d_concurrency_test.cpp @@ -1176,7 +1176,7 @@ TEST_F(DConcurrencyTestFixture, IsCollectionLocked_DB_Locked_IS) { Lock::DBLock dbLock(opCtx.get(), "db1", MODE_IS); { - Lock::CollectionLock collLock(opCtx.get(), ns.ns(), MODE_IS); + Lock::CollectionLock collLock(opCtx.get(), ns, MODE_IS); ASSERT(lockState->isCollectionLockedForMode(ns, MODE_IS)); ASSERT(!lockState->isCollectionLockedForMode(ns, MODE_IX)); @@ -1188,7 +1188,7 @@ TEST_F(DConcurrencyTestFixture, IsCollectionLocked_DB_Locked_IS) { } { - Lock::CollectionLock collLock(opCtx.get(), ns.ns(), MODE_S); + Lock::CollectionLock collLock(opCtx.get(), ns, MODE_S); ASSERT(lockState->isCollectionLockedForMode(ns, MODE_IS)); ASSERT(!lockState->isCollectionLockedForMode(ns, MODE_IX)); @@ -1207,7 +1207,7 @@ TEST_F(DConcurrencyTestFixture, IsCollectionLocked_DB_Locked_IX) { Lock::DBLock dbLock(opCtx.get(), "db1", MODE_IX); { - Lock::CollectionLock collLock(opCtx.get(), ns.ns(), MODE_IX); + Lock::CollectionLock collLock(opCtx.get(), ns, MODE_IX); // TODO: This is TRUE because Lock::CollectionLock converts IX lock to X ASSERT(lockState->isCollectionLockedForMode(ns, MODE_IS)); @@ -1218,7 +1218,7 @@ TEST_F(DConcurrencyTestFixture, IsCollectionLocked_DB_Locked_IX) { } { - Lock::CollectionLock collLock(opCtx.get(), ns.ns(), MODE_X); + Lock::CollectionLock collLock(opCtx.get(), ns, MODE_X); ASSERT(lockState->isCollectionLockedForMode(ns, MODE_IS)); ASSERT(lockState->isCollectionLockedForMode(ns, MODE_IX)); @@ -1749,7 +1749,7 @@ TEST_F(DConcurrencyTestFixture, CollectionLockInInterruptedContextThrowsEvenWhen { boost::optional<Lock::CollectionLock> collLock; - ASSERT_THROWS_CODE(collLock.emplace(opCtx, "db.coll", MODE_IX), + ASSERT_THROWS_CODE(collLock.emplace(opCtx, NamespaceString("db.coll"), MODE_IX), AssertionException, ErrorCodes::Interrupted); } @@ -1761,13 +1761,13 @@ TEST_F(DConcurrencyTestFixture, auto opCtx = clients[0].second.get(); Lock::DBLock dbLock(opCtx, "db", MODE_IX); - Lock::CollectionLock collLock(opCtx, "db.coll", MODE_IX); + Lock::CollectionLock collLock(opCtx, NamespaceString("db.coll"), MODE_IX); opCtx->markKilled(); { boost::optional<Lock::CollectionLock> recursiveCollLock; - ASSERT_THROWS_CODE(recursiveCollLock.emplace(opCtx, "db.coll", MODE_X), + ASSERT_THROWS_CODE(recursiveCollLock.emplace(opCtx, NamespaceString("db.coll"), MODE_X), AssertionException, ErrorCodes::Interrupted); } @@ -1782,7 +1782,7 @@ TEST_F(DConcurrencyTestFixture, CollectionLockInInterruptedContextRespectsUninte opCtx->markKilled(); UninterruptibleLockGuard noInterrupt(opCtx->lockState()); - Lock::CollectionLock collLock(opCtx, "db.coll", MODE_IX); // Does not throw. + Lock::CollectionLock collLock(opCtx, NamespaceString("db.coll"), MODE_IX); // Does not throw. } TEST_F(DConcurrencyTestFixture, CollectionLockTimeout) { @@ -1794,14 +1794,15 @@ TEST_F(DConcurrencyTestFixture, CollectionLockTimeout) { Lock::DBLock DBL1(opctx1, "testdb"_sd, MODE_IX, Date_t::max()); ASSERT(opctx1->lockState()->isDbLockedForMode("testdb"_sd, MODE_IX)); - Lock::CollectionLock CL1(opctx1, "testdb.test"_sd, MODE_X, Date_t::max()); + Lock::CollectionLock CL1(opctx1, NamespaceString("testdb.test"), MODE_X, Date_t::max()); ASSERT(opctx1->lockState()->isCollectionLockedForMode(NamespaceString("testdb.test"), MODE_X)); Date_t t1 = Date_t::now(); Lock::DBLock DBL2(opctx2, "testdb"_sd, MODE_IX, Date_t::max()); ASSERT(opctx2->lockState()->isDbLockedForMode("testdb"_sd, MODE_IX)); ASSERT_THROWS_CODE( - Lock::CollectionLock(opctx2, "testdb.test"_sd, MODE_X, Date_t::now() + timeoutMillis), + Lock::CollectionLock( + opctx2, NamespaceString("testdb.test"), MODE_X, Date_t::now() + timeoutMillis), AssertionException, ErrorCodes::LockTimeout); Date_t t2 = Date_t::now(); |