diff options
| author | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-11 15:07:35 -0300 |
|---|---|---|
| committer | Lucas de Castro Borges <lucas@gnuabordo.com.br> | 2025-02-11 15:07:35 -0300 |
| commit | 4cb8841196d0625dfa3825aa326f071cd27c7b8b (patch) | |
| tree | 1682a647d4463397c119183369ae6f750d5fdcff /src/mongo/db/query/query_stats/key.cpp | |
| parent | aa03c6362cbaa767638e6eed9b031d86dd2643d1 (diff) | |
| parent | 8f0827553e09872941945a093b647a4211a9db7f (diff) | |
Update upstream source from tag 'upstream/6.0.0'master
Update to upstream version '6.0.0'
with Debian dir 5604a80ec1c96ca76f25f40d78e6ef855abec322
Diffstat (limited to 'src/mongo/db/query/query_stats/key.cpp')
| -rw-r--r-- | src/mongo/db/query/query_stats/key.cpp | 223 |
1 files changed, 0 insertions, 223 deletions
diff --git a/src/mongo/db/query/query_stats/key.cpp b/src/mongo/db/query/query_stats/key.cpp deleted file mode 100644 index f282ef21a2a..00000000000 --- a/src/mongo/db/query/query_stats/key.cpp +++ /dev/null @@ -1,223 +0,0 @@ -/** - * Copyright (C) 2023-present MongoDB, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the Server Side Public License, version 1, - * as published by MongoDB, Inc. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * Server Side Public License for more details. - * - * You should have received a copy of the Server Side Public License - * along with this program. If not, see - * <http://www.mongodb.com/licensing/server-side-public-license>. - * - * As a special exception, the copyright holders give permission to link the - * code of portions of this program with the OpenSSL library under certain - * conditions as described in each individual source file and distribute - * linked combinations including the program with the OpenSSL library. You - * must comply with the Server Side Public License in all respects for - * all of the code used other than as permitted herein. If you modify file(s) - * with this exception, you may extend this exception to your version of the - * file(s), but you are not obligated to do so. If you do not wish to do so, - * delete this exception statement from your version. If you delete this - * exception statement from all source files in the program, then also delete - * it in the license file. - */ - -#include "mongo/db/query/query_stats/key.h" - -#include "mongo/db/query/query_stats/query_stats_helpers.h" -#include "mongo/rpc/metadata/client_metadata.h" - -namespace mongo::query_stats { - -namespace { - -BSONObj scrubHighCardinalityFields(const ClientMetadata* clientMetadata) { - if (!clientMetadata) { - return BSONObj(); - } - return clientMetadata->documentWithoutMongosInfo(); -} - -BSONObj shapifyReadPreference(boost::optional<BSONObj> readPreference) { - if (!readPreference) { - return BSONObj(); - } - - BSONObjBuilder builder; - for (const auto& elem : *readPreference) { - if (elem.fieldNameStringData() != "tags"_sd) { - builder.append(elem); - continue; - } - - // Sort the $readPreference tags so that different orderings still map to one query stats - // store key. - BSONObjSet sortedTags = SimpleBSONObjComparator::kInstance.makeBSONObjSet(); - for (const auto& tag : elem.Array()) { - sortedTags.insert(tag.Obj()); - } - - BSONArrayBuilder arrBuilder(builder.subarrayStart("tags"_sd)); - for (const auto& tag : sortedTags) { - arrBuilder.append(tag); - } - } - return builder.obj(); -} - -} // namespace - -UniversalKeyComponents::UniversalKeyComponents(std::unique_ptr<query_shape::Shape> queryShape, - const ClientMetadata* clientMetadata, - boost::optional<BSONObj> commentObj, - boost::optional<BSONObj> hint, - boost::optional<BSONObj> readPreference, - boost::optional<BSONObj> writeConcern, - boost::optional<BSONObj> readConcern, - std::unique_ptr<APIParameters> apiParams, - query_shape::CollectionType collectionType, - bool maxTimeMS) - : _clientMetaData(scrubHighCardinalityFields(clientMetadata)), - _commentObj(commentObj.value_or(BSONObj()).getOwned()), - _hintObj(hint.value_or(BSONObj()).getOwned()), - _writeConcern(writeConcern.value_or(BSONObj()).getOwned()), - _shapifiedReadPreference(shapifyReadPreference(readPreference)), - _shapifiedReadConcern(shapifyReadConcern(readConcern.value_or(BSONObj()))), - _comment(commentObj ? _commentObj.firstElement() : BSONElement()), - _queryShape(std::move(queryShape)), - _apiParams(std::move(apiParams)), - _clientMetaDataHash(clientMetadata ? clientMetadata->hashWithoutMongosInfo() - : simpleHash(BSONObj())), - _collectionType(collectionType), - _hasField() { - _hasField.clientMetaData = bool(clientMetadata); - _hasField.comment = bool(commentObj); - _hasField.hint = bool(hint); - _hasField.readPreference = bool(readPreference); - _hasField.writeConcern = bool(writeConcern); - _hasField.readConcern = bool(readConcern); - _hasField.maxTimeMS = maxTimeMS; - tassert(7973600, "shape must not be null", _queryShape); -} - -BSONObj UniversalKeyComponents::shapifyReadConcern(const BSONObj& readConcern, - const SerializationOptions& opts) { - // Read concern should not be considered a literal. - // afterClusterTime is distinct for every operation with causal consistency enabled. We - // normalize it in order not to blow out the queryStats store cache. - if (readConcern["afterClusterTime"].eoo() && readConcern["atClusterTime"].eoo()) { - return readConcern.copy(); - } else { - BSONObjBuilder bob; - - if (auto levelElem = readConcern["level"]) { - bob.append(levelElem); - } - if (auto afterClusterTime = readConcern["afterClusterTime"]) { - opts.appendLiteral(&bob, "afterClusterTime", afterClusterTime); - } - if (auto atClusterTime = readConcern["atClusterTime"]) { - opts.appendLiteral(&bob, "atClusterTime", atClusterTime); - } - return bob.obj(); - } -} - -size_t UniversalKeyComponents::size() const { - return sizeof(*this) + _queryShape->size() + - (_apiParams ? sizeof(*_apiParams) + shape_helpers::optionalSize(_apiParams->getAPIVersion()) - : 0) + - _hintObj.objsize() + (_hasField.clientMetaData ? _clientMetaData.objsize() : 0) + - _commentObj.objsize() + - (_hasField.readPreference ? _shapifiedReadPreference.objsize() : 0) + - (_hasField.readConcern ? _shapifiedReadConcern.objsize() : 0) + - (_hasField.writeConcern ? _writeConcern.objsize() : 0); -} - -void UniversalKeyComponents::appendTo(BSONObjBuilder& bob, const SerializationOptions& opts) const { - if (_hasField.comment) { - opts.appendLiteral(&bob, "comment", _comment); - } - - if (_hasField.readConcern) { - auto readConcernToAppend = _shapifiedReadConcern; - if (opts != SerializationOptions::kRepresentativeQueryShapeSerializeOptions) { - // The options aren't the same as the first time we shapified, so re-computation is - // necessary (e.g. use "?timestamp" instead of the representative Timestamp(0, 0)). - readConcernToAppend = shapifyReadConcern(_shapifiedReadConcern, opts); - } - bob.append("readConcern", readConcernToAppend); - } - - if (const auto& apiVersion = _apiParams->getAPIVersion()) { - bob.append("apiVersion", apiVersion.value()); - } - - if (const auto& apiStrict = _apiParams->getAPIStrict()) { - bob.append("apiStrict", apiStrict.value()); - } - - if (const auto& apiDeprecationErrors = _apiParams->getAPIDeprecationErrors()) { - bob.append("apiDeprecationErrors", apiDeprecationErrors.value()); - } - - if (_hasField.readPreference) { - bob.append("$readPreference", _shapifiedReadPreference); - } - - if (_hasField.writeConcern) { - bob.append("writeConcern", _writeConcern); - } - - if (_hasField.clientMetaData) { - bob.append("client", _clientMetaData); - } - if (_collectionType > query_shape::CollectionType::kUnknown) { - bob.append("collectionType", toStringData(_collectionType)); - } - if (!_hintObj.isEmpty()) { - bob.append("hint", shape_helpers::extractHintShape(_hintObj, opts)); - } - if (_hasField.maxTimeMS) { - opts.appendLiteral(&bob, "maxTimeMS", 0ll); - } -} -Key::Key(OperationContext* opCtx, - std::unique_ptr<query_shape::Shape> queryShape, - boost::optional<BSONObj> hint, - boost::optional<BSONObj> readConcern, - bool maxTimeMS, - query_shape::CollectionType collectionType) - : _universalComponents( - std::move(queryShape), - ClientMetadata::get(opCtx->getClient()), - opCtx->getCommentOwnedCopy(), - hint, - ReadPreferenceSetting::get(opCtx).usedDefaultReadPrefValue() - ? boost::none - : boost::make_optional(ReadPreferenceSetting::get(opCtx).toInnerBSON()), - opCtx->getWriteConcern().isImplicitDefaultWriteConcern() - ? boost::none - : boost::make_optional(opCtx->getWriteConcern().toBSON()), - readConcern, - std::make_unique<APIParameters>(APIParameters::get(opCtx)), - collectionType, - maxTimeMS) {} - -BSONObj Key::toBson(OperationContext* opCtx, const SerializationOptions& opts) const { - BSONObjBuilder bob; - - // We'll take care of appending this one outside of the appendTo() call below since it needs - // an OperationContext in some re-parsing cases. The rest is simpler. - bob.append("queryShape", _universalComponents._queryShape->toBson(opCtx, opts)); - - _universalComponents.appendTo(bob, opts); - appendCommandSpecificComponents(bob, opts); - return bob.obj(); -} -} // namespace mongo::query_stats |
