summaryrefslogtreecommitdiff
path: root/src/mongo/s/request_types/merge_chunk_request_type.cpp
diff options
context:
space:
mode:
authorMartin Neupauer <martin.neupauer@mongodb.com>2018-02-28 17:13:53 -0500
committerMartin Neupauer <martin.neupauer@mongodb.com>2018-03-14 10:15:08 -0400
commit5b42a86b74380953db29455dc68e133166c81005 (patch)
tree9ffbeb25cce1ab78308bce7a086d22b90f1f07fe /src/mongo/s/request_types/merge_chunk_request_type.cpp
parente8f97b7adb06f49c6092b8e3234e658386cd4471 (diff)
downloadmongo-5b42a86b74380953db29455dc68e133166c81005.tar.gz
SERVER-33455 SERVER-33452 - Add history to the chunk type and update move/split/merge methods.
The Chunk type has an array of the past history that we maintain in the sharding manager. When a chunk is moved we add a new entry to the history, the chunk split copies the history to new chunks and finally the merge drops any previous history and creates only the latest entry.
Diffstat (limited to 'src/mongo/s/request_types/merge_chunk_request_type.cpp')
-rw-r--r--src/mongo/s/request_types/merge_chunk_request_type.cpp30
1 files changed, 25 insertions, 5 deletions
diff --git a/src/mongo/s/request_types/merge_chunk_request_type.cpp b/src/mongo/s/request_types/merge_chunk_request_type.cpp
index 64200b85460..abace857a99 100644
--- a/src/mongo/s/request_types/merge_chunk_request_type.cpp
+++ b/src/mongo/s/request_types/merge_chunk_request_type.cpp
@@ -40,17 +40,19 @@ const char kConfigsvrMergeChunk[] = "_configsvrCommitChunkMerge";
const char kCollEpoch[] = "collEpoch";
const char kChunkBoundaries[] = "chunkBoundaries";
const char kShardName[] = "shard";
-
+const char kValidAfter[] = "validAfter";
} // namespace
MergeChunkRequest::MergeChunkRequest(NamespaceString nss,
std::string shardName,
OID epoch,
- std::vector<BSONObj> chunkBoundaries)
+ std::vector<BSONObj> chunkBoundaries,
+ boost::optional<Timestamp> validAfter)
: _nss(std::move(nss)),
_epoch(std::move(epoch)),
_chunkBoundaries(std::move(chunkBoundaries)),
- _shardName(std::move(shardName)) {}
+ _shardName(std::move(shardName)),
+ _validAfter(validAfter) {}
StatusWith<MergeChunkRequest> MergeChunkRequest::parseFromConfigCommand(const BSONObj& cmdObj) {
std::string ns;
@@ -103,8 +105,24 @@ StatusWith<MergeChunkRequest> MergeChunkRequest::parseFromConfigCommand(const BS
}
}
- return MergeChunkRequest(
- std::move(nss), std::move(shardName), std::move(epoch), std::move(chunkBoundaries));
+ boost::optional<Timestamp> validAfter = boost::none;
+ {
+ Timestamp ts{0};
+ auto status = bsonExtractTimestampField(cmdObj, kValidAfter, &ts);
+ if (!status.isOK() && status != ErrorCodes::NoSuchKey) {
+ return status;
+ }
+
+ if (status.isOK()) {
+ validAfter = ts;
+ }
+ }
+
+ return MergeChunkRequest(std::move(nss),
+ std::move(shardName),
+ std::move(epoch),
+ std::move(chunkBoundaries),
+ validAfter);
}
BSONObj MergeChunkRequest::toConfigCommandBSON(const BSONObj& writeConcern) {
@@ -127,6 +145,8 @@ void MergeChunkRequest::appendAsConfigCommand(BSONObjBuilder* cmdBuilder) {
}
}
cmdBuilder->append(kShardName, _shardName);
+ invariant(_validAfter.is_initialized());
+ cmdBuilder->append(kValidAfter, _validAfter.get());
}
} // namespace mongo