diff options
author | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2018-09-10 14:15:19 +0100 |
---|---|---|
committer | Kaloian Manassiev <kaloian.manassiev@mongodb.com> | 2018-11-16 07:32:43 -0500 |
commit | 2745f873818a6a1689d8538f2a29f12e221c7af5 (patch) | |
tree | 2bc3f64c468011a150086b1e4b6e4180413d0e30 /src/mongo/db/s | |
parent | 307fb959416370df29fe6e4c64b5ca44de262c2e (diff) | |
download | mongo-2745f873818a6a1689d8538f2a29f12e221c7af5.tar.gz |
SERVER-37051 Check for term change after fetching the queued metadata in ShardServerCatalogCacheLoader
(cherry picked from commit fe8f517a59d694b7577da564d19e4415e13831e8)
Diffstat (limited to 'src/mongo/db/s')
-rw-r--r-- | src/mongo/db/s/shard_server_catalog_cache_loader.cpp | 20 | ||||
-rw-r--r-- | src/mongo/db/s/shard_server_catalog_cache_loader.h | 2 |
2 files changed, 18 insertions, 4 deletions
diff --git a/src/mongo/db/s/shard_server_catalog_cache_loader.cpp b/src/mongo/db/s/shard_server_catalog_cache_loader.cpp index 3dc2366d3eb..52bba0249c9 100644 --- a/src/mongo/db/s/shard_server_catalog_cache_loader.cpp +++ b/src/mongo/db/s/shard_server_catalog_cache_loader.cpp @@ -690,7 +690,21 @@ void ShardServerCatalogCacheLoader::_schedulePrimaryGetChunksSince( swCollectionAndChangedChunks = _getLoaderMetadata(opCtx, nss, catalogCacheSinceVersion, termScheduled); - if (swCollectionAndChangedChunks.isOK()) { + + const auto termAfterRefresh = [&] { + stdx::lock_guard<stdx::mutex> lock(_mutex); + return _term; + }(); + + if (termAfterRefresh != termScheduled) { + // Raising a ConflictingOperationInProgress error here will cause the + // CatalogCache to attempt the refresh as secondary instead of failing the + // operation + swCollectionAndChangedChunks = Status( + ErrorCodes::ConflictingOperationInProgress, + str::stream() << "Replication stepdown occurred during refresh for '" + << nss.toString()); + } else if (swCollectionAndChangedChunks.isOK()) { // After finding metadata remotely, we must have found metadata locally. invariant(!collAndChunks.changedChunks.empty()); } @@ -760,12 +774,12 @@ StatusWith<CollectionAndChangedChunks> ShardServerCatalogCacheLoader::_getLoader OperationContext* opCtx, const NamespaceString& nss, const ChunkVersion& catalogCacheSinceVersion, - const long long term) { + long long expectedTerm) { // Get the enqueued metadata first. Otherwise we could miss data between reading persisted and // enqueued, if an enqueued task finished after the persisted read but before the enqueued read. - auto enqueuedRes = _getEnqueuedMetadata(nss, catalogCacheSinceVersion, term); + auto enqueuedRes = _getEnqueuedMetadata(nss, catalogCacheSinceVersion, expectedTerm); bool tasksAreEnqueued = std::move(enqueuedRes.first); CollectionAndChangedChunks enqueued = std::move(enqueuedRes.second); diff --git a/src/mongo/db/s/shard_server_catalog_cache_loader.h b/src/mongo/db/s/shard_server_catalog_cache_loader.h index 9b4e327caa8..ff246c0666e 100644 --- a/src/mongo/db/s/shard_server_catalog_cache_loader.h +++ b/src/mongo/db/s/shard_server_catalog_cache_loader.h @@ -412,7 +412,7 @@ private: OperationContext* opCtx, const NamespaceString& nss, const ChunkVersion& catalogCacheSinceVersion, - const long long term); + long long expectedTerm); /** * Loads chunk metadata from all in-memory tasks enqueued to update the shard persisted metadata |