summaryrefslogtreecommitdiff
path: root/src/mongo/db/s
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-16 07:32:43 -0500
commit2745f873818a6a1689d8538f2a29f12e221c7af5 (patch)
tree2bc3f64c468011a150086b1e4b6e4180413d0e30 /src/mongo/db/s
parent307fb959416370df29fe6e4c64b5ca44de262c2e (diff)
downloadmongo-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.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 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