summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl
diff options
context:
space:
mode:
authorBernard Gorman <bernard.gorman@gmail.com>2020-08-29 23:48:59 +0100
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-11-20 01:54:55 +0000
commit9870937b91b88348e619580f1050965b1006e33d (patch)
tree317b8564e315f8290a01477e4190ac56ea7d9722 /src/mongo/db/repl
parent6f7f808583de3c432458d0adc2413d3a4022c126 (diff)
downloadmongo-9870937b91b88348e619580f1050965b1006e33d.tar.gz
SERVER-47812 Secondaries persist wildcard multikeypaths out of order
(cherry picked from commit bd320bc2d10cff75756a2c95986cc81ec8a5e7c7) (cherry picked from commit 48089c01bcccc193b1d8dd3c50ae5cb3e072ebed)
Diffstat (limited to 'src/mongo/db/repl')
-rw-r--r--src/mongo/db/repl/storage_interface.h1
-rw-r--r--src/mongo/db/repl/storage_interface_impl.cpp3
-rw-r--r--src/mongo/db/repl/storage_interface_impl.h1
-rw-r--r--src/mongo/db/repl/storage_interface_impl_test.cpp10
-rw-r--r--src/mongo/db/repl/storage_interface_mock.h1
-rw-r--r--src/mongo/db/repl/sync_tail.cpp8
6 files changed, 16 insertions, 8 deletions
diff --git a/src/mongo/db/repl/storage_interface.h b/src/mongo/db/repl/storage_interface.h
index ca6354a9a7a..426c6fbcb03 100644
--- a/src/mongo/db/repl/storage_interface.h
+++ b/src/mongo/db/repl/storage_interface.h
@@ -186,6 +186,7 @@ public:
virtual Status setIndexIsMultikey(OperationContext* opCtx,
const NamespaceString& nss,
const std::string& indexName,
+ const std::vector<BSONObj>& multikeyMetadataKeys,
const MultikeyPaths& paths,
Timestamp ts) = 0;
/**
diff --git a/src/mongo/db/repl/storage_interface_impl.cpp b/src/mongo/db/repl/storage_interface_impl.cpp
index 693f2199c70..e0527d461bb 100644
--- a/src/mongo/db/repl/storage_interface_impl.cpp
+++ b/src/mongo/db/repl/storage_interface_impl.cpp
@@ -522,6 +522,7 @@ Status StorageInterfaceImpl::renameCollection(OperationContext* opCtx,
Status StorageInterfaceImpl::setIndexIsMultikey(OperationContext* opCtx,
const NamespaceString& nss,
const std::string& indexName,
+ const std::vector<BSONObj>& multikeyMetadataKeys,
const MultikeyPaths& paths,
Timestamp ts) {
if (ts.isNull()) {
@@ -552,7 +553,7 @@ Status StorageInterfaceImpl::setIndexIsMultikey(OperationContext* opCtx,
str::stream() << "Could not find index " << indexName << " in "
<< nss.ns() << " to set to multikey.");
}
- collection->getIndexCatalog()->setMultikeyPaths(opCtx, idx, paths);
+ collection->getIndexCatalog()->setMultikeyPaths(opCtx, idx, multikeyMetadataKeys, paths);
wunit.commit();
return Status::OK();
});
diff --git a/src/mongo/db/repl/storage_interface_impl.h b/src/mongo/db/repl/storage_interface_impl.h
index 61eee68dea1..21827a8b0e8 100644
--- a/src/mongo/db/repl/storage_interface_impl.h
+++ b/src/mongo/db/repl/storage_interface_impl.h
@@ -96,6 +96,7 @@ public:
Status setIndexIsMultikey(OperationContext* opCtx,
const NamespaceString& nss,
const std::string& indexName,
+ const std::vector<BSONObj>& multikeyMetadataKeys,
const MultikeyPaths& paths,
Timestamp ts) override;
diff --git a/src/mongo/db/repl/storage_interface_impl_test.cpp b/src/mongo/db/repl/storage_interface_impl_test.cpp
index 8ade17d6efa..f4ef3dc1bd7 100644
--- a/src/mongo/db/repl/storage_interface_impl_test.cpp
+++ b/src/mongo/db/repl/storage_interface_impl_test.cpp
@@ -2607,7 +2607,7 @@ TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeyReturnsNamespaceNotFoundForMi
StorageInterfaceImpl storage;
auto nss = makeNamespace(_agent);
ASSERT_EQUALS(ErrorCodes::NamespaceNotFound,
- storage.setIndexIsMultikey(opCtx, nss, "foo", {}, Timestamp(3, 3)));
+ storage.setIndexIsMultikey(opCtx, nss, "foo", {}, {}, Timestamp(3, 3)));
}
TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeyReturnsNamespaceNotFoundForMissingCollection) {
@@ -2617,7 +2617,7 @@ TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeyReturnsNamespaceNotFoundForMi
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)));
+ storage.setIndexIsMultikey(opCtx, wrongColl, "foo", {}, {}, Timestamp(3, 3)));
}
TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeyReturnsIndexNotFoundForMissingIndex) {
@@ -2626,7 +2626,7 @@ TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeyReturnsIndexNotFoundForMissin
auto nss = makeNamespace(_agent);
ASSERT_OK(storage.createCollection(opCtx, nss, CollectionOptions()));
ASSERT_EQUALS(ErrorCodes::IndexNotFound,
- storage.setIndexIsMultikey(opCtx, nss, "foo", {}, Timestamp(3, 3)));
+ storage.setIndexIsMultikey(opCtx, nss, "foo", {}, {}, Timestamp(3, 3)));
}
TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeyReturnsInvalidOptionsForNullTimestamp) {
@@ -2635,7 +2635,7 @@ TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeyReturnsInvalidOptionsForNullT
auto nss = makeNamespace(_agent);
ASSERT_OK(storage.createCollection(opCtx, nss, CollectionOptions()));
ASSERT_EQUALS(ErrorCodes::InvalidOptions,
- storage.setIndexIsMultikey(opCtx, nss, "foo", {}, Timestamp()));
+ storage.setIndexIsMultikey(opCtx, nss, "foo", {}, {}, Timestamp()));
}
TEST_F(StorageInterfaceImplTest, SetIndexIsMultikeySucceeds) {
@@ -2650,7 +2650,7 @@ 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, 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 68811f01bab..6b48bfcbb15 100644
--- a/src/mongo/db/repl/storage_interface_mock.h
+++ b/src/mongo/db/repl/storage_interface_mock.h
@@ -193,6 +193,7 @@ public:
Status setIndexIsMultikey(OperationContext* opCtx,
const NamespaceString& nss,
const std::string& indexName,
+ const std::vector<BSONObj>& multikeyMetadataKeys,
const MultikeyPaths& paths,
Timestamp ts) override {
diff --git a/src/mongo/db/repl/sync_tail.cpp b/src/mongo/db/repl/sync_tail.cpp
index bdcccdfd384..1a72e087b1e 100644
--- a/src/mongo/db/repl/sync_tail.cpp
+++ b/src/mongo/db/repl/sync_tail.cpp
@@ -1438,8 +1438,12 @@ StatusWith<OpTime> SyncTail::multiApply(OperationContext* opCtx, MultiApplier::O
// the first timestamp in the batch since we do not have enough information to find out
// the timestamp of the first write that set the given multikey path.
fassert(50686,
- _storageInterface->setIndexIsMultikey(
- opCtx, info.nss, info.indexName, info.multikeyPaths, firstTimeInBatch));
+ _storageInterface->setIndexIsMultikey(opCtx,
+ info.nss,
+ info.indexName,
+ info.multikeyMetadataKeys,
+ info.multikeyPaths,
+ firstTimeInBatch));
}
}