diff options
Diffstat (limited to 'src/mongo/s')
| -rw-r--r-- | src/mongo/s/chunk_version.h | 8 | ||||
| -rw-r--r-- | src/mongo/s/chunk_version_test.cpp | 21 | ||||
| -rw-r--r-- | src/mongo/s/client/shard_remote.cpp | 10 |
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; } |
