From 465ca1774ddb7078566cb2edf0408f5881d6aae3 Mon Sep 17 00:00:00 2001 From: Daniel Alabi Date: Tue, 17 Mar 2015 13:28:52 -0400 Subject: [PATCH] SERVER-17586 Update ShardVersionMap in ChunkManager when shard is deleted during balancing --- src/mongo/s/chunk_manager.cpp | 26 +++++++++++++++++--------- src/mongo/s/chunk_manager.h | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/mongo/s/chunk_manager.cpp b/src/mongo/s/chunk_manager.cpp index 6e3dfe60309..9e075c4724e 100644 --- a/src/mongo/s/chunk_manager.cpp +++ b/src/mongo/s/chunk_manager.cpp @@ -158,7 +158,7 @@ namespace { ShardVersionMap shardVersions; Timer t; - bool success = _load(config, chunkMap, shards, shardVersions, oldManager); + bool success = _load(config, chunkMap, shards, &shardVersions, oldManager); if( success ){ { @@ -201,7 +201,7 @@ namespace { bool ChunkManager::_load(const string& config, ChunkMap& chunkMap, set& shards, - ShardVersionMap& shardVersions, + ShardVersionMap* shardVersions, const ChunkManager* oldManager) { @@ -215,7 +215,7 @@ namespace { // Get the old max version _version = oldManager->getVersion(); // Load a copy of the old versions - shardVersions = oldManager->_shardVersions; + *shardVersions = oldManager->_shardVersions; // Load a copy of the chunk map, replacing the chunk manager with our own const ChunkMap& oldChunkMap = oldManager->getChunkMap(); @@ -243,7 +243,7 @@ namespace { // Attach a diff tracker for the versioned chunk data CMConfigDiffTracker differ( this ); - differ.attach( _ns, chunkMap, _version, shardVersions ); + differ.attach( _ns, chunkMap, _version, *shardVersions ); // Diff tracker should *always* find at least one chunk if collection exists int diffsApplied = differ.calculateConfigDiff(config); @@ -252,9 +252,17 @@ namespace { LOG(2) << "loaded " << diffsApplied << " chunks into new chunk manager for " << _ns << " with version " << _version; - // Add all the shards we find to the shards set - for( ShardVersionMap::iterator it = shardVersions.begin(); it != shardVersions.end(); it++ ){ - shards.insert( it->first ); + // Add all existing shards we find to the shards set + for (ShardVersionMap::iterator it = shardVersions->begin(); + it != shardVersions->end(); + ) { + if (Shard::findIfExists(it->first).ok()) { + shards.insert(it->first); + ++it; + } + else { + shardVersions->erase(it++); + } } return true; @@ -267,7 +275,7 @@ namespace { // Set all our data to empty chunkMap.clear(); - shardVersions.clear(); + shardVersions->clear(); _version = ChunkVersion( 0, 0, OID() ); return true; @@ -291,7 +299,7 @@ namespace { // Set all our data to empty to be extra safe chunkMap.clear(); - shardVersions.clear(); + shardVersions->clear(); _version = ChunkVersion( 0, 0, OID() ); return allInconsistent; diff --git a/src/mongo/s/chunk_manager.h b/src/mongo/s/chunk_manager.h index c15fb7dbaa1..1e57c45d6d5 100644 --- a/src/mongo/s/chunk_manager.h +++ b/src/mongo/s/chunk_manager.h @@ -224,7 +224,7 @@ namespace mongo { bool _load(const std::string& config, ChunkMap& chunks, std::set& shards, - ShardVersionMap& shardVersions, + ShardVersionMap* shardVersions, const ChunkManager* oldManager); static bool _isValid(const ChunkMap& chunks);