summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2021-06-18 05:44:26 -0400
committerBenety Goh <benety@mongodb.com>2021-06-24 19:23:22 -0400
commitff5ac33fbb9e92a50b641d4007cfd9b05c6ed225 (patch)
treeacc18b016f4d3fb6e11284dfa49581add4d04932
parent7145bb5e73547c2ddc17012b5b6ebaaab8952546 (diff)
downloadmongo-ff5ac33fbb9e92a50b641d4007cfd9b05c6ed225.tar.gz
SERVER-57775 CollectionImpl removes uncommitted multikey state if DurableCatalog::putMetaData() fails
(cherry picked from commit 91a631f40727f00140bc652d13a3058a8fbbf314)
-rw-r--r--src/mongo/db/catalog/collection_impl.cpp14
-rw-r--r--src/mongo/db/catalog/collection_test.cpp4
2 files changed, 12 insertions, 6 deletions
diff --git a/src/mongo/db/catalog/collection_impl.cpp b/src/mongo/db/catalog/collection_impl.cpp
index 5cd4440a59b..d77970f9299 100644
--- a/src/mongo/db/catalog/collection_impl.cpp
+++ b/src/mongo/db/catalog/collection_impl.cpp
@@ -1864,6 +1864,10 @@ bool CollectionImpl::setIndexIsMultikey(OperationContext* opCtx,
if (!setMultikey(*metadata))
return false;
+
+ opCtx->recoveryUnit()->onRollback(
+ [this, uncommittedMultikeys]() { uncommittedMultikeys->erase(this); });
+
DurableCatalog::get(opCtx)->putMetaData(opCtx, getCatalogId(), *metadata);
opCtx->recoveryUnit()->onCommit(
@@ -1874,8 +1878,7 @@ bool CollectionImpl::setIndexIsMultikey(OperationContext* opCtx,
setMultikey(*_metadata);
uncommittedMultikeys->erase(this);
});
- opCtx->recoveryUnit()->onRollback(
- [this, uncommittedMultikeys]() { uncommittedMultikeys->erase(this); });
+
return true;
}
@@ -1920,7 +1923,12 @@ void CollectionImpl::forceSetIndexIsMultikey(OperationContext* opCtx,
metadata = &uncommittedMultikeys->emplace(this, *_metadata).first->second;
}
forceSetMultikey(*metadata);
+
+ opCtx->recoveryUnit()->onRollback(
+ [this, uncommittedMultikeys]() { uncommittedMultikeys->erase(this); });
+
DurableCatalog::get(opCtx)->putMetaData(opCtx, getCatalogId(), *metadata);
+
opCtx->recoveryUnit()->onCommit(
[this, uncommittedMultikeys, forceSetMultikey = std::move(forceSetMultikey)](auto ts) {
// Merge in changes to this index, other indexes may have been updated since we made our
@@ -1928,8 +1936,6 @@ void CollectionImpl::forceSetIndexIsMultikey(OperationContext* opCtx,
forceSetMultikey(*_metadata);
uncommittedMultikeys->erase(this);
});
- opCtx->recoveryUnit()->onRollback(
- [this, uncommittedMultikeys]() { uncommittedMultikeys->erase(this); });
}
int CollectionImpl::getTotalIndexCount() const {
diff --git a/src/mongo/db/catalog/collection_test.cpp b/src/mongo/db/catalog/collection_test.cpp
index 8e99ae81037..cc778470713 100644
--- a/src/mongo/db/catalog/collection_test.cpp
+++ b/src/mongo/db/catalog/collection_test.cpp
@@ -279,7 +279,7 @@ TEST_F(CollectionTest, SetIndexIsMultikeyRemovesUncommittedChangesOnRollback) {
// After rolling back the above WUOW, we should succeed in retrying setIndexIsMultikey().
{
WriteUnitOfWork wuow(opCtx);
- ASSERT_FALSE(coll->setIndexIsMultikey(opCtx, indexName, paths));
+ ASSERT(coll->setIndexIsMultikey(opCtx, indexName, paths));
wuow.commit();
}
}
@@ -329,7 +329,7 @@ TEST_F(CollectionTest, ForceSetIndexIsMultikeyRemovesUncommittedChangesOnRollbac
// After rolling back the above WUOW, we should succeed in retrying setIndexIsMultikey().
{
WriteUnitOfWork wuow(opCtx);
- ASSERT_FALSE(coll->setIndexIsMultikey(opCtx, indexName, paths));
+ ASSERT(coll->setIndexIsMultikey(opCtx, indexName, paths));
wuow.commit();
}
}