diff options
author | Benety Goh <benety@mongodb.com> | 2021-06-18 05:44:26 -0400 |
---|---|---|
committer | Benety Goh <benety@mongodb.com> | 2021-06-24 19:23:22 -0400 |
commit | ff5ac33fbb9e92a50b641d4007cfd9b05c6ed225 (patch) | |
tree | acc18b016f4d3fb6e11284dfa49581add4d04932 | |
parent | 7145bb5e73547c2ddc17012b5b6ebaaab8952546 (diff) | |
download | mongo-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.cpp | 14 | ||||
-rw-r--r-- | src/mongo/db/catalog/collection_test.cpp | 4 |
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(); } } |