diff options
author | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2022-04-06 09:18:00 +0200 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-04-12 20:43:19 +0000 |
commit | 2de0b94c8a731a43860cb439067a908d465dd384 (patch) | |
tree | 2a369c5a73d3ae7023ce7535e7b4ac913b66a4af /src/mongo | |
parent | 13845ec84c5ccfbabde4280f778d95637b8495f4 (diff) | |
download | mongo-2de0b94c8a731a43860cb439067a908d465dd384.tar.gz |
SERVER-65204 Remove usages of StaleEpoch from the split's shard role path
Diffstat (limited to 'src/mongo')
-rw-r--r-- | src/mongo/db/s/shardsvr_merge_chunks_command.cpp | 8 | ||||
-rw-r--r-- | src/mongo/db/s/shardsvr_split_chunk_command.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/s/split_chunk.cpp | 34 |
3 files changed, 31 insertions, 15 deletions
diff --git a/src/mongo/db/s/shardsvr_merge_chunks_command.cpp b/src/mongo/db/s/shardsvr_merge_chunks_command.cpp index ad01a1865ad..8c5086a6ae8 100644 --- a/src/mongo/db/s/shardsvr_merge_chunks_command.cpp +++ b/src/mongo/db/s/shardsvr_merge_chunks_command.cpp @@ -144,9 +144,6 @@ void mergeChunks(OperationContext* opCtx, auto cmdResponse = commitMergeOnConfigServer( opCtx, nss, expectedEpoch, expectedTimestamp, chunkRange, metadataBeforeMerge); - uassertStatusOKWithContext(cmdResponse.commandStatus, "Failed to commit chunk merge"); - uassertStatusOKWithContext(cmdResponse.writeConcernStatus, "Failed to commit chunk merge"); - auto shardVersionReceived = [&]() -> boost::optional<ChunkVersion> { // Old versions might not have the shardVersion field if (cmdResponse.response[ChunkVersion::kShardVersionField]) { @@ -156,11 +153,14 @@ void mergeChunks(OperationContext* opCtx, return boost::none; }(); onShardVersionMismatch(opCtx, nss, std::move(shardVersionReceived)); + + uassertStatusOKWithContext(cmdResponse.commandStatus, "Failed to commit chunk merge"); + uassertStatusOKWithContext(cmdResponse.writeConcernStatus, "Failed to commit chunk merge"); } class MergeChunksCommand : public ErrmsgCommandDeprecated { public: - MergeChunksCommand() : ErrmsgCommandDeprecated("mergeChunks") {} + MergeChunksCommand() : ErrmsgCommandDeprecated("mergeChunks", "_shardsvrMergeChunks") {} std::string help() const override { return "Internal command to merge a contiguous range of chunks.\n" diff --git a/src/mongo/db/s/shardsvr_split_chunk_command.cpp b/src/mongo/db/s/shardsvr_split_chunk_command.cpp index dea40abcb4e..a929c7ec2f6 100644 --- a/src/mongo/db/s/shardsvr_split_chunk_command.cpp +++ b/src/mongo/db/s/shardsvr_split_chunk_command.cpp @@ -29,8 +29,6 @@ #define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kSharding -#include "mongo/platform/basic.h" - #include <string> #include <vector> @@ -53,7 +51,7 @@ namespace { class SplitChunkCommand : public ErrmsgCommandDeprecated { public: - SplitChunkCommand() : ErrmsgCommandDeprecated("splitChunk") {} + SplitChunkCommand() : ErrmsgCommandDeprecated("splitChunk", "_shardsvrSplitChunk") {} std::string help() const override { return "internal command usage only\n" diff --git a/src/mongo/db/s/split_chunk.cpp b/src/mongo/db/s/split_chunk.cpp index 6ac4cf2620a..3ea599847ef 100644 --- a/src/mongo/db/s/split_chunk.cpp +++ b/src/mongo/db/s/split_chunk.cpp @@ -29,8 +29,6 @@ #define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kSharding -#include "mongo/platform/basic.h" - #include "mongo/db/s/split_chunk.h" #include "mongo/base/status_with.h" @@ -95,17 +93,38 @@ bool checkIfSingleDoc(OperationContext* opCtx, */ bool checkMetadataForSuccessfulSplitChunk(OperationContext* opCtx, const NamespaceString& nss, - const OID& epoch, + const OID& expectedEpoch, const boost::optional<Timestamp>& expectedTimestamp, const ChunkRange& chunkRange, const std::vector<BSONObj>& splitPoints) { - AutoGetCollection autoColl(opCtx, nss, MODE_IS); + // DBLock and CollectionLock must be used in order to avoid shard version checks + Lock::DBLock dbLock(opCtx, nss.db(), MODE_IS); + Lock::CollectionLock collLock(opCtx, nss, MODE_IS); + const auto metadataAfterSplit = CollectionShardingRuntime::get(opCtx, nss)->getCurrentMetadataIfKnown(); - uassert(ErrorCodes::StaleEpoch, + ShardId shardId = ShardingState::get(opCtx)->shardId(); + + uassert(StaleConfigInfo(nss, + ChunkVersion::IGNORED() /* receivedVersion */, + boost::none /* wantedVersion */, + shardId), + str::stream() << "Collection " << nss.ns() << " needs to be recovered", + metadataAfterSplit); + uassert(StaleConfigInfo(nss, + ChunkVersion::IGNORED() /* receivedVersion */, + ChunkVersion::UNSHARDED() /* wantedVersion */, + shardId), + str::stream() << "Collection " << nss.ns() << " is not sharded", + metadataAfterSplit->isSharded()); + const auto epoch = metadataAfterSplit->getShardVersion().epoch(); + uassert(StaleConfigInfo(nss, + ChunkVersion::IGNORED() /* receivedVersion */, + metadataAfterSplit->getShardVersion() /* wantedVersion */, + shardId), str::stream() << "Collection " << nss.ns() << " changed since split start", - metadataAfterSplit && metadataAfterSplit->getShardVersion().epoch() == epoch && + epoch == expectedEpoch && (!expectedTimestamp || metadataAfterSplit->getShardVersion().getTimestamp() == expectedTimestamp)); @@ -230,6 +249,7 @@ StatusWith<boost::optional<ChunkRange>> splitChunk( } const Shard::CommandResponse& cmdResponse = cmdResponseStatus.getValue(); + boost::optional<ChunkVersion> shardVersionReceived = [&]() -> boost::optional<ChunkVersion> { // old versions might not have the shardVersion field if (cmdResponse.response[ChunkVersion::kShardVersionField]) { @@ -238,8 +258,6 @@ StatusWith<boost::optional<ChunkRange>> splitChunk( } return boost::none; }(); - - // Always refresh metadata and provide the chunk version onShardVersionMismatch(opCtx, nss, shardVersionReceived); // Check commandStatus and writeConcernStatus |