diff options
author | Martin Neupauer <martin.neupauer@mongodb.com> | 2018-02-28 17:13:53 -0500 |
---|---|---|
committer | Martin Neupauer <martin.neupauer@mongodb.com> | 2018-03-14 10:15:08 -0400 |
commit | 5b42a86b74380953db29455dc68e133166c81005 (patch) | |
tree | 9ffbeb25cce1ab78308bce7a086d22b90f1f07fe /src/mongo/s/request_types/merge_chunk_request_type.cpp | |
parent | e8f97b7adb06f49c6092b8e3234e658386cd4471 (diff) | |
download | mongo-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.cpp | 30 |
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 |