summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Studer <greg@10gen.com>2013-02-26 16:23:39 -0500
committerGreg Studer <greg@10gen.com>2013-02-27 17:13:24 -0500
commite57f5d32d93cd23971cadfcdb93a4b9f07a0ef5a (patch)
treeeb7485b9f38abb9381cbf5ccfacdd9a09c81196d
parent5eb8129fe56f7ef5454577416ac8b4fc12e2ae46 (diff)
downloadmongo-e57f5d32d93cd23971cadfcdb93a4b9f07a0ef5a.tar.gz
SERVER-8710 check balancer is stopped before upgrading
-rw-r--r--jstests/multiVersion/upgrade_cluster_v3_to_v4.js3
-rw-r--r--jstests/multiVersion/upgrade_cluster_v3_to_v4_db.js3
-rw-r--r--jstests/multiVersion/upgrade_cluster_v3_to_v4_wait_for_mongos.js3
-rw-r--r--jstests/multiVersion/upgrade_cluster_v3_to_v4_with_parallel_ops.js4
-rw-r--r--src/mongo/s/config_upgrade.cpp34
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.
//