summaryrefslogtreecommitdiff
path: root/src/mongo/s/chunk.cpp
diff options
context:
space:
mode:
authorKaloian Manassiev <kaloian.manassiev@mongodb.com>2016-05-16 15:02:30 -0400
committerKaloian Manassiev <kaloian.manassiev@mongodb.com>2016-05-18 09:48:44 -0400
commit2a06469e1c07c3f9d1618495803c5c6260d21e86 (patch)
tree848ed2896d14c2c0c7cc035bc1e7b6845f13c2e7 /src/mongo/s/chunk.cpp
parent1290f33574da2e129bd3f5471dd06f2e761c74ee (diff)
downloadmongo-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.cpp39
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);
}