diff options
author | Cheahuychou Mao <cheahuychou.mao@mongodb.com> | 2019-12-06 16:30:41 +0000 |
---|---|---|
committer | evergreen <evergreen@mongodb.com> | 2019-12-06 16:30:41 +0000 |
commit | eba76c558b3e7d784c146b51ced16d48b1d0efe7 (patch) | |
tree | eb43d876af50dfd29a6596878f15ed9ab500a30b /src/mongo/db/s/operation_sharding_state.cpp | |
parent | 13944bb3fedc8d91c02c56bb66bb5c76a0a558d0 (diff) | |
download | mongo-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.cpp | 31 |
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; } } |