diff options
Diffstat (limited to 'src/mongo/s')
-rw-r--r-- | src/mongo/s/chunk_version.h | 12 | ||||
-rw-r--r-- | src/mongo/s/chunk_version_test.cpp | 25 |
2 files changed, 37 insertions, 0 deletions
diff --git a/src/mongo/s/chunk_version.h b/src/mongo/s/chunk_version.h index a0d7f09c1db..c655a85b5d1 100644 --- a/src/mongo/s/chunk_version.h +++ b/src/mongo/s/chunk_version.h @@ -31,6 +31,7 @@ #include "mongo/base/status_with.h" #include "mongo/db/jsobj.h" +#include "mongo/util/assert_util.h" namespace mongo { @@ -124,10 +125,21 @@ public: } void incMajor() { + uassert( + 31180, + "The chunk major version has reached its maximum value. Manual intervention will be " + "required before more chunk move, split, or merge operations are allowed.", + majorVersion() != std::numeric_limits<uint32_t>::max()); _combined = static_cast<uint64_t>(majorVersion() + 1) << 32; } void incMinor() { + uassert( + 31181, + "The chunk minor version has reached its maximum value. Manual intervention will be " + "required before more chunk split or merge operations are allowed.", + minorVersion() != std::numeric_limits<uint32_t>::max()); + _combined++; } diff --git a/src/mongo/s/chunk_version_test.cpp b/src/mongo/s/chunk_version_test.cpp index 7b51e5197ce..0e1fd283a48 100644 --- a/src/mongo/s/chunk_version_test.cpp +++ b/src/mongo/s/chunk_version_test.cpp @@ -152,5 +152,30 @@ TEST(ChunkVersionConstruction, CreateWithLargeValues) { ASSERT_EQ(epoch, version.epoch()); } +TEST(ChunkVersionManipulation, ThrowsErrorIfOverflowIsAttemptedForMajorVersion) { + const uint32_t minorVersion = 0; + const uint32_t majorVersion = std::numeric_limits<uint32_t>::max(); + const auto epoch = OID::gen(); + + ChunkVersion version(majorVersion, minorVersion, epoch); + ASSERT_EQ(majorVersion, version.majorVersion()); + ASSERT_EQ(minorVersion, version.minorVersion()); + ASSERT_EQ(epoch, version.epoch()); + + ASSERT_THROWS_CODE(version.incMajor(), DBException, 31180); +} + +TEST(ChunkVersionManipulation, ThrowsErrorIfOverflowIsAttemptedForMinorVersion) { + const uint32_t minorVersion = std::numeric_limits<uint32_t>::max(); + const uint32_t majorVersion = 0; + const auto epoch = OID::gen(); + + ChunkVersion version(majorVersion, minorVersion, epoch); + ASSERT_EQ(majorVersion, version.majorVersion()); + ASSERT_EQ(minorVersion, version.minorVersion()); + ASSERT_EQ(epoch, version.epoch()); + + ASSERT_THROWS_CODE(version.incMinor(), DBException, 31181); +} } // namespace } // namespace mongo |