summaryrefslogtreecommitdiff
path: root/src/mongo/db/write_concern.cpp
diff options
context:
space:
mode:
authorLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-11 15:07:35 -0300
committerLucas de Castro Borges <lucas@gnuabordo.com.br>2025-02-11 15:07:35 -0300
commit4cb8841196d0625dfa3825aa326f071cd27c7b8b (patch)
tree1682a647d4463397c119183369ae6f750d5fdcff /src/mongo/db/write_concern.cpp
parentaa03c6362cbaa767638e6eed9b031d86dd2643d1 (diff)
parent8f0827553e09872941945a093b647a4211a9db7f (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.cpp72
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);