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/write_concern.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/write_concern.cpp')
| -rw-r--r-- | src/mongo/db/write_concern.cpp | 72 |
1 files changed, 27 insertions, 45 deletions
diff --git a/src/mongo/db/write_concern.cpp b/src/mongo/db/write_concern.cpp index ef19e3646f6..94d5350dfc1 100644 --- a/src/mongo/db/write_concern.cpp +++ b/src/mongo/db/write_concern.cpp @@ -37,7 +37,6 @@ #include "mongo/bson/util/bson_extract.h" #include "mongo/db/client.h" #include "mongo/db/commands/server_status_metric.h" -#include "mongo/db/curop.h" #include "mongo/db/operation_context.h" #include "mongo/db/read_write_concern_defaults.h" #include "mongo/db/repl/optime.h" @@ -98,34 +97,28 @@ StatusWith<WriteConcernOptions> extractWriteConcern(OperationContext* opCtx, bool clientSuppliedWriteConcern = !writeConcern.usedDefaultConstructedWC; bool customDefaultWasApplied = false; - // WriteConcern defaults can only be applied on regular replica set members. - // Operations received by shard and config servers should always have WC explicitly specified. - bool canApplyDefaultWC = serverGlobalParams.clusterRole == ClusterRole::None && - repl::ReplicationCoordinator::get(opCtx)->isReplEnabled() && - (!opCtx->inMultiDocumentTransaction() || - isTransactionCommand(cmdObj.firstElementFieldName())) && - !opCtx->getClient()->isInDirectClient() && !isInternalClient; - // If no write concern is specified in the command, then use the cluster-wide default WC (if - // there is one), or else the default implicit WC: - // (if [(#arbiters > 0) AND (#arbiters >= ½(#voting nodes) - 1)] then {w:1} else {w:majority}). - if (canApplyDefaultWC) { - auto getDefaultWC = ([&]() { - auto rwcDefaults = - ReadWriteConcernDefaults::get(opCtx->getServiceContext()).getDefault(opCtx); - auto wcDefault = rwcDefaults.getDefaultWriteConcern(); - const auto defaultWriteConcernSource = rwcDefaults.getDefaultWriteConcernSource(); - customDefaultWasApplied = defaultWriteConcernSource && - defaultWriteConcernSource == DefaultWriteConcernSourceEnum::kGlobal; - return wcDefault; - }); - - - if (!clientSuppliedWriteConcern) { - writeConcern = ([&]() { - auto wcDefault = getDefaultWC(); - // Default WC can be 'boost::none' if the implicit default is used and set to 'w:1'. + // there is one), or else the default WC {w:1}. + if (!clientSuppliedWriteConcern) { + writeConcern = ([&]() { + // WriteConcern defaults can only be applied on regular replica set members. Operations + // received by shard and config servers should always have WC explicitly specified. + if (serverGlobalParams.clusterRole != ClusterRole::ShardServer && + serverGlobalParams.clusterRole != ClusterRole::ConfigServer && + repl::ReplicationCoordinator::get(opCtx)->isReplEnabled() && + (!opCtx->inMultiDocumentTransaction() || + isTransactionCommand(cmdObj.firstElementFieldName())) && + !opCtx->getClient()->isInDirectClient() && !isInternalClient) { + + const auto rwcDefaults = + ReadWriteConcernDefaults::get(opCtx->getServiceContext()).getDefault(opCtx); + auto wcDefault = rwcDefaults.getDefaultWriteConcern(); if (wcDefault) { + const auto defaultWriteConcernSource = + rwcDefaults.getDefaultWriteConcernSource(); + customDefaultWasApplied = defaultWriteConcernSource && + defaultWriteConcernSource == DefaultWriteConcernSourceEnum::kGlobal; + LOGV2_DEBUG(22548, 2, "Applying default writeConcern on {cmdObj_firstElementFieldName} " @@ -135,22 +128,15 @@ StatusWith<WriteConcernOptions> extractWriteConcern(OperationContext* opCtx, "wcDefault"_attr = wcDefault->toBSON()); return *wcDefault; } - return writeConcern; - })(); - writeConcern.notExplicitWValue = true; - } - // Client supplied a write concern object without 'w' field. - else if (writeConcern.isExplicitWithoutWField()) { - auto wcDefault = getDefaultWC(); - // Default WC can be 'boost::none' if the implicit default is used and set to 'w:1'. - if (wcDefault) { - clientSuppliedWriteConcern = false; - writeConcern.w = wcDefault->w; - if (writeConcern.syncMode == WriteConcernOptions::SyncMode::UNSET) { - writeConcern.syncMode = wcDefault->syncMode; - } } + return writeConcern; + })(); + + if (writeConcern.isUnacknowledged()) { + writeConcern.w = 1; } + + writeConcern.notExplicitWValue = true; } // It's fine for clients to provide any provenance value to mongod. But if they haven't, then an @@ -286,10 +272,6 @@ Status waitForWriteConcern(OperationContext* opCtx, "replOpTime"_attr = replOpTime, "writeConcern"_attr = writeConcern.toBSON()); - // Add time waiting for write concern to CurOp. - CurOp::get(opCtx)->beginWaitForWriteConcernTimer(); - ScopeGuard finishTiming([&] { CurOp::get(opCtx)->stopWaitForWriteConcernTimer(); }); - auto* const storageEngine = opCtx->getServiceContext()->getStorageEngine(); auto const replCoord = repl::ReplicationCoordinator::get(opCtx); |
