SERVER-127040: Replace AutoGetCollection in index build tests with collection acquisitions (#53828)
GitOrigin-RevId: 3fc2c96e3d513693030ebe028faddff036d35de1
This commit is contained in:
parent
63745eaa45
commit
a48dcebbc6
@ -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();
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
@ -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,
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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
Loading…
Reference in New Issue
Block a user