summaryrefslogtreecommitdiff
path: root/src/mongo/s
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/s')
-rw-r--r--src/mongo/s/chunk_version.h12
-rw-r--r--src/mongo/s/chunk_version_test.cpp25
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