summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMisha Tyulenev <misha@mongodb.com>2015-09-17 12:49:48 -0400
committerMisha Tyulenev <misha@mongodb.com>2015-09-17 14:07:30 -0400
commit0362fb5ddb53c02a3f0c22eda062437513ecfca7 (patch)
treed0bb30e3a6bcd97f765b56e56ce25bd436d57ad9 /src
parent4ea1fa9899eb5d8f2d529fd4344c628f4792e4de (diff)
downloadmongo-0362fb5ddb53c02a3f0c22eda062437513ecfca7.tar.gz
SERVER-20395 ClusterFind::runQuery should read from primary if a collection became unsharded
Diffstat (limited to 'src')
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_shard_collection_test.cpp5
-rw-r--r--src/mongo/s/chunk_manager.cpp2
-rw-r--r--src/mongo/s/query/cluster_find.cpp4
3 files changed, 10 insertions, 1 deletions
diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_shard_collection_test.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_shard_collection_test.cpp
index b31279c7411..ad566bc4850 100644
--- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_shard_collection_test.cpp
+++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_shard_collection_test.cpp
@@ -35,6 +35,7 @@
#include <vector>
#include "mongo/client/remote_command_targeter_mock.h"
+#include "mongo/db/client.h"
#include "mongo/db/commands.h"
#include "mongo/executor/network_interface_mock.h"
#include "mongo/executor/task_executor.h"
@@ -308,6 +309,7 @@ TEST_F(ShardCollectionTest, anotherMongosSharding) {
Status::OK());
auto future = launchAsync([&] {
+ Client::initThreadIfNotAlready();
ASSERT_EQUALS(
ErrorCodes::AlreadyInitialized,
catalogManager()->shardCollection(
@@ -370,6 +372,7 @@ TEST_F(ShardCollectionTest, noInitialChunksOrData) {
// Now start actually sharding the collection.
auto future = launchAsync([&] {
+ Client::initThreadIfNotAlready();
ASSERT_OK(catalogManager()->shardCollection(
operationContext(), ns, keyPattern, false, vector<BSONObj>{}, set<ShardId>{}));
});
@@ -547,6 +550,7 @@ TEST_F(ShardCollectionTest, withInitialChunks) {
// Now start actually sharding the collection.
auto future = launchAsync([&] {
+ Client::initThreadIfNotAlready();
set<ShardId> shards{shard0.getName(), shard1.getName(), shard2.getName()};
ASSERT_OK(catalogManager()->shardCollection(
operationContext(),
@@ -713,6 +717,7 @@ TEST_F(ShardCollectionTest, withInitialData) {
// Now start actually sharding the collection.
auto future = launchAsync([&] {
+ Client::initThreadIfNotAlready();
ASSERT_OK(catalogManager()->shardCollection(
operationContext(), ns, keyPattern, false, vector<BSONObj>{}, set<ShardId>{}));
});
diff --git a/src/mongo/s/chunk_manager.cpp b/src/mongo/s/chunk_manager.cpp
index a62e92dc8e3..2531b74ea7e 100644
--- a/src/mongo/s/chunk_manager.cpp
+++ b/src/mongo/s/chunk_manager.cpp
@@ -331,7 +331,7 @@ shared_ptr<ChunkManager> ChunkManager::reload(OperationContext* txn, bool force)
auto status = grid.catalogCache()->getDatabase(txn, nss.db().toString());
shared_ptr<DBConfig> config = uassertStatusOK(status);
- return config->getChunkManager(txn, getns(), force);
+ return config->getChunkManagerIfExists(txn, getns(), force);
}
void ChunkManager::_printChunks() const {
diff --git a/src/mongo/s/query/cluster_find.cpp b/src/mongo/s/query/cluster_find.cpp
index bdc44c1a3a7..2364d163de2 100644
--- a/src/mongo/s/query/cluster_find.cpp
+++ b/src/mongo/s/query/cluster_find.cpp
@@ -368,6 +368,10 @@ StatusWith<CursorId> ClusterFind::runQuery(OperationContext* txn,
invariant(chunkManager);
chunkManager = chunkManager->reload(txn);
+ if (!chunkManager) {
+ dbConfig.getValue()->getChunkManagerOrPrimary(
+ txn, query.nss().ns(), chunkManager, primary);
+ }
}
return {ErrorCodes::StaleShardVersion,