diff options
author | Greg Studer <greg@10gen.com> | 2013-02-26 16:23:39 -0500 |
---|---|---|
committer | Greg Studer <greg@10gen.com> | 2013-02-27 17:13:24 -0500 |
commit | e57f5d32d93cd23971cadfcdb93a4b9f07a0ef5a (patch) | |
tree | eb7485b9f38abb9381cbf5ccfacdd9a09c81196d | |
parent | 5eb8129fe56f7ef5454577416ac8b4fc12e2ae46 (diff) | |
download | mongo-e57f5d32d93cd23971cadfcdb93a4b9f07a0ef5a.tar.gz |
SERVER-8710 check balancer is stopped before upgrading
5 files changed, 47 insertions, 0 deletions
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<ScopedDbConnection> 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. // |