From e57f5d32d93cd23971cadfcdb93a4b9f07a0ef5a Mon Sep 17 00:00:00 2001 From: Greg Studer Date: Tue, 26 Feb 2013 16:23:39 -0500 Subject: SERVER-8710 check balancer is stopped before upgrading --- jstests/multiVersion/upgrade_cluster_v3_to_v4.js | 3 ++ .../multiVersion/upgrade_cluster_v3_to_v4_db.js | 3 ++ .../upgrade_cluster_v3_to_v4_wait_for_mongos.js | 3 ++ .../upgrade_cluster_v3_to_v4_with_parallel_ops.js | 4 +++ src/mongo/s/config_upgrade.cpp | 34 ++++++++++++++++++++++ 5 files changed, 47 insertions(+) diff --git a/jstests/multiVersion/upgrade_cluster_v3_to_v4.js b/jstests/multiVersion/upgrade_cluster_v3_to_v4.js index f922bc1906d..3431a8e735e 100644 --- a/jstests/multiVersion/upgrade_cluster_v3_to_v4.js +++ b/jstests/multiVersion/upgrade_cluster_v3_to_v4.js @@ -32,6 +32,9 @@ var options = { var st = new ShardingTest({ shards : 2, mongos : 2, other : options }); +// Just stop balancer, to simulate race conds +st.setBalancer(false); + var shards = st.s0.getDB("config").shards.find().toArray(); var configConnStr = st._configDB; diff --git a/jstests/multiVersion/upgrade_cluster_v3_to_v4_db.js b/jstests/multiVersion/upgrade_cluster_v3_to_v4_db.js index 000484deb50..46124a8227a 100644 --- a/jstests/multiVersion/upgrade_cluster_v3_to_v4_db.js +++ b/jstests/multiVersion/upgrade_cluster_v3_to_v4_db.js @@ -19,6 +19,9 @@ var options = { var st = new ShardingTest({ shards : 1, mongos : 1, other : options }); +// Just set balancer to false, don't wait for it +st.setBalancer(false); + var mongos = st.s0 var config = mongos.getDB("config") var admin = mongos.getDB("admin") diff --git a/jstests/multiVersion/upgrade_cluster_v3_to_v4_wait_for_mongos.js b/jstests/multiVersion/upgrade_cluster_v3_to_v4_wait_for_mongos.js index 64da139e609..ba859edd7a7 100644 --- a/jstests/multiVersion/upgrade_cluster_v3_to_v4_wait_for_mongos.js +++ b/jstests/multiVersion/upgrade_cluster_v3_to_v4_wait_for_mongos.js @@ -19,6 +19,9 @@ var options = { var st = new ShardingTest({ shards : 1, mongos : 1, other : options }); +// Turn balancer off, don't wait +st.setBalancer(false); + var mongos = st.s0; jsTest.log( "Starting v2.0 mongos..." ); diff --git a/jstests/multiVersion/upgrade_cluster_v3_to_v4_with_parallel_ops.js b/jstests/multiVersion/upgrade_cluster_v3_to_v4_with_parallel_ops.js index b0ad24d55b8..77579de5615 100644 --- a/jstests/multiVersion/upgrade_cluster_v3_to_v4_with_parallel_ops.js +++ b/jstests/multiVersion/upgrade_cluster_v3_to_v4_with_parallel_ops.js @@ -176,6 +176,10 @@ printShardingStatus(config, true); jsTest.log("Upgrading config db from v3 to v4..."); +// Just stop the balancer, but don't wait for it to stop, to simulate race conds +st.setBalancer(false); +printjson(config.settings.find().toArray()); + var startTime = new Date(); // Make sure up diff --git a/src/mongo/s/config_upgrade.cpp b/src/mongo/s/config_upgrade.cpp index 62a550151e5..8a8b91b4d84 100644 --- a/src/mongo/s/config_upgrade.cpp +++ b/src/mongo/s/config_upgrade.cpp @@ -25,6 +25,7 @@ #include "mongo/s/mongo_version_range.h" #include "mongo/s/type_config_version.h" #include "mongo/s/type_database.h" +#include "mongo/s/type_settings.h" #include "mongo/s/type_shard.h" #include "mongo/util/assert_util.h" #include "mongo/util/version.h" @@ -277,6 +278,30 @@ namespace mongo { return VersionStatus_NeedUpgrade; } + // Returns true if we can confirm the balancer is stopped + bool _isBalancerStopped(const ConnectionString& configLoc, string* errMsg) { + + // Get the balancer information + scoped_ptr connPtr; + + BSONObj balancerDoc; + try { + connPtr.reset(ScopedDbConnection::getInternalScopedDbConnection(configLoc, 30)); + ScopedDbConnection& conn = *connPtr; + + balancerDoc = conn->findOne(SettingsType::ConfigNS, + BSON(SettingsType::key("balancer"))); + } + catch (const DBException& e) { + *errMsg = e.toString(); + return false; + } + + connPtr->done(); + + return balancerDoc[SettingsType::balancerStopped()].trueValue(); + } + // Checks that all config servers are online bool _checkConfigServersAlive(const ConnectionString& configLoc, string* errMsg) { @@ -450,6 +475,15 @@ namespace mongo { return false; } + // Check whether or not the balancer is online, if it is online we will not upgrade + if (!_isBalancerStopped(configLoc, errMsg)) { + + *errMsg = stream() << "balancer must be stopped for config upgrade" + << causedBy(errMsg); + + return false; + } + // // Acquire a lock for the upgrade process. // -- cgit v1.2.1