diff options
author | Daniel Gottlieb <daniel.gottlieb@mongodb.com> | 2019-11-26 04:48:50 +0000 |
---|---|---|
committer | evergreen <evergreen@mongodb.com> | 2019-11-26 04:48:50 +0000 |
commit | d471957fc37ef6cafe9ffeda3e231cdc871c3ce3 (patch) | |
tree | 3435c9d9420243e350da0f3dfbeecb81afbcd264 /src/mongo/db/catalog/catalog_control.cpp | |
parent | 8b0f534a706005d366e200ee56af5c76217656b2 (diff) | |
download | mongo-d471957fc37ef6cafe9ffeda3e231cdc871c3ce3.tar.gz |
SERVER-43859: Take MODE_IX locks for collection creation.
Two concurrent storage transactions can now create collections with the same
collection name. These transactions will conflict at commit time; the first
committer will win and register their collection into the global catalog. The
losing transactions will bubble a WriteConflictException.
Top-level callers that should fail if the collection already existed must now
check and fail with a NamespaceExists error code. Previously, those callers
could rely on lower level code returning the NamespaceExists error.
Callers that were implicitly creating a collection may retry the operation,
using the now-registered collection.
These transaction-local collections (UncommittedCollections) are returned when
doing any CollectionCatalog::lookup* call.
Diffstat (limited to 'src/mongo/db/catalog/catalog_control.cpp')
-rw-r--r-- | src/mongo/db/catalog/catalog_control.cpp | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/src/mongo/db/catalog/catalog_control.cpp b/src/mongo/db/catalog/catalog_control.cpp index bbcea9f741c..351d709b5d0 100644 --- a/src/mongo/db/catalog/catalog_control.cpp +++ b/src/mongo/db/catalog/catalog_control.cpp @@ -145,7 +145,7 @@ void openCatalog(OperationContext* opCtx, const MinVisibleTimestampMap& minVisib for (const auto& entry : nsToIndexNameObjMap) { NamespaceString collNss(entry.first); - auto collection = CollectionCatalog::get(opCtx).lookupCollectionByNamespace(collNss); + auto collection = CollectionCatalog::get(opCtx).lookupCollectionByNamespace(opCtx, collNss); invariant(collection, str::stream() << "couldn't get collection " << collNss.toString()); for (const auto& indexName : entry.second.first) { @@ -175,7 +175,8 @@ void openCatalog(OperationContext* opCtx, const MinVisibleTimestampMap& minVisib for (auto&& collNss : CollectionCatalog::get(opCtx).getAllCollectionNamesFromDb(opCtx, dbName)) { // Note that the collection name already includes the database component. - auto collection = CollectionCatalog::get(opCtx).lookupCollectionByNamespace(collNss); + auto collection = + CollectionCatalog::get(opCtx).lookupCollectionByNamespace(opCtx, collNss); invariant(collection, str::stream() << "failed to get valid collection pointer for namespace " << collNss); |