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)};
}
Пример #2
0
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);
}
Пример #3
0
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));
}
Пример #4
0
 virtual bool isTracked(const ChunkType& chunk) const {
     return chunk.getShard() == _currShard;
 }