diff options
author | Henrik Edin <henrik.edin@mongodb.com> | 2021-11-01 20:27:51 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-11-01 21:22:52 +0000 |
commit | 5d1078c60e8f24e027dc72d7ceeac4dab49908b9 (patch) | |
tree | 0d81f98332343167a56a7c350f1f3deb8c6da2a7 /src/mongo/db/index | |
parent | 8ac4553c3d5c7509ea708c31a7f0232b2b3d4f4f (diff) | |
download | mongo-5d1078c60e8f24e027dc72d7ceeac4dab49908b9.tar.gz |
SERVER-61094 Use a dedicated pooled KeyString builder per index
This avoids underlying SharedBuffer to be shared for KeyString for
separate indexes. Allows indexes that need to spill to disk to
independently free memory instead of being pinned by unrelated other
indexes.
Diffstat (limited to 'src/mongo/db/index')
-rw-r--r-- | src/mongo/db/index/index_access_method.cpp | 17 | ||||
-rw-r--r-- | src/mongo/db/index/index_access_method.h | 3 | ||||
-rw-r--r-- | src/mongo/db/index/skipped_record_tracker.cpp | 11 |
3 files changed, 23 insertions, 8 deletions
diff --git a/src/mongo/db/index/index_access_method.cpp b/src/mongo/db/index/index_access_method.cpp index dec7fc3ca28..7e71b8a7bd3 100644 --- a/src/mongo/db/index/index_access_method.cpp +++ b/src/mongo/db/index/index_access_method.cpp @@ -120,6 +120,7 @@ AbstractIndexAccessMethod::AbstractIndexAccessMethod(const IndexCatalogEntry* bt // Find the keys for obj, put them in the tree pointing to loc. Status AbstractIndexAccessMethod::insert(OperationContext* opCtx, + SharedBufferFragmentBuilder& pooledBufferBuilder, const CollectionPtr& coll, const BSONObj& obj, const RecordId& loc, @@ -136,7 +137,7 @@ Status AbstractIndexAccessMethod::insert(OperationContext* opCtx, getKeys(opCtx, coll, - executionCtx.pooledBufferBuilder(), + pooledBufferBuilder, obj, options.getKeysMode, GetKeysContext::kAddingKeys, @@ -276,6 +277,8 @@ RecordId AbstractIndexAccessMethod::findSingle(OperationContext* opCtx, KeyString::Value actualKey = [&]() { if (_indexCatalogEntry->getCollator()) { // For performance, call get keys only if there is a non-simple collation. + SharedBufferFragmentBuilder pooledBuilder( + KeyString::HeapBuilder::kHeapAllocatorDefaultBytes); auto& executionCtx = StorageExecutionContext::get(opCtx); auto keys = executionCtx.keys(); KeyStringSet* multikeyMetadataKeys = nullptr; @@ -283,7 +286,7 @@ RecordId AbstractIndexAccessMethod::findSingle(OperationContext* opCtx, getKeys(opCtx, collection, - executionCtx.pooledBufferBuilder(), + pooledBuilder, requestedKey, GetKeysMode::kEnforceConstraints, GetKeysContext::kAddingKeys, @@ -391,7 +394,7 @@ void AbstractIndexAccessMethod::prepareUpdate(OperationContext* opCtx, const RecordId& record, const InsertDeleteOptions& options, UpdateTicket* ticket) const { - auto& executionCtx = StorageExecutionContext::get(opCtx); + SharedBufferFragmentBuilder pooledBuilder(KeyString::HeapBuilder::kHeapAllocatorDefaultBytes); const MatchExpression* indexFilter = index->getFilterExpression(); if (!indexFilter || indexFilter->matchesBSON(from)) { // Override key constraints when generating keys for removal. This only applies to keys @@ -405,7 +408,7 @@ void AbstractIndexAccessMethod::prepareUpdate(OperationContext* opCtx, // metadata isn't updated when keys are deleted. getKeys(opCtx, collection, - executionCtx.pooledBufferBuilder(), + pooledBuilder, from, getKeysMode, GetKeysContext::kRemovingKeys, @@ -419,7 +422,7 @@ void AbstractIndexAccessMethod::prepareUpdate(OperationContext* opCtx, if (!indexFilter || indexFilter->matchesBSON(to)) { getKeys(opCtx, collection, - executionCtx.pooledBufferBuilder(), + pooledBuilder, to, options.getKeysMode, GetKeysContext::kAddingKeys, @@ -499,6 +502,7 @@ public: Status insert(OperationContext* opCtx, const CollectionPtr& collection, + SharedBufferFragmentBuilder& pooledBuilder, const BSONObj& obj, const RecordId& loc, const InsertDeleteOptions& options, @@ -576,6 +580,7 @@ AbstractIndexAccessMethod::BulkBuilderImpl::BulkBuilderImpl(const IndexCatalogEn Status AbstractIndexAccessMethod::BulkBuilderImpl::insert( OperationContext* opCtx, const CollectionPtr& collection, + SharedBufferFragmentBuilder& pooledBuilder, const BSONObj& obj, const RecordId& loc, const InsertDeleteOptions& options, @@ -590,7 +595,7 @@ Status AbstractIndexAccessMethod::BulkBuilderImpl::insert( _indexCatalogEntry->accessMethod()->getKeys( opCtx, collection, - executionCtx.pooledBufferBuilder(), + pooledBuilder, obj, options.getKeysMode, GetKeysContext::kAddingKeys, diff --git a/src/mongo/db/index/index_access_method.h b/src/mongo/db/index/index_access_method.h index 9ef5f340947..3a650b7f1de 100644 --- a/src/mongo/db/index/index_access_method.h +++ b/src/mongo/db/index/index_access_method.h @@ -88,6 +88,7 @@ public: * The behavior of the insertion can be specified through 'options'. */ virtual Status insert(OperationContext* opCtx, + SharedBufferFragmentBuilder& pooledBufferBuilder, const CollectionPtr& coll, const BSONObj& obj, const RecordId& loc, @@ -253,6 +254,7 @@ public: */ virtual Status insert(OperationContext* opCtx, const CollectionPtr& collection, + SharedBufferFragmentBuilder& pooledBuilder, const BSONObj& obj, const RecordId& loc, const InsertDeleteOptions& options, @@ -478,6 +480,7 @@ public: std::unique_ptr<SortedDataInterface> btree); Status insert(OperationContext* opCtx, + SharedBufferFragmentBuilder& pooledBufferBuilder, const CollectionPtr& coll, const BSONObj& obj, const RecordId& loc, diff --git a/src/mongo/db/index/skipped_record_tracker.cpp b/src/mongo/db/index/skipped_record_tracker.cpp index f6bbbf18c9a..52b1de46ea8 100644 --- a/src/mongo/db/index/skipped_record_tracker.cpp +++ b/src/mongo/db/index/skipped_record_tracker.cpp @@ -133,6 +133,7 @@ Status SkippedRecordTracker::retrySkippedRecords(OperationContext* opCtx, CurOp::get(opCtx)->setProgress_inlock(curopMessage, _skippedRecordCounter.load(), 1)); } + SharedBufferFragmentBuilder pooledBuilder(KeyString::HeapBuilder::kHeapAllocatorDefaultBytes); auto recordStore = _skippedRecordsTable->rs(); auto cursor = recordStore->getCursor(opCtx); int resolved = 0; @@ -158,8 +159,14 @@ Status SkippedRecordTracker::retrySkippedRecords(OperationContext* opCtx, // Because constraint enforcement is set, this will throw if there are any indexing // errors, instead of writing back to the skipped records table, which would // normally happen if constraints were relaxed. - auto status = _indexCatalogEntry->accessMethod()->insert( - opCtx, collection, skippedDoc, skippedRecordId, options, nullptr, nullptr); + auto status = _indexCatalogEntry->accessMethod()->insert(opCtx, + pooledBuilder, + collection, + skippedDoc, + skippedRecordId, + options, + nullptr, + nullptr); if (!status.isOK()) { return status; } |