summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaloian Manassiev <kaloian.manassiev@mongodb.com>2018-09-10 14:15:19 +0100
committerKaloian Manassiev <kaloian.manassiev@mongodb.com>2018-11-21 03:21:53 -0500
commited7228be701f5435553ae128718e6b7490376b84 (patch)
treeb50e00908565b50030f0f47f5f85adcba1ffcaaa
parent4b62e25620105acde57567dcd5d44ef873ff2c3e (diff)
downloadmongo-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.cpp20
-rw-r--r--src/mongo/db/s/shard_server_catalog_cache_loader.h2
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