summaryrefslogtreecommitdiff
path: root/src/mongo/db/introspect.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/introspect.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/introspect.cpp')
-rw-r--r--src/mongo/db/introspect.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/src/mongo/db/introspect.cpp b/src/mongo/db/introspect.cpp
index c88e9ac3d6b..82993e676c9 100644
--- a/src/mongo/db/introspect.cpp
+++ b/src/mongo/db/introspect.cpp
@@ -176,8 +176,8 @@ void profile(OperationContext* opCtx, NetworkOp op) {
// not allowed while performing writes, so temporarily enforce prepare conflicts.
EnforcePrepareConflictsBlock enforcePrepare(opCtx);
- Collection* const coll =
- CollectionCatalog::get(opCtx).lookupCollectionByNamespace(db->getProfilingNS());
+ Collection* const coll = CollectionCatalog::get(opCtx).lookupCollectionByNamespace(
+ opCtx, db->getProfilingNS());
if (coll) {
invariant(!opCtx->shouldParticipateInFlowControl());
@@ -220,7 +220,7 @@ Status createProfileCollection(OperationContext* opCtx, Database* db) {
auto& dbProfilingNS = db->getProfilingNS();
Collection* const collection =
- CollectionCatalog::get(opCtx).lookupCollectionByNamespace(dbProfilingNS);
+ CollectionCatalog::get(opCtx).lookupCollectionByNamespace(opCtx, dbProfilingNS);
if (collection) {
if (!collection->isCapped()) {
return Status(ErrorCodes::NamespaceExists,