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.h8
-rw-r--r--src/mongo/s/chunk_version_test.cpp21
-rw-r--r--src/mongo/s/client/shard_remote.cpp10
3 files changed, 31 insertions, 8 deletions
diff --git a/src/mongo/s/chunk_version.h b/src/mongo/s/chunk_version.h
index 05517ffb609..54c1ca4f576 100644
--- a/src/mongo/s/chunk_version.h
+++ b/src/mongo/s/chunk_version.h
@@ -59,7 +59,7 @@ public:
ChunkVersion() : _combined(0), _epoch(OID()) {}
- ChunkVersion(int major, int minor, const OID& epoch)
+ ChunkVersion(uint32_t major, uint32_t minor, const OID& epoch)
: _combined(static_cast<uint64_t>(minor) | (static_cast<uint64_t>(major) << 32)),
_epoch(epoch) {}
@@ -148,12 +148,12 @@ public:
return _combined > 0;
}
- int majorVersion() const {
+ uint32_t majorVersion() const {
return _combined >> 32;
}
- int minorVersion() const {
- return _combined & 0xFFFF;
+ uint32_t minorVersion() const {
+ return _combined & 0xFFFFFFFF;
}
OID epoch() const {
diff --git a/src/mongo/s/chunk_version_test.cpp b/src/mongo/s/chunk_version_test.cpp
index 4bea7f466bd..51c7f9d1cf5 100644
--- a/src/mongo/s/chunk_version_test.cpp
+++ b/src/mongo/s/chunk_version_test.cpp
@@ -28,6 +28,8 @@
#include "mongo/platform/basic.h"
+#include <limits>
+
#include "mongo/db/jsobj.h"
#include "mongo/s/chunk_version.h"
#include "mongo/unittest/unittest.h"
@@ -44,16 +46,16 @@ TEST(Parsing, EpochIsOptional) {
ASSERT(canParse);
ASSERT(chunkVersionComplete.epoch().isSet());
ASSERT(chunkVersionComplete.epoch() == oid);
- ASSERT_EQ(2, chunkVersionComplete.majorVersion());
- ASSERT_EQ(3, chunkVersionComplete.minorVersion());
+ ASSERT_EQ(2u, chunkVersionComplete.majorVersion());
+ ASSERT_EQ(3u, chunkVersionComplete.minorVersion());
canParse = false;
ChunkVersion chunkVersionNoEpoch =
ChunkVersion::fromBSON(BSON("lastmod" << Timestamp(Seconds(3), 4)), "lastmod", &canParse);
ASSERT(canParse);
ASSERT(!chunkVersionNoEpoch.epoch().isSet());
- ASSERT_EQ(3, chunkVersionNoEpoch.majorVersion());
- ASSERT_EQ(4, chunkVersionNoEpoch.minorVersion());
+ ASSERT_EQ(3u, chunkVersionNoEpoch.majorVersion());
+ ASSERT_EQ(4u, chunkVersionNoEpoch.minorVersion());
}
TEST(Comparison, StrictEqual) {
@@ -83,5 +85,16 @@ TEST(Comparison, OlderThan) {
ASSERT(!ChunkVersion(3, 1, epoch).isOlderThan(ChunkVersion(3, 1, epoch)));
}
+TEST(ChunkVersionConstruction, CreateWithLargeValues) {
+ const auto minorVersion = std::numeric_limits<uint32_t>::max();
+ const uint32_t majorVersion = 1 << 24;
+ 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());
+}
+
} // unnamed namespace
} // namespace mongo
diff --git a/src/mongo/s/client/shard_remote.cpp b/src/mongo/s/client/shard_remote.cpp
index 1e0ea51ed4b..00c9141f2d6 100644
--- a/src/mongo/s/client/shard_remote.cpp
+++ b/src/mongo/s/client/shard_remote.cpp
@@ -44,6 +44,7 @@
#include "mongo/db/operation_context.h"
#include "mongo/db/query/query_request.h"
#include "mongo/db/repl/read_concern_args.h"
+#include "mongo/db/server_parameters.h"
#include "mongo/executor/task_executor_pool.h"
#include "mongo/rpc/get_status_from_command_result.h"
#include "mongo/rpc/metadata/repl_set_metadata.h"
@@ -72,6 +73,11 @@ const BSONObj kReplMetadata(BSON(rpc::kReplSetMetadataFieldName << 1));
// Allow the command to be executed on a secondary (see ServerSelectionMetadata).
const BSONObj kSecondaryOkMetadata{rpc::ServerSelectionMetadata(true, boost::none).toBSON()};
+constexpr bool internalProhibitShardOperationRetryByDefault = false;
+MONGO_EXPORT_SERVER_PARAMETER(internalProhibitShardOperationRetry,
+ bool,
+ internalProhibitShardOperationRetryByDefault);
+
/**
* Returns a new BSONObj describing the same command and arguments as 'cmdObj', but with maxTimeMS
* replaced by maxTimeMSOverride (or removed if maxTimeMSOverride is Milliseconds::max()).
@@ -104,6 +110,10 @@ ShardRemote::ShardRemote(const ShardId& id,
ShardRemote::~ShardRemote() = default;
bool ShardRemote::isRetriableError(ErrorCodes::Error code, RetryPolicy options) {
+ if (internalProhibitShardOperationRetry.load()) {
+ return false;
+ }
+
if (options == RetryPolicy::kNoRetry) {
return false;
}