diff options
author | Benety Goh <benety@mongodb.com> | 2021-07-19 17:54:33 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-07-19 22:18:26 +0000 |
commit | faaca3440968820be133979d503bbe048eb69e4b (patch) | |
tree | 3ece809c6dd6fc3e6d96e1a048bf2cdcb6e129b8 /src | |
parent | a16078a291010137916a3c496bc5e423fe55e0e6 (diff) | |
download | mongo-faaca3440968820be133979d503bbe048eb69e4b.tar.gz |
SERVER-58385 StorageInterface::setIndexIsMultikey() accepts collection UUID
Diffstat (limited to 'src')
-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 2781cf72635..9c8ea635089 100644 --- a/src/mongo/db/repl/oplog_applier_impl.cpp +++ b/src/mongo/db/repl/oplog_applier_impl.cpp @@ -589,6 +589,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 6ae980e490c..a4e5442c0b2 100644 --- a/src/mongo/db/repl/storage_interface.h +++ b/src/mongo/db/repl/storage_interface.h @@ -208,6 +208,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 7f99a956cbf..b19cea8c2f3 100644 --- a/src/mongo/db/repl/storage_interface_impl.cpp +++ b/src/mongo/db/repl/storage_interface_impl.cpp @@ -591,6 +591,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, @@ -598,13 +599,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(); } @@ -620,8 +627,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, collection, idx, multikeyMetadataKeys, paths); diff --git a/src/mongo/db/repl/storage_interface_impl.h b/src/mongo/db/repl/storage_interface_impl.h index fbb5c90c57a..5c935d1bbc5 100644 --- a/src/mongo/db/repl/storage_interface_impl.h +++ b/src/mongo/db/repl/storage_interface_impl.h @@ -100,6 +100,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 354bb9a75dd..d87622b17d0 100644 --- a/src/mongo/db/repl/storage_interface_impl_test.cpp +++ b/src/mongo/db/repl/storage_interface_impl_test.cpp @@ -2611,8 +2611,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) { @@ -2621,33 +2622,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" @@ -2655,7 +2662,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 8c913443f0e..0b35fe833e3 100644 --- a/src/mongo/db/repl/storage_interface_mock.h +++ b/src/mongo/db/repl/storage_interface_mock.h @@ -201,6 +201,7 @@ public: Status setIndexIsMultikey(OperationContext* opCtx, const NamespaceString& nss, + const UUID& collectionUUID, const std::string& indexName, const KeyStringSet& multikeyMetadataKeys, const MultikeyPaths& paths, |