// Checks version compatibility with our version VersionStatus isConfigVersionCompatible(const VersionType& versionInfo, string* whyNot) { string dummy; if (!whyNot) whyNot = &dummy; // Check if we're empty if (versionInfo.getCurrentVersion() == UpgradeHistory_EmptyVersion) { return VersionStatus_NeedUpgrade; } // Check that we aren't too old if (CURRENT_CONFIG_VERSION < versionInfo.getMinCompatibleVersion()) { *whyNot = stream() << "the config version " << CURRENT_CONFIG_VERSION << " of our process is too old " << "for the detected config version " << versionInfo.getMinCompatibleVersion(); return VersionStatus_Incompatible; } // Check that the mongo version of this process hasn't been excluded from the cluster vector<MongoVersionRange> excludedRanges; if (versionInfo.isExcludingMongoVersionsSet() && !MongoVersionRange::parseBSONArray(versionInfo.getExcludingMongoVersions(), &excludedRanges, whyNot)) { *whyNot = stream() << "could not understand excluded version ranges" << causedBy(whyNot); return VersionStatus_Incompatible; } // versionString is the global version of this process if (isInMongoVersionRanges(versionString, excludedRanges)) { // Cast needed here for MSVC compiler issue *whyNot = stream() << "not compatible with current config version, version " << reinterpret_cast<const char*>(versionString) << "has been excluded."; return VersionStatus_Incompatible; } // Check if we need to upgrade if (versionInfo.getCurrentVersion() >= CURRENT_CONFIG_VERSION) { return VersionStatus_Compatible; } return VersionStatus_NeedUpgrade; }
TEST_F(ConfigUpgradeTests, EmptyVersion) { // // Tests detection of empty config version // // Zero version (no version doc) VersionType oldVersion; Status status = getConfigVersion(grid.catalogManager(), &oldVersion); ASSERT(status.isOK()); ASSERT_EQUALS(oldVersion.getMinCompatibleVersion(), 0); ASSERT_EQUALS(oldVersion.getCurrentVersion(), 0); }
TEST_F(ConfigUpgradeTests, InitialUpgrade) { // // Tests initializing the config server to the initial version // // Empty version VersionType versionOld; VersionType version; string errMsg; bool result = checkAndUpgradeConfigVersion(grid.catalogManager(), false, &versionOld, &version, &errMsg); ASSERT(result); ASSERT_EQUALS(versionOld.getCurrentVersion(), 0); ASSERT_EQUALS(version.getMinCompatibleVersion(), MIN_COMPATIBLE_CONFIG_VERSION); ASSERT_EQUALS(version.getCurrentVersion(), CURRENT_CONFIG_VERSION); ASSERT_NOT_EQUALS(version.getClusterId(), OID()); }
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(grid.catalogManager(), &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(grid.catalogManager(), &newVersion); ASSERT(status.isOK()); ASSERT_EQUALS(newVersion.getMinCompatibleVersion(), MIN_COMPATIBLE_CONFIG_VERSION); ASSERT_EQUALS(newVersion.getCurrentVersion(), CURRENT_CONFIG_VERSION); ASSERT_EQUALS(newVersion.getClusterId(), clusterId); }