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-21 03:21:53 -0500 |
commit | ed7228be701f5435553ae128718e6b7490376b84 (patch) | |
tree | b50e00908565b50030f0f47f5f85adcba1ffcaaa | |
parent | 4b62e25620105acde57567dcd5d44ef873ff2c3e (diff) | |
download | mongo-ed7228be701f5435553ae128718e6b7490376b84.tar.gz |
SERVER-37051 Check for term change after fetching the queued metadata in ShardServerCatalogCacheLoader
(cherry picked from commit fe8f517a59d694b7577da564d19e4415e13831e8)
(cherry picked from commit 2745f873818a6a1689d8538f2a29f12e221c7af5)
-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 7855f461db4..3334e0112bd 100644 --- a/src/mongo/db/s/shard_server_catalog_cache_loader.cpp +++ b/src/mongo/db/s/shard_server_catalog_cache_loader.cpp @@ -529,7 +529,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()); } @@ -550,12 +564,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 54082634b99..e18ef74253b 100644 --- a/src/mongo/db/s/shard_server_catalog_cache_loader.h +++ b/src/mongo/db/s/shard_server_catalog_cache_loader.h @@ -279,7 +279,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 |