diff options
author | Esha Maharishi <esha.maharishi@mongodb.com> | 2017-06-16 16:15:45 -0400 |
---|---|---|
committer | Esha Maharishi <esha.maharishi@mongodb.com> | 2017-06-23 12:07:58 -0400 |
commit | c92405d5051e1b570bfb3d5525cb96c7592baf54 (patch) | |
tree | 3d03d02d88ab7443584e7c341e6fd36fa3f414cb | |
parent | b5cc787bd3d7f5299d8450873343d1363446b1f1 (diff) | |
download | mongo-c92405d5051e1b570bfb3d5525cb96c7592baf54.tar.gz |
SERVER-28418 make the split command on mongod return a stale version error if the requested chunk bounds are not found
-rw-r--r-- | jstests/core/removeb.js | 5 | ||||
-rw-r--r-- | src/mongo/db/s/collection_metadata.cpp | 4 | ||||
-rw-r--r-- | src/mongo/s/commands/cluster_write.cpp | 6 |
3 files changed, 11 insertions, 4 deletions
diff --git a/jstests/core/removeb.js b/jstests/core/removeb.js index 2141e138254..8d049e2439b 100644 --- a/jstests/core/removeb.js +++ b/jstests/core/removeb.js @@ -11,6 +11,9 @@ t.remove({}); // Insert some data. for (i = 0; i < 20000; ++i) { + if (i % 100 == 0) { + print(i + " of first set of 20000 documents inserted"); + } t.insert({a: i}); } @@ -23,7 +26,7 @@ p = startParallelShell( 'for( i = 20000; i < 40000; ++i ) {' + ' db.jstests_removeb.insert( { a:i } );' + ' if (i % 1000 == 0) {' + - ' print( i-20000 + \" of 20000 documents inserted\" );' + + ' print( i-20000 + \" of second set of 20000 documents inserted\" );' + ' }' + '}'); diff --git a/src/mongo/db/s/collection_metadata.cpp b/src/mongo/db/s/collection_metadata.cpp index b18e325adb0..cc650362677 100644 --- a/src/mongo/db/s/collection_metadata.cpp +++ b/src/mongo/db/s/collection_metadata.cpp @@ -220,7 +220,7 @@ Status CollectionMetadata::checkChunkIsValid(const ChunkType& chunk) { ChunkType existingChunk; if (!getNextChunk(chunk.getMin(), &existingChunk)) { - return {ErrorCodes::IncompatibleShardingMetadata, + return {ErrorCodes::StaleShardVersion, str::stream() << "Chunk with bounds " << ChunkRange(chunk.getMin(), chunk.getMax()).toString() << " is not owned by this shard."}; @@ -228,7 +228,7 @@ Status CollectionMetadata::checkChunkIsValid(const ChunkType& chunk) { if (existingChunk.getMin().woCompare(chunk.getMin()) || existingChunk.getMax().woCompare(chunk.getMax())) { - return {ErrorCodes::IncompatibleShardingMetadata, + return {ErrorCodes::StaleShardVersion, str::stream() << "Unable to find chunk with the exact bounds " << ChunkRange(chunk.getMin(), chunk.getMax()).toString() << " at collection version " diff --git a/src/mongo/s/commands/cluster_write.cpp b/src/mongo/s/commands/cluster_write.cpp index 8b8a3f2e644..b17035993d9 100644 --- a/src/mongo/s/commands/cluster_write.cpp +++ b/src/mongo/s/commands/cluster_write.cpp @@ -499,7 +499,11 @@ void updateChunkWriteStatsAndSplitIfNeeded(OperationContext* opCtx, } catch (const DBException& ex) { chunk->randomizeBytesWritten(); - log() << "Unable to auto-split chunk " << redact(chunkRange.toString()) << causedBy(ex); + if (ErrorCodes::isStaleShardingError(ErrorCodes::Error(ex.getCode()))) { + log() << "Unable to auto-split chunk " << redact(chunkRange.toString()) << causedBy(ex) + << ", going to invalidate routing table entry for " << nss; + Grid::get(opCtx)->catalogCache()->invalidateShardedCollection(nss); + } } } |