StatusWith<MigrateInfoVector> BalancerChunkSelectionPolicyImpl::selectChunksToMove( OperationContext* opCtx) { auto shardStatsStatus = _clusterStats->getStats(opCtx); if (!shardStatsStatus.isOK()) { return shardStatsStatus.getStatus(); } const auto shardStats = std::move(shardStatsStatus.getValue()); if (shardStats.size() < 2) { return MigrateInfoVector{}; } auto swCollections = Grid::get(opCtx)->catalogClient()->getCollections(opCtx, nullptr, nullptr); if (!swCollections.isOK()) { return swCollections.getStatus(); } auto& collections = swCollections.getValue(); if (collections.empty()) { return MigrateInfoVector{}; } MigrateInfoVector candidateChunks; std::set<ShardId> usedShards; std::shuffle(collections.begin(), collections.end(), _random); for (const auto& coll : collections) { if (coll.getDropped()) { continue; } const NamespaceString nss(coll.getNs()); if (!coll.getAllowBalance()) { LOG(1) << "Not balancing collection " << nss << "; explicitly disabled."; continue; } auto candidatesStatus = _getMigrateCandidatesForCollection(opCtx, nss, shardStats, &usedShards); if (candidatesStatus == ErrorCodes::NamespaceNotFound) { // Namespace got dropped before we managed to get to it, so just skip it continue; } else if (!candidatesStatus.isOK()) { warning() << "Unable to balance collection " << nss.ns() << causedBy(candidatesStatus.getStatus()); continue; } candidateChunks.insert(candidateChunks.end(), std::make_move_iterator(candidatesStatus.getValue().begin()), std::make_move_iterator(candidatesStatus.getValue().end())); } return candidateChunks; }
StatusWith<MigrateInfoVector> BalancerChunkSelectionPolicyImpl::selectChunksToMove( OperationContext* txn, bool aggressiveBalanceHint) { auto shardStatsStatus = _clusterStats->getStats(txn); if (!shardStatsStatus.isOK()) { return shardStatsStatus.getStatus(); } const auto shardStats = std::move(shardStatsStatus.getValue()); if (shardStats.size() < 2) { return MigrateInfoVector{}; } vector<CollectionType> collections; Status collsStatus = Grid::get(txn)->catalogClient(txn)->getCollections(txn, nullptr, &collections, nullptr); if (!collsStatus.isOK()) { return collsStatus; } if (collections.empty()) { return MigrateInfoVector{}; } MigrateInfoVector candidateChunks; for (const auto& coll : collections) { const NamespaceString nss(coll.getNs()); if (!coll.getAllowBalance()) { LOG(1) << "Not balancing collection " << nss << "; explicitly disabled."; continue; } auto candidatesStatus = _getMigrateCandidatesForCollection(txn, nss, shardStats, aggressiveBalanceHint); if (candidatesStatus == ErrorCodes::NamespaceNotFound) { // Namespace got dropped before we managed to get to it, so just skip it continue; } else if (!candidatesStatus.isOK()) { warning() << "Unable to balance collection " << nss.ns() << causedBy(candidatesStatus.getStatus()); continue; } candidateChunks.insert(candidateChunks.end(), std::make_move_iterator(candidatesStatus.getValue().begin()), std::make_move_iterator(candidatesStatus.getValue().end())); } return candidateChunks; }