diff options
author | Misha Tyulenev <misha@mongodb.com> | 2015-09-17 12:49:48 -0400 |
---|---|---|
committer | Misha Tyulenev <misha@mongodb.com> | 2015-09-17 14:07:30 -0400 |
commit | 0362fb5ddb53c02a3f0c22eda062437513ecfca7 (patch) | |
tree | d0bb30e3a6bcd97f765b56e56ce25bd436d57ad9 /src | |
parent | 4ea1fa9899eb5d8f2d529fd4344c628f4792e4de (diff) | |
download | mongo-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.cpp | 5 | ||||
-rw-r--r-- | src/mongo/s/chunk_manager.cpp | 2 | ||||
-rw-r--r-- | src/mongo/s/query/cluster_find.cpp | 4 |
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, |