summaryrefslogtreecommitdiff
path: root/src/mongo
diff options
context:
space:
mode:
authorKaloian Manassiev <kaloian.manassiev@mongodb.com>2022-04-06 09:18:00 +0200
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-04-12 20:43:19 +0000
commit2de0b94c8a731a43860cb439067a908d465dd384 (patch)
tree2a369c5a73d3ae7023ce7535e7b4ac913b66a4af /src/mongo
parent13845ec84c5ccfbabde4280f778d95637b8495f4 (diff)
downloadmongo-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.cpp8
-rw-r--r--src/mongo/db/s/shardsvr_split_chunk_command.cpp4
-rw-r--r--src/mongo/db/s/split_chunk.cpp34
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