diff options
-rw-r--r-- | src/mongo/db/repl/oplog_applier_impl.cpp | 1 | ||||
-rw-r--r-- | src/mongo/db/repl/storage_interface.h | 1 | ||||
-rw-r--r-- | src/mongo/db/repl/storage_interface_impl.cpp | 18 | ||||
-rw-r--r-- | src/mongo/db/repl/storage_interface_impl.h | 1 | ||||
-rw-r--r-- | src/mongo/db/repl/storage_interface_impl_test.cpp | 32 | ||||
-rw-r--r-- | src/mongo/db/repl/storage_interface_mock.h | 1 |
6 files changed, 37 insertions, 17 deletions
diff --git a/src/mongo/db/repl/oplog_applier_impl.cpp b/src/mongo/db/repl/oplog_applier_impl.cpp index d94e3b24b0d..f3ff709844a 100644 --- a/src/mongo/db/repl/oplog_applier_impl.cpp +++ b/src/mongo/db/repl/oplog_applier_impl.cpp @@ -769,6 +769,7 @@ StatusWith<OpTime> OplogApplierImpl::_applyOplogBatch(OperationContext* opCtx, fassert(50686, _storageInterface->setIndexIsMultikey(opCtx, info.nss, + info.collectionUUID, info.indexName, info.multikeyMetadataKeys, info.multikeyPaths, diff --git a/src/mongo/db/repl/storage_interface.h b/src/mongo/db/repl/storage_interface.h index 5b6f8ec07ad..dd99ccd0152 100644 --- a/src/mongo/db/repl/storage_interface.h +++ b/src/mongo/db/repl/storage_interface.h @@ -184,6 +184,7 @@ public: */ virtual Status setIndexIsMultikey(OperationContext* opCtx, const NamespaceString& nss, + const UUID& collectionUUID, const std::string& indexName, const KeyStringSet& multikeyMetadataKeys, const MultikeyPaths& paths, diff --git a/src/mongo/db/repl/storage_interface_impl.cpp b/src/mongo/db/repl/storage_interface_impl.cpp index b11ab834531..3f53b30474f 100644 --- a/src/mongo/db/repl/storage_interface_impl.cpp +++ b/src/mongo/db/repl/storage_interface_impl.cpp @@ -561,6 +561,7 @@ Status StorageInterfaceImpl::renameCollection(OperationContext* opCtx, Status StorageInterfaceImpl::setIndexIsMultikey(OperationContext* opCtx, const NamespaceString& nss, + const UUID& collectionUUID, const std::string& indexName, const KeyStringSet& multikeyMetadataKeys, const MultikeyPaths& paths, @@ -568,13 +569,19 @@ Status StorageInterfaceImpl::setIndexIsMultikey(OperationContext* opCtx, if (ts.isNull()) { return Status(ErrorCodes::InvalidOptions, str::stream() << "Cannot set index " << indexName << " on " << nss.ns() - << " as multikey at null timestamp"); + << " (" << collectionUUID << ") as multikey at null timestamp"); } return writeConflictRetry(opCtx, "StorageInterfaceImpl::setIndexIsMultikey", nss.ns(), [&] { - AutoGetCollection autoColl(opCtx, nss, MODE_IX); + const NamespaceStringOrUUID nsOrUUID(nss); + boost::optional<AutoGetCollection> autoColl; + try { + autoColl.emplace(opCtx, nsOrUUID, MODE_IX); + } catch (ExceptionFor<ErrorCodes::NamespaceNotFound>& ex) { + return ex.toStatus(); + } auto collectionResult = getCollection( - autoColl, nss, "The collection must exist before setting an index to multikey."); + *autoColl, nsOrUUID, "The collection must exist before setting an index to multikey."); if (!collectionResult.isOK()) { return collectionResult.getStatus(); } @@ -590,8 +597,9 @@ Status StorageInterfaceImpl::setIndexIsMultikey(OperationContext* opCtx, opCtx, indexName, true /* includeUnfinishedIndexes */); if (!idx) { return Status(ErrorCodes::IndexNotFound, - str::stream() << "Could not find index " << indexName << " in " - << nss.ns() << " to set to multikey."); + str::stream() + << "Could not find index " << indexName << " in " << nss.ns() << " (" + << collectionUUID << ") to set to multikey."); } collection->getIndexCatalog()->setMultikeyPaths(opCtx, idx, multikeyMetadataKeys, paths); wunit.commit(); diff --git a/src/mongo/db/repl/storage_interface_impl.h b/src/mongo/db/repl/storage_interface_impl.h index c9d4b7749fc..b7781e5a4b5 100644 --- a/src/mongo/db/repl/storage_interface_impl.h +++ b/src/mongo/db/repl/storage_interface_impl.h @@ -94,6 +94,7 @@ public: Status setIndexIsMultikey(OperationContext* opCtx, const NamespaceString& nss, + const UUID& collectionUUID, const std::string& indexName, const KeyStringSet& multikeyMetadataKeys, const MultikeyPaths& paths, diff --git a/src/mongo/db/repl/storage_interface_impl_test.cpp b/src/mongo/db/repl/storage_interface_impl_test.cpp index 6a7ab527f0d..74df47cbdb3 100644 --- a/src/mongo/db/repl/storage_interface_impl_test.cpp +++ b/src/mongo/db/repl/storage_interface_impl_test.cpp @@ -2606,8 +2606,9 @@ TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeyReturnsNamespaceNotFoundForMi auto opCtx = getOperationContext(); StorageInterfaceImpl storage; auto nss = makeNamespace(_agent); - ASSERT_EQUALS(ErrorCodes::NamespaceNotFound, - storage.setIndexIsMultikey(opCtx, nss, "foo", {}, {}, Timestamp(3, 3))); + ASSERT_EQUALS( + ErrorCodes::NamespaceNotFound, + storage.setIndexIsMultikey(opCtx, nss, UUID::gen(), "foo", {}, {}, Timestamp(3, 3))); } TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeyReturnsNamespaceNotFoundForMissingCollection) { @@ -2616,33 +2617,39 @@ TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeyReturnsNamespaceNotFoundForMi auto nss = makeNamespace(_agent); NamespaceString wrongColl(nss.db(), "wrongColl"_sd); ASSERT_OK(storage.createCollection(opCtx, nss, CollectionOptions())); - ASSERT_EQUALS(ErrorCodes::NamespaceNotFound, - storage.setIndexIsMultikey(opCtx, wrongColl, "foo", {}, {}, Timestamp(3, 3))); + ASSERT_EQUALS( + ErrorCodes::NamespaceNotFound, + storage.setIndexIsMultikey(opCtx, wrongColl, UUID::gen(), "foo", {}, {}, Timestamp(3, 3))); } TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeyReturnsIndexNotFoundForMissingIndex) { auto opCtx = getOperationContext(); StorageInterfaceImpl storage; auto nss = makeNamespace(_agent); - ASSERT_OK(storage.createCollection(opCtx, nss, CollectionOptions())); - ASSERT_EQUALS(ErrorCodes::IndexNotFound, - storage.setIndexIsMultikey(opCtx, nss, "foo", {}, {}, Timestamp(3, 3))); + auto options = generateOptionsWithUuid(); + ASSERT_OK(storage.createCollection(opCtx, nss, options)); + ASSERT_EQUALS( + ErrorCodes::IndexNotFound, + storage.setIndexIsMultikey(opCtx, nss, *options.uuid, "foo", {}, {}, Timestamp(3, 3))); } TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeyReturnsInvalidOptionsForNullTimestamp) { auto opCtx = getOperationContext(); StorageInterfaceImpl storage; auto nss = makeNamespace(_agent); - ASSERT_OK(storage.createCollection(opCtx, nss, CollectionOptions())); - ASSERT_EQUALS(ErrorCodes::InvalidOptions, - storage.setIndexIsMultikey(opCtx, nss, "foo", {}, {}, Timestamp())); + auto options = generateOptionsWithUuid(); + ASSERT_OK(storage.createCollection(opCtx, nss, options)); + ASSERT_EQUALS( + ErrorCodes::InvalidOptions, + storage.setIndexIsMultikey(opCtx, nss, *options.uuid, "foo", {}, {}, Timestamp())); } TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeySucceeds) { auto opCtx = getOperationContext(); StorageInterfaceImpl storage; auto nss = makeNamespace(_agent); - ASSERT_OK(storage.createCollection(opCtx, nss, CollectionOptions())); + auto options = generateOptionsWithUuid(); + ASSERT_OK(storage.createCollection(opCtx, nss, options)); auto indexName = "a_b_1"; auto indexSpec = BSON("name" << indexName << "key" << BSON("a.b" << 1) << "v" @@ -2650,7 +2657,8 @@ TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeySucceeds) { ASSERT_EQUALS(_createIndexOnEmptyCollection(opCtx, nss, indexSpec), 2); MultikeyPaths paths = {{1}}; - ASSERT_OK(storage.setIndexIsMultikey(opCtx, nss, indexName, {}, paths, Timestamp(3, 3))); + ASSERT_OK(storage.setIndexIsMultikey( + opCtx, nss, *options.uuid, indexName, {}, paths, Timestamp(3, 3))); AutoGetCollectionForReadCommand autoColl(opCtx, nss); ASSERT_TRUE(autoColl.getCollection()); auto indexCatalog = autoColl.getCollection()->getIndexCatalog(); diff --git a/src/mongo/db/repl/storage_interface_mock.h b/src/mongo/db/repl/storage_interface_mock.h index 11bb6213690..c78338bf79c 100644 --- a/src/mongo/db/repl/storage_interface_mock.h +++ b/src/mongo/db/repl/storage_interface_mock.h @@ -190,6 +190,7 @@ public: Status setIndexIsMultikey(OperationContext* opCtx, const NamespaceString& nss, + const UUID& collectionUUID, const std::string& indexName, const KeyStringSet& multikeyMetadataKeys, const MultikeyPaths& paths, |