summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/operation_sharding_state.cpp
diff options
context:
space:
mode:
authorCheahuychou Mao <cheahuychou.mao@mongodb.com>2019-12-06 16:30:41 +0000
committerevergreen <evergreen@mongodb.com>2019-12-06 16:30:41 +0000
commiteba76c558b3e7d784c146b51ced16d48b1d0efe7 (patch)
treeeb43d876af50dfd29a6596878f15ed9ab500a30b /src/mongo/db/s/operation_sharding_state.cpp
parent13944bb3fedc8d91c02c56bb66bb5c76a0a558d0 (diff)
downloadmongo-eba76c558b3e7d784c146b51ced16d48b1d0efe7.tar.gz
SERVER-44719 Make createIndexes, dropIndexes, and collMod check shard versions
Diffstat (limited to 'src/mongo/db/s/operation_sharding_state.cpp')
-rw-r--r--src/mongo/db/s/operation_sharding_state.cpp31
1 files changed, 26 insertions, 5 deletions
diff --git a/src/mongo/db/s/operation_sharding_state.cpp b/src/mongo/db/s/operation_sharding_state.cpp
index 0a726714fd6..b5e01ee4dff 100644
--- a/src/mongo/db/s/operation_sharding_state.cpp
+++ b/src/mongo/db/s/operation_sharding_state.cpp
@@ -82,14 +82,17 @@ bool OperationShardingState::allowImplicitCollectionCreation() const {
return _allowImplicitCollectionCreation;
}
-void OperationShardingState::initializeClientRoutingVersions(NamespaceString nss,
- const BSONObj& cmdObj) {
+void OperationShardingState::initializeClientRoutingVersionsFromCommand(NamespaceString nss,
+ const BSONObj& cmdObj) {
invariant(_shardVersions.empty());
invariant(_databaseVersions.empty());
+ boost::optional<ChunkVersion> shardVersion;
+ boost::optional<DatabaseVersion> dbVersion;
+
const auto shardVersionElem = cmdObj.getField(ChunkVersion::kShardVersionField);
if (!shardVersionElem.eoo()) {
- _shardVersions[nss.ns()] = uassertStatusOK(ChunkVersion::parseFromCommand(cmdObj));
+ shardVersion = uassertStatusOK(ChunkVersion::parseFromCommand(cmdObj));
}
const auto dbVersionElem = cmdObj.getField(kDbVersionField);
@@ -98,11 +101,29 @@ void OperationShardingState::initializeClientRoutingVersions(NamespaceString nss
str::stream() << "expected databaseVersion element to be an object, got "
<< dbVersionElem,
dbVersionElem.type() == BSONType::Object);
+
+ dbVersion = DatabaseVersion::parse(IDLParserErrorContext("initializeClientRoutingVersions"),
+ dbVersionElem.Obj());
+ }
+
+ initializeClientRoutingVersions(nss, shardVersion, dbVersion);
+}
+
+void OperationShardingState::initializeClientRoutingVersions(
+ NamespaceString nss,
+ const boost::optional<ChunkVersion>& shardVersion,
+ const boost::optional<DatabaseVersion>& dbVersion) {
+ invariant(_shardVersions.empty());
+ invariant(_databaseVersions.empty());
+
+ if (shardVersion) {
+ _shardVersions[nss.ns()] = *shardVersion;
+ }
+ if (dbVersion) {
// Unforunately this is a bit ugly; it's because a command comes with a shardVersion or
// databaseVersion, and the assumption is that those versions are applied to whatever is
// returned by the Command's parseNs(), which can either be a full namespace or just a db.
- _databaseVersions[nss.db().empty() ? nss.ns() : nss.db()] = DatabaseVersion::parse(
- IDLParserErrorContext("initializeClientRoutingVersions"), dbVersionElem.Obj());
+ _databaseVersions[nss.db().empty() ? nss.ns() : nss.db()] = *dbVersion;
}
}