void ShardingTestFixture::expectSetShardVersion(const HostAndPort& expectedHost, const ShardType& expectedShard, const NamespaceString& expectedNs, const ChunkVersion& expectedChunkVersion) { onCommand([&](const RemoteCommandRequest& request) { ASSERT_EQ(expectedHost, request.target); ASSERT_EQUALS(rpc::makeEmptyMetadata(), request.metadata); SetShardVersionRequest ssv = assertGet(SetShardVersionRequest::parseFromBSON(request.cmdObj)); ASSERT(!ssv.isInit()); ASSERT(ssv.isAuthoritative()); ASSERT_EQ(grid.shardRegistry()->getConfigServerConnectionString().toString(), ssv.getConfigServer().toString()); ASSERT_EQ(expectedShard.getHost(), ssv.getShardConnectionString().toString()); ASSERT_EQ(expectedNs.toString(), ssv.getNS().ns()); ASSERT_EQ(expectedChunkVersion.toString(), ssv.getNSVersion().toString()); return BSON("ok" << true); }); }
StatusWith<SetShardVersionRequest> SetShardVersionRequest::parseFromBSON(const BSONObj& cmdObj) { SetShardVersionRequest request; { std::string configServer; Status status = bsonExtractStringField(cmdObj, kConfigServer, &configServer); if (!status.isOK()) return status; auto configServerStatus = ConnectionString::parse(configServer); if (!configServerStatus.isOK()) return configServerStatus.getStatus(); request._configServer = std::move(configServerStatus.getValue()); } { Status status = bsonExtractStringField(cmdObj, kShardName, &request._shardName); if (!status.isOK()) return status; } { std::string shardCS; Status status = bsonExtractStringField(cmdObj, kShardConnectionString, &shardCS); if (!status.isOK()) return status; auto shardCSStatus = ConnectionString::parse(shardCS); if (!shardCSStatus.isOK()) return shardCSStatus.getStatus(); request._shardCS = std::move(shardCSStatus.getValue()); } { Status status = bsonExtractBooleanFieldWithDefault(cmdObj, kInit, false, &request._init); if (!status.isOK()) return status; } { Status status = bsonExtractBooleanFieldWithDefault( cmdObj, kAuthoritative, false, &request._isAuthoritative); if (!status.isOK()) return status; } { Status status = bsonExtractBooleanFieldWithDefault( cmdObj, kNoConnectionVersioning, false, &request._noConnectionVersioning); if (!status.isOK()) return status; } if (request.isInit()) { return request; } // Only initialize the version information if this is not an "init" request { std::string ns; Status status = bsonExtractStringField(cmdObj, kCmdName, &ns); if (!status.isOK()) return status; NamespaceString nss(ns); if (!nss.isValid()) { return {ErrorCodes::InvalidNamespace, str::stream() << ns << " is not a valid namespace"}; } request._nss = std::move(nss); } { auto versionStatus = ChunkVersionAndOpTime::parseFromBSONForSetShardVersion(cmdObj); if (!versionStatus.isOK()) return versionStatus.getStatus(); request._version = versionStatus.getValue(); } return request; }