summaryrefslogtreecommitdiff
path: root/src/mongo/db/catalog/capped_utils.cpp
diff options
context:
space:
mode:
authorDaniel Gottlieb <daniel.gottlieb@mongodb.com>2019-11-26 04:48:50 +0000
committerevergreen <evergreen@mongodb.com>2019-11-26 04:48:50 +0000
commitd471957fc37ef6cafe9ffeda3e231cdc871c3ce3 (patch)
tree3435c9d9420243e350da0f3dfbeecb81afbcd264 /src/mongo/db/catalog/capped_utils.cpp
parent8b0f534a706005d366e200ee56af5c76217656b2 (diff)
downloadmongo-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/capped_utils.cpp')
-rw-r--r--src/mongo/db/catalog/capped_utils.cpp10
1 files changed, 6 insertions, 4 deletions
diff --git a/src/mongo/db/catalog/capped_utils.cpp b/src/mongo/db/catalog/capped_utils.cpp
index 05692e11536..6aa842def14 100644
--- a/src/mongo/db/catalog/capped_utils.cpp
+++ b/src/mongo/db/catalog/capped_utils.cpp
@@ -72,7 +72,7 @@ Status emptyCapped(OperationContext* opCtx, const NamespaceString& collectionNam
uassert(ErrorCodes::NamespaceNotFound, "no such database", db);
Collection* collection =
- CollectionCatalog::get(opCtx).lookupCollectionByNamespace(collectionName);
+ CollectionCatalog::get(opCtx).lookupCollectionByNamespace(opCtx, collectionName);
uassert(ErrorCodes::CommandNotSupportedOnView,
str::stream() << "emptycapped not supported on view: " << collectionName.ns(),
collection || !ViewCatalog::get(db)->lookup(opCtx, collectionName.ns()));
@@ -118,7 +118,8 @@ void cloneCollectionAsCapped(OperationContext* opCtx,
NamespaceString fromNss(db->name(), shortFrom);
NamespaceString toNss(db->name(), shortTo);
- Collection* fromCollection = CollectionCatalog::get(opCtx).lookupCollectionByNamespace(fromNss);
+ Collection* fromCollection =
+ CollectionCatalog::get(opCtx).lookupCollectionByNamespace(opCtx, fromNss);
if (!fromCollection) {
uassert(ErrorCodes::CommandNotSupportedOnView,
str::stream() << "cloneCollectionAsCapped not supported for views: " << fromNss,
@@ -136,7 +137,7 @@ void cloneCollectionAsCapped(OperationContext* opCtx,
uassert(ErrorCodes::NamespaceExists,
str::stream() << "cloneCollectionAsCapped failed - destination collection " << toNss
<< " already exists. source collection: " << fromNss,
- !CollectionCatalog::get(opCtx).lookupCollectionByNamespace(toNss));
+ !CollectionCatalog::get(opCtx).lookupCollectionByNamespace(opCtx, toNss));
// create new collection
{
@@ -156,7 +157,8 @@ void cloneCollectionAsCapped(OperationContext* opCtx,
uassertStatusOK(createCollection(opCtx, toNss.db().toString(), cmd.done()));
}
- Collection* toCollection = CollectionCatalog::get(opCtx).lookupCollectionByNamespace(toNss);
+ Collection* toCollection =
+ CollectionCatalog::get(opCtx).lookupCollectionByNamespace(opCtx, toNss);
invariant(toCollection); // we created above
// how much data to ignore because it won't fit anyway