StatusWith<OID> ClusterIdentityLoader::_fetchClusterIdFromConfig( OperationContext* opCtx, const repl::ReadConcernLevel& readConcernLevel) { auto catalogClient = Grid::get(opCtx)->catalogClient(); auto loadResult = catalogClient->getConfigVersion(opCtx, readConcernLevel); if (!loadResult.isOK()) { return loadResult.getStatus().withContext("Error loading clusterID"); } return loadResult.getValue().getClusterId(); }
TEST_F(ConfigUpgradeTests, EmptyVersion) { // // Tests detection of empty config version // // Zero version (no version doc) VersionType oldVersion; Status status = getConfigVersion(configSvr(), &oldVersion); ASSERT(status.isOK()); ASSERT_EQUALS(oldVersion.getMinCompatibleVersion(), 0); ASSERT_EQUALS(oldVersion.getCurrentVersion(), 0); }
TEST_F(ConfigUpgradeTests, ClusterIDVersion) { // // Tests detection of newer config versions // VersionType newVersion; newVersion.setMinCompatibleVersion(MIN_COMPATIBLE_CONFIG_VERSION); newVersion.setCurrentVersion(CURRENT_CONFIG_VERSION); storeConfigVersion(newVersion); newVersion.clear(); // Current Version w/o clusterId (invalid!) Status status = getConfigVersion(configSvr(), &newVersion); ASSERT(!status.isOK()); newVersion.clear(); OID clusterId = OID::gen(); newVersion.setClusterId(clusterId); newVersion.setMinCompatibleVersion(MIN_COMPATIBLE_CONFIG_VERSION); newVersion.setCurrentVersion(CURRENT_CONFIG_VERSION); clearVersion(); storeConfigVersion(newVersion); newVersion.clear(); // Current version w/ clusterId (valid!) status = getConfigVersion(configSvr(), &newVersion); ASSERT(status.isOK()); ASSERT_EQUALS(newVersion.getMinCompatibleVersion(), MIN_COMPATIBLE_CONFIG_VERSION); ASSERT_EQUALS(newVersion.getCurrentVersion(), CURRENT_CONFIG_VERSION); ASSERT_EQUALS(newVersion.getClusterId(), clusterId); }
Status ShardingCatalogManager::_initConfigVersion(OperationContext* opCtx) { const auto catalogClient = Grid::get(opCtx)->catalogClient(); auto versionStatus = catalogClient->getConfigVersion(opCtx, repl::ReadConcernLevel::kLocalReadConcern); if (!versionStatus.isOK()) { return versionStatus.getStatus(); } const auto& versionInfo = versionStatus.getValue(); if (versionInfo.getMinCompatibleVersion() > CURRENT_CONFIG_VERSION) { return {ErrorCodes::IncompatibleShardingConfigVersion, str::stream() << "current version v" << CURRENT_CONFIG_VERSION << " is older than the cluster min compatible v" << versionInfo.getMinCompatibleVersion()}; } if (versionInfo.getCurrentVersion() == UpgradeHistory_EmptyVersion) { VersionType newVersion; newVersion.setClusterId(OID::gen()); newVersion.setMinCompatibleVersion(MIN_COMPATIBLE_CONFIG_VERSION); newVersion.setCurrentVersion(CURRENT_CONFIG_VERSION); BSONObj versionObj(newVersion.toBSON()); auto insertStatus = catalogClient->insertConfigDocument( opCtx, VersionType::ConfigNS, versionObj, kNoWaitWriteConcern); return insertStatus; } if (versionInfo.getCurrentVersion() == UpgradeHistory_UnreportedVersion) { return {ErrorCodes::IncompatibleShardingConfigVersion, "Assuming config data is old since the version document cannot be found in the " "config server and it contains databases besides 'local' and 'admin'. " "Please upgrade if this is the case. Otherwise, make sure that the config " "server is clean."}; } if (versionInfo.getCurrentVersion() < CURRENT_CONFIG_VERSION) { return {ErrorCodes::IncompatibleShardingConfigVersion, str::stream() << "need to upgrade current cluster version to v" << CURRENT_CONFIG_VERSION << "; currently at v" << versionInfo.getCurrentVersion()}; } return Status::OK(); }
BSONObj MongosType::toBSON() const { BSONObjBuilder builder; if (_name) builder.append(name.name(), getName()); if (_ping) builder.append(ping.name(), getPing()); if (_uptime) builder.append(uptime.name(), getUptime()); if (_waiting) builder.append(waiting.name(), getWaiting()); if (_mongoVersion) builder.append(mongoVersion.name(), getMongoVersion()); if (_configVersion) builder.append(configVersion.name(), getConfigVersion()); return builder.obj(); }