summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
authorGregory Noma <gregory.noma@gmail.com>2019-06-18 09:35:05 -0400
committerGregory Noma <gregory.noma@gmail.com>2019-06-18 12:57:55 -0400
commit4e7baa088cd86b378386bb78ee49298011d67b32 (patch)
treee419fae4faa3743ae79f639b58d2a4f777419e67 /src/mongo/db
parent99e7f57e7e5eb63f22e2b582a10e78c197b835e6 (diff)
downloadmongo-4e7baa088cd86b378386bb78ee49298011d67b32.tar.gz
SERVER-40681 Make AutoGetCollection interface match AutoGetDB
Diffstat (limited to 'src/mongo/db')
-rw-r--r--src/mongo/db/catalog/drop_indexes.cpp2
-rw-r--r--src/mongo/db/catalog_raii.cpp3
-rw-r--r--src/mongo/db/catalog_raii.h19
-rw-r--r--src/mongo/db/catalog_raii_test.cpp12
-rw-r--r--src/mongo/db/commands/test_commands.cpp2
-rw-r--r--src/mongo/db/index_builds_coordinator.cpp2
-rw-r--r--src/mongo/db/ops/write_ops_exec.cpp5
-rw-r--r--src/mongo/db/s/collection_sharding_runtime.cpp4
-rw-r--r--src/mongo/db/s/migration_destination_manager.cpp4
-rw-r--r--src/mongo/db/s/migration_source_manager.cpp8
-rw-r--r--src/mongo/db/s/shard_filtering_metadata_refresh.cpp4
11 files changed, 30 insertions, 35 deletions
diff --git a/src/mongo/db/catalog/drop_indexes.cpp b/src/mongo/db/catalog/drop_indexes.cpp
index ef6074eaaff..b74a55f00cf 100644
--- a/src/mongo/db/catalog/drop_indexes.cpp
+++ b/src/mongo/db/catalog/drop_indexes.cpp
@@ -200,7 +200,7 @@ Status dropIndexes(OperationContext* opCtx,
const BSONObj& cmdObj,
BSONObjBuilder* result) {
return writeConflictRetry(opCtx, "dropIndexes", nss.db(), [opCtx, &nss, &cmdObj, result] {
- AutoGetCollection autoColl(opCtx, nss, MODE_IX, MODE_X);
+ AutoGetCollection autoColl(opCtx, nss, MODE_X);
bool userInitiatedWritesAndNotPrimary = opCtx->writesAreReplicated() &&
!repl::ReplicationCoordinator::get(opCtx)->canAcceptWritesFor(opCtx, nss);
diff --git a/src/mongo/db/catalog_raii.cpp b/src/mongo/db/catalog_raii.cpp
index d3e4c1f5e60..efd30fb762d 100644
--- a/src/mongo/db/catalog_raii.cpp
+++ b/src/mongo/db/catalog_raii.cpp
@@ -58,13 +58,12 @@ AutoGetDb::AutoGetDb(OperationContext* opCtx, StringData dbName, LockMode mode,
AutoGetCollection::AutoGetCollection(OperationContext* opCtx,
const NamespaceStringOrUUID& nsOrUUID,
- LockMode modeDB,
LockMode modeColl,
ViewMode viewMode,
Date_t deadline)
: _autoDb(opCtx,
!nsOrUUID.dbname().empty() ? nsOrUUID.dbname() : nsOrUUID.nss()->db(),
- modeDB,
+ isSharedLockMode(modeColl) ? MODE_IS : MODE_IX,
deadline),
_resolvedNss(resolveNamespaceStringOrUUID(opCtx, nsOrUUID)) {
diff --git a/src/mongo/db/catalog_raii.h b/src/mongo/db/catalog_raii.h
index 8522f33c92b..36043e60564 100644
--- a/src/mongo/db/catalog_raii.h
+++ b/src/mongo/db/catalog_raii.h
@@ -73,8 +73,15 @@ private:
};
/**
- * RAII-style class, which acquires a locks on the specified database and collection in the
- * requested modes and obtains references to both.
+ * RAII-style class, which acquires global, database, and collection locks according to the chart
+ * below.
+ *
+ * | modeColl | Global Lock Result | DB Lock Result | Collection Lock Result |
+ * |----------+--------------------+----------------+------------------------|
+ * | MODE_IX | MODE_IX | MODE_IX | MODE_IX |
+ * | MODE_X | MODE_IX | MODE_IX | MODE_X |
+ * | MODE_IS | MODE_IS | MODE_IS | MODE_IS |
+ * | MODE_S | MODE_IS | MODE_IS | MODE_S |
*
* NOTE: Throws NamespaceNotFound if the collection UUID cannot be resolved to a name.
*
@@ -90,14 +97,6 @@ public:
AutoGetCollection(OperationContext* opCtx,
const NamespaceStringOrUUID& nsOrUUID,
- LockMode modeAll,
- ViewMode viewMode = kViewsForbidden,
- Date_t deadline = Date_t::max())
- : AutoGetCollection(opCtx, nsOrUUID, modeAll, modeAll, viewMode, deadline) {}
-
- AutoGetCollection(OperationContext* opCtx,
- const NamespaceStringOrUUID& nsOrUUID,
- LockMode modeDB,
LockMode modeColl,
ViewMode viewMode = kViewsForbidden,
Date_t deadline = Date_t::max());
diff --git a/src/mongo/db/catalog_raii_test.cpp b/src/mongo/db/catalog_raii_test.cpp
index ac0e64f80ed..b01e508db03 100644
--- a/src/mongo/db/catalog_raii_test.cpp
+++ b/src/mongo/db/catalog_raii_test.cpp
@@ -139,7 +139,6 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionCollLockDeadline) {
[&] {
AutoGetCollection coll(client2.second.get(),
nss,
- MODE_IX,
MODE_X,
AutoGetCollection::ViewMode::kViewsForbidden,
Date_t::now() + timeoutMs);
@@ -155,7 +154,6 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionDBLockDeadline) {
AutoGetCollection coll(client2.second.get(),
nss,
MODE_X,
- MODE_X,
AutoGetCollection::ViewMode::kViewsForbidden,
Date_t::now() + timeoutMs);
},
@@ -171,7 +169,6 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionGlobalLockDeadline) {
AutoGetCollection coll(client2.second.get(),
nss,
MODE_X,
- MODE_X,
AutoGetCollection::ViewMode::kViewsForbidden,
Date_t::now() + timeoutMs);
},
@@ -188,7 +185,6 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionDeadlineNow) {
[&] {
AutoGetCollection coll(client2.second.get(),
nss,
- MODE_IX,
MODE_X,
AutoGetCollection::ViewMode::kViewsForbidden,
Date_t::now());
@@ -206,7 +202,6 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionDeadlineMin) {
[&] {
AutoGetCollection coll(client2.second.get(),
nss,
- MODE_IX,
MODE_X,
AutoGetCollection::ViewMode::kViewsForbidden,
Date_t());
@@ -214,6 +209,13 @@ TEST_F(CatalogRAIITestFixture, AutoGetCollectionDeadlineMin) {
Milliseconds(0));
}
+TEST_F(CatalogRAIITestFixture, AutoGetCollectionDBLockCompatibleX) {
+ Lock::DBLock dbLock1(client1.second.get(), nss.db(), MODE_IX);
+ ASSERT(client1.second->lockState()->isDbLockedForMode(nss.db(), MODE_IX));
+
+ AutoGetCollection coll(client2.second.get(), nss, MODE_X);
+}
+
using ReadSource = RecoveryUnit::ReadSource;
class RecoveryUnitMock : public RecoveryUnitNoop {
diff --git a/src/mongo/db/commands/test_commands.cpp b/src/mongo/db/commands/test_commands.cpp
index 1410bb5a3bc..51373ac0841 100644
--- a/src/mongo/db/commands/test_commands.cpp
+++ b/src/mongo/db/commands/test_commands.cpp
@@ -141,7 +141,7 @@ public:
}
// Lock the database in mode IX and lock the collection exclusively.
- AutoGetCollection autoColl(opCtx, fullNs, MODE_IX, MODE_X);
+ AutoGetCollection autoColl(opCtx, fullNs, MODE_X);
Collection* collection = autoColl.getCollection();
if (!collection) {
uasserted(ErrorCodes::NamespaceNotFound,
diff --git a/src/mongo/db/index_builds_coordinator.cpp b/src/mongo/db/index_builds_coordinator.cpp
index 6991f274277..70b087f4dde 100644
--- a/src/mongo/db/index_builds_coordinator.cpp
+++ b/src/mongo/db/index_builds_coordinator.cpp
@@ -557,7 +557,7 @@ IndexBuildsCoordinator::_registerAndSetUpIndexBuild(
<< "' because the collection no longer exists.");
}
- AutoGetCollection autoColl(opCtx, *nss, /*modeDB=*/MODE_IX, /*modeColl=*/MODE_X);
+ AutoGetCollection autoColl(opCtx, *nss, MODE_X);
if (!autoColl.getDb()) {
return Status(ErrorCodes::NamespaceNotFound,
str::stream() << "Failed to create index(es) on collection '" << *nss
diff --git a/src/mongo/db/ops/write_ops_exec.cpp b/src/mongo/db/ops/write_ops_exec.cpp
index 0e4f2dc212b..3bc99ed80d4 100644
--- a/src/mongo/db/ops/write_ops_exec.cpp
+++ b/src/mongo/db/ops/write_ops_exec.cpp
@@ -612,7 +612,7 @@ static SingleWriteResult performSingleUpdateOp(OperationContext* opCtx,
boost::optional<AutoGetCollection> collection;
while (true) {
- collection.emplace(opCtx, ns, MODE_IX, fixLockModeForSystemDotViewsChanges(ns, MODE_IX));
+ collection.emplace(opCtx, ns, fixLockModeForSystemDotViewsChanges(ns, MODE_IX));
// If this is an upsert, which is an insert, we must have a collection.
// An update on a non-existant collection is okay and handled later.
@@ -867,8 +867,7 @@ static SingleWriteResult performSingleDeleteOp(OperationContext* opCtx,
uasserted(ErrorCodes::InternalError, "failAllRemoves failpoint active!");
}
- AutoGetCollection collection(
- opCtx, ns, MODE_IX, fixLockModeForSystemDotViewsChanges(ns, MODE_IX));
+ AutoGetCollection collection(opCtx, ns, fixLockModeForSystemDotViewsChanges(ns, MODE_IX));
if (collection.getDb()) {
curOp.raiseDbProfileLevel(collection.getDb()->getProfilingLevel());
diff --git a/src/mongo/db/s/collection_sharding_runtime.cpp b/src/mongo/db/s/collection_sharding_runtime.cpp
index 05fbb152475..9c2c1386978 100644
--- a/src/mongo/db/s/collection_sharding_runtime.cpp
+++ b/src/mongo/db/s/collection_sharding_runtime.cpp
@@ -182,7 +182,6 @@ CollectionCriticalSection::CollectionCriticalSection(OperationContext* opCtx, Na
: _nss(std::move(ns)), _opCtx(opCtx) {
AutoGetCollection autoColl(_opCtx,
_nss,
- MODE_IX,
MODE_X,
AutoGetCollection::ViewMode::kViewsForbidden,
opCtx->getServiceContext()->getPreciseClockSource()->now() +
@@ -195,7 +194,7 @@ CollectionCriticalSection::CollectionCriticalSection(OperationContext* opCtx, Na
CollectionCriticalSection::~CollectionCriticalSection() {
UninterruptibleLockGuard noInterrupt(_opCtx->lockState());
- AutoGetCollection autoColl(_opCtx, _nss, MODE_IX, MODE_IX);
+ AutoGetCollection autoColl(_opCtx, _nss, MODE_IX);
auto* const csr = CollectionShardingRuntime::get(_opCtx, _nss);
auto csrLock = CollectionShardingRuntime::CSRLock::lockExclusive(_opCtx, csr);
@@ -205,7 +204,6 @@ CollectionCriticalSection::~CollectionCriticalSection() {
void CollectionCriticalSection::enterCommitPhase() {
AutoGetCollection autoColl(_opCtx,
_nss,
- MODE_IX,
MODE_X,
AutoGetCollection::ViewMode::kViewsForbidden,
_opCtx->getServiceContext()->getPreciseClockSource()->now() +
diff --git a/src/mongo/db/s/migration_destination_manager.cpp b/src/mongo/db/s/migration_destination_manager.cpp
index 7df4fdeef0b..ce8fb419f08 100644
--- a/src/mongo/db/s/migration_destination_manager.cpp
+++ b/src/mongo/db/s/migration_destination_manager.cpp
@@ -1145,7 +1145,7 @@ bool MigrationDestinationManager::_flushPendingWrites(OperationContext* opCtx,
CollectionShardingRuntime::CleanupNotification MigrationDestinationManager::_notePending(
OperationContext* opCtx, ChunkRange const& range) {
- AutoGetCollection autoColl(opCtx, _nss, MODE_IX, MODE_X);
+ AutoGetCollection autoColl(opCtx, _nss, MODE_X);
auto* const css = CollectionShardingRuntime::get(opCtx, _nss);
const auto optMetadata = css->getCurrentMetadataIfKnown();
@@ -1176,7 +1176,7 @@ void MigrationDestinationManager::_forgetPending(OperationContext* opCtx, ChunkR
}
UninterruptibleLockGuard noInterrupt(opCtx->lockState());
- AutoGetCollection autoColl(opCtx, _nss, MODE_IX, MODE_IX);
+ AutoGetCollection autoColl(opCtx, _nss, MODE_IX);
auto* const css = CollectionShardingRuntime::get(opCtx, _nss);
const auto optMetadata = css->getCurrentMetadataIfKnown();
diff --git a/src/mongo/db/s/migration_source_manager.cpp b/src/mongo/db/s/migration_source_manager.cpp
index 8935b676e45..221ade92b96 100644
--- a/src/mongo/db/s/migration_source_manager.cpp
+++ b/src/mongo/db/s/migration_source_manager.cpp
@@ -255,14 +255,12 @@ Status MigrationSourceManager::startClone(OperationContext* opCtx) {
autoColl.emplace(opCtx,
getNss(),
MODE_IX,
- MODE_IX,
AutoGetCollection::ViewMode::kViewsForbidden,
opCtx->getServiceContext()->getPreciseClockSource()->now() +
Milliseconds(migrationLockAcquisitionMaxWaitMS.load()));
} else {
autoColl.emplace(opCtx,
getNss(),
- MODE_IX,
MODE_X,
AutoGetCollection::ViewMode::kViewsForbidden,
opCtx->getServiceContext()->getPreciseClockSource()->now() +
@@ -474,7 +472,7 @@ Status MigrationSourceManager::commitChunkMetadataOnConfig(OperationContext* opC
// this node can accept writes for this collection as a proxy for it being primary.
if (!status.isOK()) {
UninterruptibleLockGuard noInterrupt(opCtx->lockState());
- AutoGetCollection autoColl(opCtx, getNss(), MODE_IX, MODE_IX);
+ AutoGetCollection autoColl(opCtx, getNss(), MODE_IX);
if (!repl::ReplicationCoordinator::get(opCtx)->canAcceptWritesFor(opCtx, getNss())) {
CollectionShardingRuntime::get(opCtx, getNss())->clearFilteringMetadata();
uassertStatusOK(status.withContext(
@@ -510,7 +508,7 @@ Status MigrationSourceManager::commitChunkMetadataOnConfig(OperationContext* opC
if (!refreshStatus.isOK()) {
UninterruptibleLockGuard noInterrupt(opCtx->lockState());
- AutoGetCollection autoColl(opCtx, getNss(), MODE_IX, MODE_IX);
+ AutoGetCollection autoColl(opCtx, getNss(), MODE_IX);
CollectionShardingRuntime::get(opCtx, getNss())->clearFilteringMetadata();
@@ -709,7 +707,7 @@ void MigrationSourceManager::_cleanup(OperationContext* opCtx) {
auto cloneDriver = [&]() {
// Unregister from the collection's sharding state and exit the migration critical section.
UninterruptibleLockGuard noInterrupt(opCtx->lockState());
- AutoGetCollection autoColl(opCtx, getNss(), MODE_IX, MODE_IX);
+ AutoGetCollection autoColl(opCtx, getNss(), MODE_IX);
auto* const csr = CollectionShardingRuntime::get(opCtx, getNss());
auto csrLock = CollectionShardingState::CSRLock::lockExclusive(opCtx, csr);
diff --git a/src/mongo/db/s/shard_filtering_metadata_refresh.cpp b/src/mongo/db/s/shard_filtering_metadata_refresh.cpp
index 26bfe4e897e..e8de649a76e 100644
--- a/src/mongo/db/s/shard_filtering_metadata_refresh.cpp
+++ b/src/mongo/db/s/shard_filtering_metadata_refresh.cpp
@@ -154,7 +154,7 @@ ChunkVersion forceShardFilteringMetadataRefresh(OperationContext* opCtx,
// No chunk manager, so unsharded.
// Exclusive collection lock needed since we're now changing the metadata
- AutoGetCollection autoColl(opCtx, nss, MODE_IX, MODE_X);
+ AutoGetCollection autoColl(opCtx, nss, MODE_X);
CollectionShardingRuntime::get(opCtx, nss)
->setFilteringMetadata(opCtx, CollectionMetadata());
@@ -181,7 +181,7 @@ ChunkVersion forceShardFilteringMetadataRefresh(OperationContext* opCtx,
}
// Exclusive collection lock needed since we're now changing the metadata
- AutoGetCollection autoColl(opCtx, nss, MODE_IX, MODE_X);
+ AutoGetCollection autoColl(opCtx, nss, MODE_X);
auto* const css = CollectionShardingRuntime::get(opCtx, nss);
{