diff options
-rw-r--r-- | src/mongo/db/read_concern_mongod.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/read_write_concern_provenance.h | 6 | ||||
-rw-r--r-- | src/mongo/db/read_write_concern_provenance_test.cpp | 6 | ||||
-rw-r--r-- | src/mongo/db/s/balancer/migration_manager.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/s/migration_chunk_cloner_source_legacy.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/sessions_collection.cpp | 6 | ||||
-rw-r--r-- | src/mongo/db/write_concern.cpp | 5 | ||||
-rw-r--r-- | src/mongo/db/write_concern_options.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/write_concern_options.h | 2 | ||||
-rw-r--r-- | src/mongo/idl/basic_types.idl | 1 | ||||
-rw-r--r-- | src/mongo/s/commands/strategy.cpp | 11 |
11 files changed, 36 insertions, 13 deletions
diff --git a/src/mongo/db/read_concern_mongod.cpp b/src/mongo/db/read_concern_mongod.cpp index bc208fed2a2..8cc004b8f64 100644 --- a/src/mongo/db/read_concern_mongod.cpp +++ b/src/mongo/db/read_concern_mongod.cpp @@ -178,7 +178,7 @@ Status makeNoopWriteIfNeeded(OperationContext* opCtx, LogicalTime clusterTime) { << 1 << "maxClusterTime" << clusterTime.asTimestamp() << "data" << BSON("noop write for afterClusterTime read concern" << 1) << WriteConcernOptions::kWriteConcernField - << WriteConcernOptions::kImplicitDefault), + << WriteConcernOptions::kInternalWriteDefault), onRemoteCmdScheduled, onRemoteCmdComplete); diff --git a/src/mongo/db/read_write_concern_provenance.h b/src/mongo/db/read_write_concern_provenance.h index 686d1843d6d..0679b311821 100644 --- a/src/mongo/db/read_write_concern_provenance.h +++ b/src/mongo/db/read_write_concern_provenance.h @@ -70,6 +70,11 @@ namespace mongo { * Only applicable to write concern, and indicates that it originated from the (deprecated) * 'settings.getLastErrorDefaults' field of the replica set configuration. * + * - "internalWriteDefault": + * Only applicable to write concern on internal writes, and indicates that the internal client + * did not supply an explicit write concern, so this write concern represents the corresponding + * server default for internal writes, ie. {w: 1, wtimeout: 0}. + * * A ReadWriteConcernProvenance object may only have a single Source value throughout its lifetime; * once the Source has been set, attempting to change it will trigger an invariant. This ensures * the integrity of the provenance value as the operation makes its way through the server (and @@ -83,6 +88,7 @@ public: static constexpr StringData kImplicitDefault = "implicitDefault"_sd; static constexpr StringData kCustomDefault = "customDefault"_sd; static constexpr StringData kGetLastErrorDefaults = "getLastErrorDefaults"_sd; + static constexpr StringData kInternalWriteDefault = "internalWriteDefault"_sd; ReadWriteConcernProvenance() = default; diff --git a/src/mongo/db/read_write_concern_provenance_test.cpp b/src/mongo/db/read_write_concern_provenance_test.cpp index 5b04f468ef4..184dc98dff5 100644 --- a/src/mongo/db/read_write_concern_provenance_test.cpp +++ b/src/mongo/db/read_write_concern_provenance_test.cpp @@ -67,6 +67,12 @@ TEST(ReadWriteConcernProvenanceTest, GetLastErrorDefaults) { ASSERT_FALSE(provenance.isClientSupplied()); } +TEST(ReadWriteConcernProvenanceTest, InternalWriteDefault) { + ReadWriteConcernProvenance provenance(ReadWriteConcernProvenance::Source::internalWriteDefault); + ASSERT_TRUE(provenance.hasSource()); + ASSERT_FALSE(provenance.isClientSupplied()); +} + TEST(ReadWriteConcernProvenanceTest, SetSourceFromUnsetToUnset) { ReadWriteConcernProvenance provenance; provenance.setSource(boost::none); diff --git a/src/mongo/db/s/balancer/migration_manager.cpp b/src/mongo/db/s/balancer/migration_manager.cpp index c75e0ce2446..8ab7933ef24 100644 --- a/src/mongo/db/s/balancer/migration_manager.cpp +++ b/src/mongo/db/s/balancer/migration_manager.cpp @@ -485,7 +485,7 @@ std::shared_ptr<Notification<RemoteCommandResponse>> MigrationManager::_schedule // server default writeConcern. if (!builder.hasField(WriteConcernOptions::kWriteConcernField)) { builder.append(WriteConcernOptions::kWriteConcernField, - WriteConcernOptions::kImplicitDefault); + WriteConcernOptions::kInternalWriteDefault); } stdx::lock_guard<Latch> lock(_mutex); diff --git a/src/mongo/db/s/migration_chunk_cloner_source_legacy.cpp b/src/mongo/db/s/migration_chunk_cloner_source_legacy.cpp index 367b10bcb71..e6815d05889 100644 --- a/src/mongo/db/s/migration_chunk_cloner_source_legacy.cpp +++ b/src/mongo/db/s/migration_chunk_cloner_source_legacy.cpp @@ -299,10 +299,10 @@ Status MigrationChunkClonerSourceLegacy::startClone(OperationContext* opCtx, // Commands sent to shards that accept writeConcern, must always have writeConcern. So if the // StartChunkCloneRequest didn't add writeConcern (from secondaryThrottle), then we add the - // implicit server default writeConcern. + // internal server default writeConcern. if (!cmdBuilder.hasField(WriteConcernOptions::kWriteConcernField)) { cmdBuilder.append(WriteConcernOptions::kWriteConcernField, - WriteConcernOptions::kImplicitDefault); + WriteConcernOptions::kInternalWriteDefault); } auto startChunkCloneResponseStatus = _callRecipient(cmdBuilder.obj()); diff --git a/src/mongo/db/sessions_collection.cpp b/src/mongo/db/sessions_collection.cpp index 9864cc11aa9..88c75302220 100644 --- a/src/mongo/db/sessions_collection.cpp +++ b/src/mongo/db/sessions_collection.cpp @@ -278,8 +278,8 @@ BSONObj SessionsCollection::generateCreateIndexesCmd() { CreateIndexesCommand createIndexes(NamespaceString::kLogicalSessionsNamespace); createIndexes.setIndexes({index.toBSON()}); - return createIndexes.toBSON( - BSON(WriteConcernOptions::kWriteConcernField << WriteConcernOptions::kImplicitDefault)); + return createIndexes.toBSON(BSON(WriteConcernOptions::kWriteConcernField + << WriteConcernOptions::kInternalWriteDefault)); } BSONObj SessionsCollection::generateCollModCmd() { @@ -293,7 +293,7 @@ BSONObj SessionsCollection::generateCollModCmd() { indexBuilder.done(); collModCmdBuilder.append(WriteConcernOptions::kWriteConcernField, - WriteConcernOptions::kImplicitDefault); + WriteConcernOptions::kInternalWriteDefault); collModCmdBuilder.done(); return collModCmdBuilder.obj(); diff --git a/src/mongo/db/write_concern.cpp b/src/mongo/db/write_concern.cpp index 6c49846706c..3b4c020431e 100644 --- a/src/mongo/db/write_concern.cpp +++ b/src/mongo/db/write_concern.cpp @@ -165,6 +165,8 @@ StatusWith<WriteConcernOptions> extractWriteConcern(OperationContext* opCtx, provenance.setSource(ReadWriteConcernProvenance::Source::customDefault); } else if (getLastErrorDefaultsWasApplied) { provenance.setSource(ReadWriteConcernProvenance::Source::getLastErrorDefaults); + } else if (opCtx->getClient()->isInDirectClient() || isInternalClient) { + provenance.setSource(ReadWriteConcernProvenance::Source::internalWriteDefault); } else { provenance.setSource(ReadWriteConcernProvenance::Source::implicitDefault); } @@ -179,7 +181,8 @@ StatusWith<WriteConcernOptions> extractWriteConcern(OperationContext* opCtx, // does not specify writeConcern when writing to the config server. writeConcern = { WriteConcernOptions::kMajority, WriteConcernOptions::SyncMode::UNSET, Seconds(30)}; - writeConcern.getProvenance().setSource(ReadWriteConcernProvenance::Source::implicitDefault); + writeConcern.getProvenance().setSource( + ReadWriteConcernProvenance::Source::internalWriteDefault); } else { Status wcStatus = validateWriteConcern(opCtx, writeConcern); if (!wcStatus.isOK()) { diff --git a/src/mongo/db/write_concern_options.cpp b/src/mongo/db/write_concern_options.cpp index cd129ec2cf0..0a09aa802ff 100644 --- a/src/mongo/db/write_concern_options.cpp +++ b/src/mongo/db/write_concern_options.cpp @@ -76,10 +76,10 @@ const BSONObj WriteConcernOptions::Acknowledged(BSON("w" << W_NORMAL)); const BSONObj WriteConcernOptions::Unacknowledged(BSON("w" << W_NONE)); const BSONObj WriteConcernOptions::Majority(BSON("w" << WriteConcernOptions::kMajority)); -// The "kImplicitDefault" write concern, used by internal operations, is deliberately empty (no +// The "kInternalWriteDefault" write concern, used by internal operations, is deliberately empty (no // 'w' or 'wtimeout' specified). This allows internal operations to specify a write concern, while // still allowing it to be either w:1 or automatically upconverted to w:majority on configsvrs. -const BSONObj WriteConcernOptions::kImplicitDefault; +const BSONObj WriteConcernOptions::kInternalWriteDefault; constexpr Seconds WriteConcernOptions::kWriteConcernTimeoutSystem; constexpr Seconds WriteConcernOptions::kWriteConcernTimeoutMigration; diff --git a/src/mongo/db/write_concern_options.h b/src/mongo/db/write_concern_options.h index 870646fb528..96227f75122 100644 --- a/src/mongo/db/write_concern_options.h +++ b/src/mongo/db/write_concern_options.h @@ -54,7 +54,7 @@ public: static const BSONObj Acknowledged; static const BSONObj Unacknowledged; static const BSONObj Majority; - static const BSONObj kImplicitDefault; + static const BSONObj kInternalWriteDefault; static constexpr StringData kWriteConcernField = "writeConcern"_sd; static const char kMajority[]; // = "majority" diff --git a/src/mongo/idl/basic_types.idl b/src/mongo/idl/basic_types.idl index 1bac48374f5..37a7f86a0d0 100644 --- a/src/mongo/idl/basic_types.idl +++ b/src/mongo/idl/basic_types.idl @@ -254,6 +254,7 @@ enums: implicitDefault: "implicitDefault" customDefault: "customDefault" getLastErrorDefaults: "getLastErrorDefaults" + internalWriteDefault: "internalWriteDefault" CollationCaseFirst: description: Sort order of case differences. diff --git a/src/mongo/s/commands/strategy.cpp b/src/mongo/s/commands/strategy.cpp index 814befda717..073ba3231fe 100644 --- a/src/mongo/s/commands/strategy.cpp +++ b/src/mongo/s/commands/strategy.cpp @@ -646,10 +646,15 @@ Status ParseAndRunCommand::RunInvocation::_setup() { bool clientSuppliedWriteConcern = !_parc->_wc->usedDefault; bool customDefaultWriteConcernWasApplied = false; + bool isInternalClient = + (opCtx->getClient()->session() && + (opCtx->getClient()->session()->getTags() & transport::Session::kInternalClient)); if (supportsWriteConcern && !clientSuppliedWriteConcern && - (!TransactionRouter::get(opCtx) || isTransactionCommand(_parc->_commandName))) { - // This command supports WC, but wasn't given one - so apply the default, if there is one. + (!TransactionRouter::get(opCtx) || isTransactionCommand(_parc->_commandName)) && + !opCtx->getClient()->isInDirectClient() && !isInternalClient) { + // This command is not from a DBDirectClient or internal client, and supports WC, but + // wasn't given one - so apply the default, if there is one. if (const auto wcDefault = ReadWriteConcernDefaults::get(opCtx->getServiceContext()) .getDefaultWriteConcern(opCtx)) { _parc->_wc = *wcDefault; @@ -685,6 +690,8 @@ Status ParseAndRunCommand::RunInvocation::_setup() { provenance.setSource(ReadWriteConcernProvenance::Source::clientSupplied); } else if (customDefaultWriteConcernWasApplied) { provenance.setSource(ReadWriteConcernProvenance::Source::customDefault); + } else if (opCtx->getClient()->isInDirectClient() || isInternalClient) { + provenance.setSource(ReadWriteConcernProvenance::Source::internalWriteDefault); } else { provenance.setSource(ReadWriteConcernProvenance::Source::implicitDefault); } |