StatusWith<boost::optional<MigrateInfo>> BalancerChunkSelectionPolicyImpl::selectSpecificChunkToMove(OperationContext* txn, const ChunkType& chunk) { const NamespaceString nss(chunk.getNS()); auto scopedCMStatus = ScopedChunkManager::getExisting(txn, nss); if (!scopedCMStatus.isOK()) { return scopedCMStatus.getStatus(); } auto scopedCM = std::move(scopedCMStatus.getValue()); ChunkManager* const cm = scopedCM.cm(); auto tagForChunkStatus = Grid::get(txn)->catalogManager(txn)->getTagForChunk(txn, nss.ns(), chunk); if (!tagForChunkStatus.isOK()) { return tagForChunkStatus.getStatus(); } auto shardStatsStatus = _clusterStats->getStats(txn); if (!shardStatsStatus.isOK()) { return shardStatsStatus.getStatus(); } auto collInfo = createCollectionDistributionInfo(shardStatsStatus.getValue(), cm); ShardToChunksMap shardToChunksMap = std::move(std::get<0>(collInfo)); DistributionStatus distStatus(shardStatsStatus.getValue(), shardToChunksMap); const ShardId newShardId(distStatus.getBestReceieverShard(tagForChunkStatus.getValue())); if (newShardId.empty() || newShardId == chunk.getShard()) { return boost::optional<MigrateInfo>(); } return boost::optional<MigrateInfo>{MigrateInfo(nss.ns(), newShardId, chunk)}; }
boost::optional<MigrateInfo> BalancerPolicy::balanceSingleChunk( const ChunkType& chunk, const ShardStatisticsVector& shardStats, const DistributionStatus& distribution) { const string tag = distribution.getTagForChunk(chunk); ShardId newShardId = _getLeastLoadedReceiverShard(shardStats, distribution, tag, {}); if (!newShardId.isValid() || newShardId == chunk.getShard()) { return boost::optional<MigrateInfo>(); } return MigrateInfo(distribution.nss().ns(), newShardId, chunk); }
Chunk::Chunk(OperationContext* txn, ChunkManager* manager, const ChunkType& from) : _manager(manager), _lastmod(from.getVersion()), _dataWritten(mkDataWritten()) { string ns = from.getNS(); _shardId = from.getShard(); verify(_lastmod.isSet()); _min = from.getMin().getOwned(); _max = from.getMax().getOwned(); _jumbo = from.getJumbo(); uassert(10170, "Chunk needs a ns", !ns.empty()); uassert(13327, "Chunk ns must match server ns", ns == _manager->getns()); uassert(10172, "Chunk needs a min", !_min.isEmpty()); uassert(10173, "Chunk needs a max", !_max.isEmpty()); uassert(10171, "Chunk needs a server", grid.shardRegistry()->getShard(txn, _shardId)); }
virtual bool isTracked(const ChunkType& chunk) const { return chunk.getShard() == _currShard; }