diff options
Diffstat (limited to 'src/mongo/s/chunk_manager.cpp')
-rw-r--r-- | src/mongo/s/chunk_manager.cpp | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/mongo/s/chunk_manager.cpp b/src/mongo/s/chunk_manager.cpp index a5013d91264..2d1e8b6e846 100644 --- a/src/mongo/s/chunk_manager.cpp +++ b/src/mongo/s/chunk_manager.cpp @@ -772,6 +772,36 @@ RoutingTableHistory RoutingTableHistory::makeUpdated( std::move(chunkMap)); } +RoutingTableHistory RoutingTableHistory::makeUpdatedReplacingTimestamp( + const boost::optional<Timestamp>& timestamp) const { + invariant(getVersion().getTimestamp().is_initialized() != timestamp.is_initialized()); + + ChunkMap newMap(getVersion().epoch(), timestamp, _chunkMap.size()); + _chunkMap.forEach([&](const std::shared_ptr<ChunkInfo>& chunkInfo) { + const ChunkVersion oldVersion = chunkInfo->getLastmod(); + newMap.appendChunk(std::make_shared<ChunkInfo>(chunkInfo->getRange(), + chunkInfo->getMaxKeyString(), + chunkInfo->getShardId(), + ChunkVersion(oldVersion.minorVersion(), + oldVersion.majorVersion(), + oldVersion.epoch(), + timestamp), + chunkInfo->getHistory(), + chunkInfo->isJumbo(), + chunkInfo->getWritesTracker())); + return true; + }); + + return RoutingTableHistory(_nss, + _uuid, + getShardKeyPattern().getKeyPattern(), + CollatorInterface::cloneCollator(getDefaultCollator()), + _unique, + _reshardingFields, + _allowMigrations, + std::move(newMap)); +} + AtomicWord<uint64_t> ComparableChunkVersion::_epochDisambiguatingSequenceNumSource{1ULL}; AtomicWord<uint64_t> ComparableChunkVersion::_forcedRefreshSequenceNumSource{1ULL}; @@ -788,6 +818,13 @@ ComparableChunkVersion ComparableChunkVersion::makeComparableChunkVersionForForc _epochDisambiguatingSequenceNumSource.fetchAndAdd(1)); } +ComparableChunkVersion ComparableChunkVersion::makeComparableChunkVersionForForcedRefresh( + const ChunkVersion& version) { + return ComparableChunkVersion(_forcedRefreshSequenceNumSource.addAndFetch(1), + version, + _epochDisambiguatingSequenceNumSource.fetchAndAdd(1)); +} + BSONObj ComparableChunkVersion::toBSONForLogging() const { BSONObjBuilder builder; if (_chunkVersion) |