diff options
Diffstat (limited to 'src/mongo/db/commands/write_commands.cpp')
-rw-r--r-- | src/mongo/db/commands/write_commands.cpp | 54 |
1 files changed, 6 insertions, 48 deletions
diff --git a/src/mongo/db/commands/write_commands.cpp b/src/mongo/db/commands/write_commands.cpp index 27ea2465486..378049c26ee 100644 --- a/src/mongo/db/commands/write_commands.cpp +++ b/src/mongo/db/commands/write_commands.cpp @@ -70,6 +70,7 @@ #include "mongo/db/storage/duplicate_key_error_info.h" #include "mongo/db/storage/storage_parameters_gen.h" #include "mongo/db/timeseries/timeseries_index_schema_conversion_functions.h" +#include "mongo/db/timeseries/timeseries_update_delete_util.h" #include "mongo/db/transaction/retryable_writes_stats.h" #include "mongo/db/transaction/transaction_participant.h" #include "mongo/db/transaction_validation.h" @@ -113,33 +114,6 @@ bool shouldSkipOutput(OperationContext* opCtx) { } /** - * Returns true if 'ns' is a time-series collection. That is, this namespace is backed by a - * time-series buckets collection. - */ -template <class Request> -bool isTimeseries(OperationContext* opCtx, const Request& request) { - uassert(5916400, - "'isTimeseriesNamespace' parameter can only be set when the request is sent on " - "system.buckets namespace", - !request.getIsTimeseriesNamespace() || - request.getNamespace().isTimeseriesBucketsCollection()); - const auto bucketNss = request.getIsTimeseriesNamespace() - ? request.getNamespace() - : request.getNamespace().makeTimeseriesBucketsNamespace(); - - // If the buckets collection exists now, the time-series insert path will check for the - // existence of the buckets collection later on with a lock. - // If this check is concurrent with the creation of a time-series collection and the buckets - // collection does not yet exist, this check may return false unnecessarily. As a result, an - // insert attempt into the time-series namespace will either succeed or fail, depending on who - // wins the race. - // Hold reference to the catalog for collection lookup without locks to be safe. - auto catalog = CollectionCatalog::get(opCtx); - auto coll = catalog->lookupCollectionByNamespace(opCtx, bucketNss); - return (coll && coll->getTimeseriesOptions()); -} - -/** * Contains hooks that are used by 'populateReply' method. */ struct PopulateReplyHooks { @@ -298,7 +272,7 @@ public: } } - if (isTimeseries(opCtx, request())) { + if (auto [isTimeseries, _] = timeseries::isTimeseries(opCtx, request()); isTimeseries) { // Re-throw parsing exceptions to be consistent with CmdInsert::Invocation's // constructor. try { @@ -467,7 +441,7 @@ public: } } - if (isTimeseries(opCtx, request())) { + if (auto [isTimeseries, _] = timeseries::isTimeseries(opCtx, request()); isTimeseries) { uassert(ErrorCodes::OperationNotSupportedInTransaction, str::stream() << "Cannot perform a multi-document transaction on a " "time-series collection: " @@ -558,15 +532,7 @@ public: "explained write batches must be of size 1", request().getUpdates().size() == 1); - auto isRequestToTimeseries = isTimeseries(opCtx, request()); - auto nss = [&] { - auto nss = request().getNamespace(); - if (!isRequestToTimeseries) { - return nss; - } - return nss.isTimeseriesBucketsCollection() ? nss - : nss.makeTimeseriesBucketsNamespace(); - }(); + auto [isRequestToTimeseries, nss] = timeseries::isTimeseries(opCtx, request()); UpdateRequest updateRequest(request().getUpdates()[0]); updateRequest.setNamespaceString(nss); @@ -712,7 +678,7 @@ public: } } - if (isTimeseries(opCtx, request())) { + if (auto [isTimeseries, _] = timeseries::isTimeseries(opCtx, request()); isTimeseries) { source = OperationSource::kTimeseriesDelete; } @@ -756,15 +722,7 @@ public: request().getDeletes().size() == 1); auto deleteRequest = DeleteRequest{}; - auto isRequestToTimeseries = isTimeseries(opCtx, request()); - auto nss = [&] { - auto nss = request().getNamespace(); - if (!isRequestToTimeseries) { - return nss; - } - return nss.isTimeseriesBucketsCollection() ? nss - : nss.makeTimeseriesBucketsNamespace(); - }(); + auto [isRequestToTimeseries, nss] = timeseries::isTimeseries(opCtx, request()); deleteRequest.setNsString(nss); deleteRequest.setLegacyRuntimeConstants(request().getLegacyRuntimeConstants().value_or( Variables::generateRuntimeConstants(opCtx))); |