SERVER-127096 Populate last spilled record id when resuming PDIB (#54034)

GitOrigin-RevId: 4a19eb6224a490d6a67c1995e549ec2527948cae
This commit is contained in:
Gregory Noma 2026-05-19 20:11:10 -04:00 committed by MongoDB Bot
parent e26546b472
commit 7ce46046c8
2 changed files with 88 additions and 0 deletions

View File

@ -545,6 +545,7 @@ StatusWith<std::vector<BSONObj>> MultiIndexBlock::init(
}();
stateInfo = *stateInfoIt;
index.lastSpilledRecordId = stateInfo->getLastSpilledRecordId();
auto status = index.block->initForResume(opCtx,
collection.getWritableCollection(opCtx),
indexes[i],

View File

@ -2362,6 +2362,93 @@ TEST_F(MultiIndexBlockTest, ResumePdibDuringCollectionScan) {
resumedIndexer.abortIndexBuild(operationContext(), coll, MultiIndexBlock::kNoopOnCleanUpFn);
}
TEST_F(MultiIndexBlockTest, ResumeRestoresLastSpilledRecordId) {
RAIIServerParameterControllerForTest ffContainerWrites{"featureFlagContainerWrites", true};
RAIIServerParameterControllerForTest ffPDIB{"featureFlagPrimaryDrivenIndexBuilds", true};
RAIIServerParameterControllerForTest ffResumable{"featureFlagResumablePrimaryDrivenIndexBuilds",
true};
auto prevMemLimitMB = maxIndexBuildMemoryUsageMegabytes.swap(0.5);
ON_BLOCK_EXIT([prevMemLimitMB] { maxIndexBuildMemoryUsageMegabytes.store(prevMemLimitMB); });
promoteMockReplCoordToPrimary(getServiceContext());
auto buildUUID = UUID::gen();
auto configurePdib = [&](MultiIndexBlock& idx) {
idx.setBuildUUID(buildUUID);
idx.setIndexBuildMethod(IndexBuildMethodEnum::kPrimaryDriven);
idx.setContainerWriteBehavior(ContainerWriteBehavior::kReplicate);
idx.setIsResumable(true);
};
AutoGetCollection autoColl{operationContext(), getNSS(), MODE_X};
CollectionWriter coll{operationContext(), autoColl};
auto& engine = *operationContext()->getServiceContext()->getStorageEngine();
auto indexBuildInfo =
IndexBuildInfo(BSON("key" << BSON("a" << 1) << "name"
<< "a_1"
<< "v" << static_cast<int>(IndexConfig::kLatestIndexVersion)),
"index-1",
engine);
auto& indexer = *getIndexer();
configurePdib(indexer);
ASSERT_OK(indexer.init(operationContext(),
coll,
{indexBuildInfo},
MultiIndexBlock::kNoopOnInitFn,
MultiIndexBlock::InitMode::SteadyState,
boost::none));
{
WriteUnitOfWork wuow{operationContext()};
std::string val(64 * 1024, 'a');
for (auto i = 0; i < 20; ++i) {
ASSERT_OK(
Helpers::insert(operationContext(), *autoColl, BSON("_id" << i << "a" << val)));
}
wuow.commit();
}
ASSERT_OK(indexer.insertAllDocumentsInCollection(operationContext(), getNSS()));
auto indexBuildIdent = ident::generateNewIndexBuildIdent(buildUUID);
shard_role_details::getRecoveryUnit(operationContext())->abandonSnapshot();
auto originalResumeInfo =
index_builds::readAndParseResumeIndexInfo(&engine, operationContext(), indexBuildIdent);
ASSERT_TRUE(originalResumeInfo);
EXPECT_EQ(IndexBuildPhaseEnum::kCollectionScan, originalResumeInfo->getPhase());
ASSERT_EQ(originalResumeInfo->getIndexes().size(), 1);
auto originalLastSpilledRecordId = originalResumeInfo->getIndexes()[0].getLastSpilledRecordId();
ASSERT_TRUE(originalLastSpilledRecordId);
// Simulate step-down.
indexer.markAsCleanedUp();
// Simulate step-up.
MultiIndexBlock resumedIndexer;
configurePdib(resumedIndexer);
ASSERT_OK(resumedIndexer.init(operationContext(),
coll,
{indexBuildInfo},
MultiIndexBlock::kNoopOnInitFn,
MultiIndexBlock::InitMode::SteadyState,
originalResumeInfo));
resumedIndexer.persistResumeState(operationContext(), coll.get());
shard_role_details::getRecoveryUnit(operationContext())->abandonSnapshot();
auto resumedResumeInfo =
index_builds::readAndParseResumeIndexInfo(&engine, operationContext(), indexBuildIdent);
ASSERT_TRUE(resumedResumeInfo);
ASSERT_EQ(resumedResumeInfo->getIndexes().size(), 1);
auto resumedLastSpilled = resumedResumeInfo->getIndexes()[0].getLastSpilledRecordId();
ASSERT_TRUE(resumedLastSpilled);
EXPECT_EQ(resumedLastSpilled->getLong(), originalLastSpilledRecordId->getLong());
resumedIndexer.abortIndexBuild(operationContext(), coll, MultiIndexBlock::kNoopOnCleanUpFn);
}
TEST_F(MultiIndexBlockTest, ResumePdibDuringLoad) {
RAIIServerParameterControllerForTest ffContainerWrites{"featureFlagContainerWrites", true};
RAIIServerParameterControllerForTest ffPDIB{"featureFlagPrimaryDrivenIndexBuilds", true};