SERVER-127040: Replace AutoGetCollection in index build tests with collection acquisitions (#53828)

GitOrigin-RevId: 3fc2c96e3d513693030ebe028faddff036d35de1
This commit is contained in:
Thomas Goyne 2026-05-22 17:56:47 -07:00 committed by MongoDB Bot
parent 63745eaa45
commit a48dcebbc6
6 changed files with 505 additions and 248 deletions

View File

@ -44,11 +44,11 @@
#include "mongo/db/service_context.h"
#include "mongo/db/service_context_d_test_fixture.h"
#include "mongo/db/shard_role/lock_manager/lock_manager_defs.h"
#include "mongo/db/shard_role/shard_catalog/catalog_raii.h"
#include "mongo/db/shard_role/shard_catalog/collection.h"
#include "mongo/db/shard_role/shard_catalog/index_catalog.h"
#include "mongo/db/shard_role/shard_catalog/index_catalog_entry.h"
#include "mongo/db/shard_role/shard_catalog/index_descriptor.h"
#include "mongo/db/shard_role/shard_role.h"
#include "mongo/db/shard_role/transaction_resources.h"
#include "mongo/db/storage/key_string/key_string.h"
#include "mongo/unittest/unittest.h"
@ -248,8 +248,11 @@ TEST_F(IndexAccessMethodInsertKeys, DuplicatesCheckingOnSecondaryUniqueIndexes)
<< static_cast<int>(IndexDescriptor::IndexVersion::kV2));
ASSERT_OK(createIndexFromSpec(opCtx, nss.ns_forTest(), indexSpec));
AutoGetCollection autoColl(opCtx, nss, LockMode::MODE_X);
const auto& coll = *autoColl;
auto acq = acquireCollection(
opCtx,
CollectionAcquisitionRequest::fromOpCtx(opCtx, nss, AcquisitionPrerequisites::kWrite),
LockMode::MODE_X);
const auto& coll = acq.getCollectionPtr();
auto indexEntry = coll->getIndexCatalog()->findIndexByName(opCtx, indexName);
auto indexAccessMethod = indexEntry->accessMethod()->asSortedData();
@ -291,8 +294,11 @@ TEST_F(IndexAccessMethodInsertKeys, InsertWhenPrepareUnique) {
<< "v" << static_cast<int>(IndexDescriptor::IndexVersion::kV2));
ASSERT_OK(createIndexFromSpec(opCtx, nss.ns_forTest(), indexSpec));
AutoGetCollection autoColl(opCtx, nss, LockMode::MODE_X);
const auto& coll = *autoColl;
auto acq = acquireCollection(
opCtx,
CollectionAcquisitionRequest::fromOpCtx(opCtx, nss, AcquisitionPrerequisites::kWrite),
LockMode::MODE_X);
const auto& coll = acq.getCollectionPtr();
auto indexEntry = coll->getIndexCatalog()->findIndexByName(opCtx, indexName);
auto indexAccessMethod = indexEntry->accessMethod()->asSortedData();
@ -327,8 +333,11 @@ TEST_F(IndexAccessMethodUpdateKeys, UpdateWhenPrepareUnique) {
<< "v" << static_cast<int>(IndexDescriptor::IndexVersion::kV2));
ASSERT_OK(createIndexFromSpec(opCtx, nss.ns_forTest(), indexSpec));
AutoGetCollection autoColl(opCtx, nss, LockMode::MODE_X);
const auto& coll = *autoColl;
auto acq = acquireCollection(
opCtx,
CollectionAcquisitionRequest::fromOpCtx(opCtx, nss, AcquisitionPrerequisites::kWrite),
LockMode::MODE_X);
const auto& coll = acq.getCollectionPtr();
auto indexEntry = coll->getIndexCatalog()->findIndexByName(opCtx, indexName);
auto indexAccessMethod = indexEntry->accessMethod()->asSortedData();
@ -380,8 +389,11 @@ TEST_F(IndexAccessMethodBulkBuilder, CommitRejectsZeroInterval) {
<< static_cast<int>(IndexDescriptor::IndexVersion::kV2));
ASSERT_OK(createIndexFromSpec(opCtx, nss.ns_forTest(), indexSpec));
AutoGetCollection autoColl(opCtx, nss, LockMode::MODE_X);
const auto& coll = *autoColl;
auto acq = acquireCollection(
opCtx,
CollectionAcquisitionRequest::fromOpCtx(opCtx, nss, AcquisitionPrerequisites::kWrite),
LockMode::MODE_X);
const auto& coll = acq.getCollectionPtr();
auto indexEntry = coll->getIndexCatalog()->findIndexByName(opCtx, indexName);
auto indexAccessMethod = indexEntry->accessMethod()->asSortedData();

View File

@ -39,8 +39,8 @@
#include "mongo/db/namespace_string.h"
#include "mongo/db/operation_context.h"
#include "mongo/db/shard_role/lock_manager/lock_manager_defs.h"
#include "mongo/db/shard_role/shard_catalog/catalog_raii.h"
#include "mongo/db/shard_role/shard_catalog/catalog_test_fixture.h"
#include "mongo/db/shard_role/shard_role.h"
#include "mongo/unittest/unittest.h"
#include "mongo/util/net/hostandport.h"
#include "mongo/util/uuid.h"
@ -99,8 +99,13 @@ void checkIfEqual(IndexBuildEntry lhs, IndexBuildEntry rhs) {
}
Status removeIndexBuildEntry(OperationContext* opCtx, UUID indexBuildUUID) {
AutoGetCollection autoColl(opCtx, NamespaceString::kIndexBuildEntryNamespace, MODE_IX);
return indexbuildentryhelpers::removeIndexBuildEntry(opCtx, *autoColl, indexBuildUUID);
auto acq = acquireCollection(
opCtx,
CollectionAcquisitionRequest::fromOpCtx(
opCtx, NamespaceString::kIndexBuildEntryNamespace, AcquisitionPrerequisites::kWrite),
MODE_IX);
return indexbuildentryhelpers::removeIndexBuildEntry(
opCtx, acq.getCollectionPtr(), indexBuildUUID);
}
class IndexBuildEntryHelpersTest : public CatalogTestFixture {

View File

@ -95,7 +95,7 @@ class IndexBuilderInterceptorTest : public CatalogTestFixture {
protected:
const IndexCatalogEntry* createIndex(BSONObj spec) {
WriteUnitOfWork wuow(operationContext());
CollectionWriter writer{operationContext(), _coll.get()};
CollectionWriter writer{operationContext(), &_coll.value()};
auto* indexCatalog = writer.getWritableCollection(operationContext())->getIndexCatalog();
uassertStatusOK(indexCatalog->createIndexOnEmptyCollection(
@ -170,13 +170,17 @@ protected:
}
const IndexCatalogEntry* getIndexEntry(const std::string& indexName) {
return _coll.get()->getIndexCatalog()->findIndexByName(operationContext(), indexName);
return _coll->getCollectionPtr()->getIndexCatalog()->findIndexByName(operationContext(),
indexName);
}
void setUp() override {
CatalogTestFixture::setUp();
ASSERT_OK(storageInterface()->createCollection(operationContext(), _nss, {}));
_coll.emplace(operationContext(), _nss, MODE_X);
_coll = acquireCollection(operationContext(),
CollectionAcquisitionRequest::fromOpCtx(
operationContext(), _nss, AcquisitionPrerequisites::kWrite),
MODE_X);
}
void tearDown() override {
@ -189,7 +193,7 @@ protected:
void testSingleOpIsSavedToSideWritesTable(IndexBuildInterceptor::Op op,
LazyRecordStore::CreateMode createMode);
boost::optional<AutoGetCollection> _coll;
boost::optional<CollectionAcquisition> _coll;
private:
NamespaceString _nss = NamespaceString::createNamespaceString_forTest("testDB.interceptor");
@ -219,7 +223,7 @@ void IndexBuilderInterceptorTest::testSingleOpIsSavedToSideWritesTable(
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(
operationContext(), *_coll.get(), entry, {keyString}, {}, {}, op, &numKeys));
operationContext(), _coll->getCollectionPtr(), entry, {keyString}, {}, {}, op, &numKeys));
EXPECT_EQ(1, numKeys);
wuow.commit();
@ -278,7 +282,8 @@ TEST_F(IndexBuilderInterceptorTest, SingleInsertIsSavedToSkippedRecordsIntRidTra
recordId.serializeToken("recordId", &builder);
WriteUnitOfWork wuow(operationContext());
interceptor->getSkippedRecordTracker().record(operationContext(), *_coll.get(), recordId);
interceptor->getSkippedRecordTracker().record(
operationContext(), _coll->getCollectionPtr(), recordId);
wuow.commit();
auto skippedRecordsTable = getSkippedRecordsTableContents(indexBuildInfo);
@ -300,7 +305,8 @@ TEST_F(IndexBuilderInterceptorTest, SingleInsertIsSavedToSkippedRecordsTableIntR
recordId.serializeToken("recordId", &builder);
WriteUnitOfWork wuow(operationContext());
interceptor->getSkippedRecordTracker().record(operationContext(), *_coll.get(), recordId);
interceptor->getSkippedRecordTracker().record(
operationContext(), _coll->getCollectionPtr(), recordId);
wuow.commit();
auto skippedRecordsTable = getSkippedRecordsTableContents(indexBuildInfo);
@ -317,7 +323,8 @@ TEST_F(IndexBuilderInterceptorTest, SingleInsertIsSavedToskippedRecordsTableStri
recordId.serializeToken("recordId", &builder);
WriteUnitOfWork wuow(operationContext());
interceptor->getSkippedRecordTracker().record(operationContext(), *_coll.get(), recordId);
interceptor->getSkippedRecordTracker().record(
operationContext(), _coll->getCollectionPtr(), recordId);
wuow.commit();
auto skippedRecordsTable = getSkippedRecordsTableContents(indexBuildInfo);
@ -340,7 +347,8 @@ TEST_F(IndexBuilderInterceptorTest,
recordId.serializeToken("recordId", &builder);
WriteUnitOfWork wuow(operationContext());
interceptor->getSkippedRecordTracker().record(operationContext(), *_coll.get(), recordId);
interceptor->getSkippedRecordTracker().record(
operationContext(), _coll->getCollectionPtr(), recordId);
wuow.commit();
auto skippedRecordsTable = getSkippedRecordsTableContents(indexBuildInfo);
@ -359,7 +367,8 @@ TEST_F(IndexBuilderInterceptorTest, SingleInsertIsSavedToDuplicateKeyTable) {
key_string::Value keyString(ksBuilder.release());
WriteUnitOfWork wuow(operationContext());
ASSERT_OK(interceptor->recordDuplicateKey(operationContext(), *_coll.get(), entry, keyString));
ASSERT_OK(interceptor->recordDuplicateKey(
operationContext(), _coll->getCollectionPtr(), entry, keyString));
wuow.commit();
key_string::View keyStringView(keyString);
@ -385,7 +394,8 @@ TEST_F(IndexBuilderInterceptorTest, SingleInsertIsSavedToDuplicateKeyTablePrimar
key_string::Value keyString(ksBuilder.release());
WriteUnitOfWork wuow(operationContext());
ASSERT_OK(interceptor->recordDuplicateKey(operationContext(), *_coll.get(), entry, keyString));
ASSERT_OK(interceptor->recordDuplicateKey(
operationContext(), _coll->getCollectionPtr(), entry, keyString));
wuow.commit();
key_string::View keyStringView(keyString);
@ -429,7 +439,7 @@ TEST_F(IndexBuilderInterceptorTest, SingleInsertIsDrainedIntoIndexPrimaryDriven)
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{keyString},
{},
@ -441,7 +451,7 @@ TEST_F(IndexBuilderInterceptorTest, SingleInsertIsDrainedIntoIndexPrimaryDriven)
}
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kNoTrack,
@ -511,7 +521,7 @@ TEST_F(IndexBuilderInterceptorTest, SingleDeleteIsDrainedIntoIndexPrimaryDriven)
int64_t numInserted = 0;
ASSERT_OK(indexAccessMethod->insertKeys(operationContext(),
ru,
*_coll.get(),
_coll->getCollectionPtr(),
entry,
keySet,
InsertDeleteOptions{.dupsAllowed = true},
@ -526,7 +536,7 @@ TEST_F(IndexBuilderInterceptorTest, SingleDeleteIsDrainedIntoIndexPrimaryDriven)
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{keyString},
{},
@ -538,7 +548,7 @@ TEST_F(IndexBuilderInterceptorTest, SingleDeleteIsDrainedIntoIndexPrimaryDriven)
}
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kNoTrack,
@ -582,7 +592,7 @@ TEST_F(IndexBuilderInterceptorTest, DeferredTableCreation) {
{
WriteUnitOfWork wuow(operationContext());
interceptor->getSkippedRecordTracker().record(
operationContext(), *_coll.get(), RecordId(1));
operationContext(), _coll->getCollectionPtr(), RecordId(1));
wuow.commit();
}
@ -597,7 +607,7 @@ TEST_F(IndexBuilderInterceptorTest, DeferredTableCreation) {
WriteUnitOfWork wuow(operationContext());
ASSERT_OK(interceptor->recordDuplicateKey(
operationContext(), *_coll.get(), entry, ksBuilder.release()));
operationContext(), _coll->getCollectionPtr(), entry, ksBuilder.release()));
wuow.commit();
}
@ -651,16 +661,17 @@ TEST_F(IndexBuilderInterceptorTest, OpenExistingPreservesExistingData) {
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{keyString},
{},
{},
IndexBuildInterceptor::Op::kInsert,
&numKeys));
interceptor->getSkippedRecordTracker().record(operationContext(), *_coll.get(), recordId);
ASSERT_OK(
interceptor->recordDuplicateKey(operationContext(), *_coll.get(), entry, keyString));
interceptor->getSkippedRecordTracker().record(
operationContext(), _coll->getCollectionPtr(), recordId);
ASSERT_OK(interceptor->recordDuplicateKey(
operationContext(), _coll->getCollectionPtr(), entry, keyString));
wuow.commit();
}
@ -794,7 +805,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainSideWriteGeneratesNoContainerOpsWithout
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{keyString},
{},
@ -810,7 +821,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainSideWriteGeneratesNoContainerOpsWithout
// Drain without PDIB — should use regular record store ops, not container writes.
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kNoTrack,
@ -848,7 +859,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainInsertSideWriteGeneratesContainerOpsPri
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{keyString},
{},
@ -864,7 +875,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainInsertSideWriteGeneratesContainerOpsPri
// Drain the side writes into the index.
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kNoTrack,
@ -904,7 +915,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainDeleteSideWriteGeneratesContainerOpsPri
int64_t numInserted = 0;
ASSERT_OK(indexAccessMethod->insertKeys(operationContext(),
ru,
*_coll.get(),
_coll->getCollectionPtr(),
entry,
keySet,
InsertDeleteOptions{.dupsAllowed = true},
@ -919,7 +930,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainDeleteSideWriteGeneratesContainerOpsPri
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{keyString},
{},
@ -935,7 +946,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainDeleteSideWriteGeneratesContainerOpsPri
// Drain the side writes into the index.
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kNoTrack,
@ -970,7 +981,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainEmptySideWritesTableGeneratesNoContaine
// Drain with no side writes buffered.
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kNoTrack,
@ -1000,7 +1011,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainMultipleSideWritesGeneratesContainerOps
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{keyString},
{},
@ -1016,7 +1027,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainMultipleSideWritesGeneratesContainerOps
// Drain all side writes.
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kNoTrack,
@ -1065,7 +1076,7 @@ TEST_F(IndexBuilderInterceptorTest,
int64_t numInserted = 0;
ASSERT_OK(indexAccessMethod->insertKeys(operationContext(),
ru,
*_coll.get(),
_coll->getCollectionPtr(),
entry,
keySet,
InsertDeleteOptions{.dupsAllowed = true},
@ -1080,7 +1091,7 @@ TEST_F(IndexBuilderInterceptorTest,
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{insertKeyString},
{},
@ -1096,7 +1107,7 @@ TEST_F(IndexBuilderInterceptorTest,
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{deleteKeyString},
{},
@ -1112,7 +1123,7 @@ TEST_F(IndexBuilderInterceptorTest,
// Drain all side writes.
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kNoTrack,
@ -1155,7 +1166,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainMultipleBatchesGeneratesCorrectContaine
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{keyStrings.back()},
{},
@ -1171,7 +1182,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainMultipleBatchesGeneratesCorrectContaine
// Drain all side writes — with batch size 1 this should produce multiple WUOWs.
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kNoTrack,
@ -1220,7 +1231,7 @@ TEST_F(IndexBuilderInterceptorTest,
int64_t numInserted = 0;
ASSERT_OK(indexAccessMethod->insertKeys(operationContext(),
ru,
*_coll.get(),
_coll->getCollectionPtr(),
entry,
keySet,
InsertDeleteOptions{.dupsAllowed = true},
@ -1235,7 +1246,7 @@ TEST_F(IndexBuilderInterceptorTest,
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{dupKeyString},
{},
@ -1253,7 +1264,7 @@ TEST_F(IndexBuilderInterceptorTest,
// Drain with TrackDuplicates::kTrack — duplicates should be recorded to the constraint
// violations table rather than causing a failure.
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kTrack,
@ -1299,7 +1310,7 @@ TEST_F(IndexBuilderInterceptorTest,
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{keyString},
{},
@ -1316,7 +1327,7 @@ TEST_F(IndexBuilderInterceptorTest,
// Drain with kTrack on a unique index — but since there's no duplicate, the constraint
// violations table should not be written to.
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kTrack,
@ -1358,7 +1369,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainDeleteOnUniqueIndexGeneratesContainerOp
int64_t numInserted = 0;
ASSERT_OK(indexAccessMethod->insertKeys(operationContext(),
ru,
*_coll.get(),
_coll->getCollectionPtr(),
entry,
keySet,
InsertDeleteOptions{.dupsAllowed = true},
@ -1373,7 +1384,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainDeleteOnUniqueIndexGeneratesContainerOp
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{keyString},
{},
@ -1388,7 +1399,7 @@ TEST_F(IndexBuilderInterceptorTest, DrainDeleteOnUniqueIndexGeneratesContainerOp
// Drain with kTrack on a unique index — delete path is unaffected by uniqueness.
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kTrack,
@ -1428,7 +1439,7 @@ TEST_F(IndexBuilderInterceptorTest,
int64_t numInserted = 0;
ASSERT_OK(indexAccessMethod->insertKeys(operationContext(),
ru,
*_coll.get(),
_coll->getCollectionPtr(),
entry,
keySet,
InsertDeleteOptions{.dupsAllowed = true},
@ -1443,7 +1454,7 @@ TEST_F(IndexBuilderInterceptorTest,
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{dupKeyString},
{},
@ -1460,7 +1471,7 @@ TEST_F(IndexBuilderInterceptorTest,
// Drain with kNoTrack — duplicate is silently swallowed, not recorded to constraint
// violations table.
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kNoTrack,
@ -1505,7 +1516,7 @@ TEST_F(IndexBuilderInterceptorTest,
int64_t numInserted = 0;
ASSERT_OK(indexAccessMethod->insertKeys(operationContext(),
ru,
*_coll.get(),
_coll->getCollectionPtr(),
entry,
keySet,
InsertDeleteOptions{.dupsAllowed = true},
@ -1520,7 +1531,7 @@ TEST_F(IndexBuilderInterceptorTest,
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{dupKeyString},
{},
@ -1539,7 +1550,7 @@ TEST_F(IndexBuilderInterceptorTest,
// forces the error path even when options.dupsAllowed is true.
auto status =
interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kTrack,
@ -1580,7 +1591,7 @@ TEST_F(IndexBuilderInterceptorTest,
int64_t numInserted = 0;
ASSERT_OK(indexAccessMethod->insertKeys(operationContext(),
ru,
*_coll.get(),
_coll->getCollectionPtr(),
entry,
keySet,
InsertDeleteOptions{.dupsAllowed = true},
@ -1595,7 +1606,7 @@ TEST_F(IndexBuilderInterceptorTest,
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{keyString},
{},
@ -1614,7 +1625,7 @@ TEST_F(IndexBuilderInterceptorTest,
// is NOT invoked, so no constraint violation is recorded. This is an idempotent re-insert,
// not a true duplicate.
ASSERT_OK(interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kTrack,
@ -1660,7 +1671,7 @@ TEST_F(IndexBuilderInterceptorTest,
int64_t numInserted = 0;
ASSERT_OK(indexAccessMethod->insertKeys(operationContext(),
ru,
*_coll.get(),
_coll->getCollectionPtr(),
entry,
keySet,
InsertDeleteOptions{.dupsAllowed = true},
@ -1675,7 +1686,7 @@ TEST_F(IndexBuilderInterceptorTest,
WriteUnitOfWork wuow(operationContext());
int64_t numKeys = 0;
ASSERT_OK(interceptor->sideWrite(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
{dupKeyString},
{},
@ -1693,7 +1704,7 @@ TEST_F(IndexBuilderInterceptorTest,
// path regardless of the TrackDuplicates mode.
auto status =
interceptor->drainWritesIntoIndex(operationContext(),
*_coll.get(),
_coll->getCollectionPtr(),
entry,
InsertDeleteOptions{.dupsAllowed = true},
IndexBuildInterceptor::TrackDuplicates::kNoTrack,

View File

@ -35,12 +35,14 @@
#include "mongo/db/index_builds/multi_index_block.h"
#include "mongo/db/namespace_string.h"
#include "mongo/db/service_context.h"
#include "mongo/db/shard_role/lock_manager/d_concurrency.h"
#include "mongo/db/shard_role/lock_manager/lock_manager_defs.h"
#include "mongo/db/shard_role/shard_catalog/catalog_raii.h"
#include "mongo/db/shard_role/shard_catalog/collection.h"
#include "mongo/db/shard_role/shard_catalog/database_holder.h"
#include "mongo/db/shard_role/shard_catalog/index_catalog.h"
#include "mongo/db/shard_role/shard_catalog/index_catalog_entry.h"
#include "mongo/db/shard_role/shard_catalog/index_descriptor.h"
#include "mongo/db/shard_role/shard_role.h"
#include "mongo/db/shard_role/transaction_resources.h"
#include "mongo/db/topology/vector_clock/vector_clock_mutable.h"
@ -75,34 +77,39 @@ Status createIndexFromSpec(OperationContext* opCtx,
};
{
AutoGetDb autoDb(opCtx, nss.dbName(), MODE_IX);
Lock::CollectionLock collLock(opCtx, nss, MODE_X);
WriteUnitOfWork wunit(opCtx);
CollectionWriter writer{opCtx, nss};
auto coll = writer.getWritableCollection(opCtx);
if (!coll) {
auto db = autoDb.ensureDbExists(opCtx);
auto acq = acquireCollection(
opCtx,
CollectionAcquisitionRequest::fromOpCtx(opCtx, nss, AcquisitionPrerequisites::kWrite),
MODE_X);
if (!acq.exists()) {
auto db = DatabaseHolder::get(opCtx)->openDb(opCtx, nss.dbName());
invariant(db);
coll = db->createCollection(opCtx, NamespaceString::createNamespaceString_forTest(ns));
auto coll =
db->createCollection(opCtx, NamespaceString::createNamespaceString_forTest(ns));
invariant(coll);
}
invariant(coll);
wunit.commit();
}
MultiIndexBlock indexer;
ScopeGuard abortOnExit([&] {
AutoGetDb autoDb(opCtx, nss.dbName(), MODE_IX);
Lock::CollectionLock collLock(opCtx, nss, MODE_X);
CollectionWriter collection(opCtx, nss);
auto acq = acquireCollection(
opCtx,
CollectionAcquisitionRequest::fromOpCtx(opCtx, nss, AcquisitionPrerequisites::kWrite),
MODE_X);
CollectionWriter collection(opCtx, &acq);
indexer.abortIndexBuild(opCtx, collection, MultiIndexBlock::kNoopOnCleanUpFn);
});
auto storageEngine = opCtx->getServiceContext()->getStorageEngine();
IndexBuildInfo indexBuildInfo(spec, *storageEngine, nss.dbName());
{
AutoGetDb autoDb(opCtx, nss.dbName(), MODE_IX);
Lock::CollectionLock collLock(opCtx, nss, MODE_X);
CollectionWriter collection(opCtx, nss);
auto acq = acquireCollection(
opCtx,
CollectionAcquisitionRequest::fromOpCtx(opCtx, nss, AcquisitionPrerequisites::kWrite),
MODE_X);
CollectionWriter collection(opCtx, &acq);
Status status = indexer
.init(
opCtx,
@ -132,9 +139,11 @@ Status createIndexFromSpec(OperationContext* opCtx,
return status;
}
AutoGetDb autoDb(opCtx, nss.dbName(), MODE_IX);
Lock::CollectionLock collLock(opCtx, nss, MODE_X);
CollectionWriter collection(opCtx, nss);
auto acq = acquireCollection(
opCtx,
CollectionAcquisitionRequest::fromOpCtx(opCtx, nss, AcquisitionPrerequisites::kWrite),
MODE_X);
CollectionWriter collection(opCtx, &acq);
if (auto status = indexer.retrySkippedRecords(opCtx, collection.get()); !status.isOK()) {
return status;
}

View File

@ -39,6 +39,7 @@
#include "mongo/db/shard_role/lock_manager/lock_manager_defs.h"
#include "mongo/db/shard_role/shard_catalog/catalog_test_fixture.h"
#include "mongo/db/shard_role/shard_catalog/collection_options.h"
#include "mongo/db/shard_role/shard_role.h"
#include "mongo/db/storage/exceptions.h"
#include "mongo/db/storage/ident.h"
#include "mongo/idl/server_parameter_test_controller.h"
@ -86,8 +87,11 @@ void IndexBuildsManagerTest::createCollection(const NamespaceString& nss) {
}
UUID IndexBuildsManagerTest::getCollectionUUID() const {
AutoGetCollection autoColl(operationContext(), _nss, MODE_IS);
return autoColl->uuid();
auto acq = acquireCollection(operationContext(),
CollectionAcquisitionRequest::fromOpCtx(
operationContext(), _nss, AcquisitionPrerequisites::kRead),
MODE_IS);
return acq.uuid();
}
std::vector<IndexBuildInfo> IndexBuildsManagerTest::makeSpecs(std::vector<std::string> keys) {
@ -106,8 +110,11 @@ std::vector<IndexBuildInfo> IndexBuildsManagerTest::makeSpecs(std::vector<std::s
}
TEST_F(IndexBuildsManagerTest, IndexBuildsManagerSetUpAndTearDown) {
AutoGetCollection autoColl(operationContext(), _nss, MODE_X);
CollectionWriter collection(operationContext(), autoColl);
auto acq = acquireCollection(operationContext(),
CollectionAcquisitionRequest::fromOpCtx(
operationContext(), _nss, AcquisitionPrerequisites::kWrite),
MODE_X);
CollectionWriter collection(operationContext(), &acq);
auto indexes = makeSpecs({"a", "b"});
ASSERT_OK(_indexBuildsManager.setUpIndexBuild(
@ -119,8 +126,11 @@ TEST_F(IndexBuildsManagerTest, IndexBuildsManagerSetUpAndTearDown) {
}
TEST_F(IndexBuildsManagerTest, SetUpPrimaryDrivenIndexBuildAddsToRegistry) {
AutoGetCollection autoColl{operationContext(), _nss, MODE_X};
CollectionWriter collection{operationContext(), autoColl};
auto acq = acquireCollection(operationContext(),
CollectionAcquisitionRequest::fromOpCtx(
operationContext(), _nss, AcquisitionPrerequisites::kWrite),
MODE_X);
CollectionWriter collection{operationContext(), &acq};
auto indexes = makeSpecs({"a", "b"});
@ -154,8 +164,11 @@ TEST_F(IndexBuildsManagerTest, SetUpPrimaryDrivenIndexBuildAddsToRegistry) {
}
TEST_F(IndexBuildsManagerTest, SetUpFailureDoesNotAddPrimaryDrivenIndexBuildToRegistry) {
AutoGetCollection autoColl{operationContext(), _nss, MODE_X};
CollectionWriter collection{operationContext(), autoColl};
auto acq = acquireCollection(operationContext(),
CollectionAcquisitionRequest::fromOpCtx(
operationContext(), _nss, AcquisitionPrerequisites::kWrite),
MODE_X);
CollectionWriter collection{operationContext(), &acq};
auto indexes = makeSpecs({"a"});
@ -178,8 +191,11 @@ TEST_F(IndexBuildsManagerTest, SetUpFailureDoesNotAddPrimaryDrivenIndexBuildToRe
}
TEST_F(IndexBuildsManagerTest, SetUpNonPrimaryDrivenIndexBuildDoesNotAddToRegistry) {
AutoGetCollection autoColl{operationContext(), _nss, MODE_X};
CollectionWriter collection{operationContext(), autoColl};
auto acq = acquireCollection(operationContext(),
CollectionAcquisitionRequest::fromOpCtx(
operationContext(), _nss, AcquisitionPrerequisites::kWrite),
MODE_X);
CollectionWriter collection{operationContext(), &acq};
auto indexes = makeSpecs({"a"});
ASSERT_OK(_indexBuildsManager.setUpIndexBuild(
@ -202,12 +218,16 @@ TEST_F(IndexBuildsManagerTest, CommitIndexBuildMultikeysAreResetWhenWceFiresAfte
auto opCtx = operationContext();
const auto collectionUUID = getCollectionUUID();
AutoGetCollection lockHolder(opCtx, _nss, MODE_X);
CollectionWriter collection(opCtx, collectionUUID);
auto acq = acquireCollection(
opCtx,
CollectionAcquisitionRequest::fromOpCtx(opCtx, _nss, AcquisitionPrerequisites::kWrite),
MODE_X);
CollectionWriter collection(opCtx, &acq);
{
WriteUnitOfWork wuow(opCtx);
ASSERT_OK(Helpers::insert(opCtx, *lockHolder, BSON("_id" << 0 << "a" << 1 << "b" << 2)));
ASSERT_OK(
Helpers::insert(opCtx, collection.get(), BSON("_id" << 0 << "a" << 1 << "b" << 2)));
wuow.commit();
}

File diff suppressed because it is too large Load Diff