summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2021-07-19 17:54:33 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-10-11 12:51:31 +0000
commit46aee5d6e90af75dacc46c3367cfb90a92260ffe (patch)
tree673e8b808f483662548828bd334418aafa1154a4
parent4aee6e6977d61ceebfdc9f8144e2840d0fab4e40 (diff)
downloadmongo-46aee5d6e90af75dacc46c3367cfb90a92260ffe.tar.gz
SERVER-58385 StorageInterface::setIndexIsMultikey() accepts collection UUID
(cherry picked from commit faaca3440968820be133979d503bbe048eb69e4b)
-rw-r--r--src/mongo/db/repl/oplog_applier_impl.cpp1
-rw-r--r--src/mongo/db/repl/storage_interface.h1
-rw-r--r--src/mongo/db/repl/storage_interface_impl.cpp18
-rw-r--r--src/mongo/db/repl/storage_interface_impl.h1
-rw-r--r--src/mongo/db/repl/storage_interface_impl_test.cpp32
-rw-r--r--src/mongo/db/repl/storage_interface_mock.h1
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,