diff options
author | Blake Oler <blake.oler@mongodb.com> | 2020-04-06 11:09:36 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-04-06 23:27:50 +0000 |
commit | 6c88549226e8f68f06b19d9e9a1e0b5f756494b0 (patch) | |
tree | 84b0a86115190bb40bff1b7d51406a81945173f9 /src/mongo/s | |
parent | 1467c9ba4781aea4ba1663b469576cfb9a74d57b (diff) | |
download | mongo-6c88549226e8f68f06b19d9e9a1e0b5f756494b0.tar.gz |
SERVER-46845 Allow logging operations to bypass ShardInvalidatedForTargeting exception when accessing shard versions
Diffstat (limited to 'src/mongo/s')
-rw-r--r-- | src/mongo/s/chunk_manager.cpp | 13 | ||||
-rw-r--r-- | src/mongo/s/chunk_manager.h | 17 |
2 files changed, 28 insertions, 2 deletions
diff --git a/src/mongo/s/chunk_manager.cpp b/src/mongo/s/chunk_manager.cpp index aa0eb056623..9e1d8a1ae5e 100644 --- a/src/mongo/s/chunk_manager.cpp +++ b/src/mongo/s/chunk_manager.cpp @@ -431,7 +431,8 @@ bool RoutingTableHistory::compatibleWith(const RoutingTableHistory& other, return other.getVersion(shardName) == getVersion(shardName); } -ChunkVersion RoutingTableHistory::getVersion(const ShardId& shardName) const { +ChunkVersion RoutingTableHistory::_getVersion(const ShardId& shardName, + bool throwOnStaleShard) const { auto it = _shardVersions.find(shardName); if (it == _shardVersions.end()) { // Shards without explicitly tracked shard versions (meaning they have no chunks) always @@ -439,7 +440,7 @@ ChunkVersion RoutingTableHistory::getVersion(const ShardId& shardName) const { return ChunkVersion(0, 0, _collectionVersion.epoch()); } - if (gEnableFinerGrainedCatalogCacheRefresh) { + if (throwOnStaleShard && gEnableFinerGrainedCatalogCacheRefresh) { uassert(ShardInvalidatedForTargetingInfo(_nss), "shard has been marked stale", !it->second.isStale.load()); @@ -448,6 +449,14 @@ ChunkVersion RoutingTableHistory::getVersion(const ShardId& shardName) const { return it->second.shardVersion; } +ChunkVersion RoutingTableHistory::getVersion(const ShardId& shardName) const { + return _getVersion(shardName, true); +} + +ChunkVersion RoutingTableHistory::getVersionForLogging(const ShardId& shardName) const { + return _getVersion(shardName, false); +} + std::string RoutingTableHistory::toString() const { StringBuilder sb; sb << "RoutingTableHistory: " << _nss.ns() << " key: " << _shardKeyPattern.toString() << '\n'; diff --git a/src/mongo/s/chunk_manager.h b/src/mongo/s/chunk_manager.h index d3a67ff1631..6b4f97766ca 100644 --- a/src/mongo/s/chunk_manager.h +++ b/src/mongo/s/chunk_manager.h @@ -144,8 +144,19 @@ public: return _collectionVersion; } + /** + * Retrieves the shard version for the given shard. Will throw a ShardInvalidatedForTargeting + * exception if the shard is marked as stale. + */ ChunkVersion getVersion(const ShardId& shardId) const; + /** + * Retrieves the shard version for the given shard. Will not throw if the shard is marked as + * stale. Only use when logging the given chunk version -- if the caller must execute logic + * based on the returned version, use getVersion() instead. + */ + ChunkVersion getVersionForLogging(const ShardId& shardId) const; + const ChunkInfoMap& getChunkMap() const { return _chunkMap; } @@ -193,6 +204,8 @@ private: */ ShardVersionMap _constructShardVersionMap() const; + ChunkVersion _getVersion(const ShardId& shardName, bool throwOnStaleShard) const; + std::string _extractKeyString(const BSONObj& shardKeyValue) const; // The shard versioning mechanism hinges on keeping track of the number of times we reload @@ -317,6 +330,10 @@ public: return _rt->getVersion(shardId); } + ChunkVersion getVersionForLogging(const ShardId& shardId) const { + return _rt->getVersionForLogging(shardId); + } + ConstRangeOfChunks chunks() const { return {ConstChunkIterator{_rt->getChunkMap().cbegin(), _clusterTime}, ConstChunkIterator{_rt->getChunkMap().cend(), _clusterTime}}; |