diff options
author | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2016-05-16 15:02:30 -0400 |
---|---|---|
committer | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2016-05-18 09:48:44 -0400 |
commit | 2a06469e1c07c3f9d1618495803c5c6260d21e86 (patch) | |
tree | 848ed2896d14c2c0c7cc035bc1e7b6845f13c2e7 /src/mongo/s/chunk.cpp | |
parent | 1290f33574da2e129bd3f5471dd06f2e761c74ee (diff) | |
download | mongo-2a06469e1c07c3f9d1618495803c5c6260d21e86.tar.gz |
SERVER-24167 ChunkType should generate the chunk's _id
This change removes the name field for the ChunkType metadata object in place of using the namespace and minKey directly.
Diffstat (limited to 'src/mongo/s/chunk.cpp')
-rw-r--r-- | src/mongo/s/chunk.cpp | 39 |
1 files changed, 27 insertions, 12 deletions
diff --git a/src/mongo/s/chunk.cpp b/src/mongo/s/chunk.cpp index f3d53346825..5e81999afe7 100644 --- a/src/mongo/s/chunk.cpp +++ b/src/mongo/s/chunk.cpp @@ -44,6 +44,7 @@ #include "mongo/s/client/shard_registry.h" #include "mongo/s/grid.h" #include "mongo/s/shard_util.h" +#include "mongo/s/sharding_raii.h" #include "mongo/util/log.h" namespace mongo { @@ -299,7 +300,7 @@ bool Chunk::splitIfShould(OperationContext* txn, long dataWritten) { try { _dataWritten += dataWritten; - uint64_t splitThreshold = getManager()->getCurrentDesiredChunkSize(); + uint64_t splitThreshold = _manager->getCurrentDesiredChunkSize(); if (_minIsInf() || _maxIsInf()) { splitThreshold = static_cast<uint64_t>((double)splitThreshold * 0.9); } @@ -308,12 +309,12 @@ bool Chunk::splitIfShould(OperationContext* txn, long dataWritten) { return false; } - if (!getManager()->_splitHeuristics._splitTickets.tryAcquire()) { - LOG(1) << "won't auto split because not enough tickets: " << getManager()->getns(); + if (!_manager->_splitHeuristics._splitTickets.tryAcquire()) { + LOG(1) << "won't auto split because not enough tickets: " << _manager->getns(); return false; } - TicketHolderReleaser releaser(&(getManager()->_splitHeuristics._splitTickets)); + TicketHolderReleaser releaser(&(_manager->_splitHeuristics._splitTickets)); LOG(1) << "about to initiate autosplit: " << *this << " dataWritten: " << _dataWritten << " splitThreshold: " << splitThreshold; @@ -335,13 +336,15 @@ bool Chunk::splitIfShould(OperationContext* txn, long dataWritten) { _dataWritten = 0; } - Status refreshStatus = Grid::get(txn)->getBalancerConfiguration()->refreshAndCheck(txn); + const auto balancerConfig = Grid::get(txn)->getBalancerConfiguration(); + + Status refreshStatus = balancerConfig->refreshAndCheck(txn); if (!refreshStatus.isOK()) { warning() << "Unable to refresh balancer settings" << causedBy(refreshStatus); return false; } - bool shouldBalance = Grid::get(txn)->getBalancerConfiguration()->isBalancerActive(); + bool shouldBalance = balancerConfig->isBalancerActive(); if (shouldBalance) { auto collStatus = grid.catalogManager(txn)->getCollection(txn, _manager->getns()); if (!collStatus.isOK()) { @@ -365,14 +368,26 @@ bool Chunk::splitIfShould(OperationContext* txn, long dataWritten) { // spot from staying on a single shard. This is based on the assumption that succeeding // inserts will fall on the top chunk. if (suggestedMigrateChunk && shouldBalance) { + const NamespaceString nss(_manager->getns()); + + // We need to use the latest chunk manager (after the split) in order to have the most + // up-to-date view of the chunk we are about to move + auto scopedCM = uassertStatusOK(ScopedChunkManager::getExisting(txn, nss)); + auto suggestedChunk = + scopedCM.cm()->findIntersectingChunk(txn, suggestedMigrateChunk->getMin()); + ChunkType chunkToMove; - chunkToMove.setNS(_manager->getns()); - chunkToMove.setShard(getShardId()); - chunkToMove.setMin(suggestedMigrateChunk->getMin()); - chunkToMove.setMax(suggestedMigrateChunk->getMax()); + chunkToMove.setNS(nss.ns()); + chunkToMove.setShard(suggestedChunk->getShardId()); + chunkToMove.setMin(suggestedChunk->getMin()); + chunkToMove.setMax(suggestedChunk->getMax()); + chunkToMove.setVersion(suggestedChunk->getLastmod()); + + Status rebalanceStatus = Balancer::get(txn)->rebalanceSingleChunk(txn, chunkToMove); + if (!rebalanceStatus.isOK()) { + msgassertedNoTraceWithStatus(10412, rebalanceStatus); + } - msgassertedNoTraceWithStatus( - 10412, Balancer::get(txn)->rebalanceSingleChunk(txn, chunkToMove)); _manager->reload(txn); } |