diff options
author | Pierlauro Sciarelli <pierlauro.sciarelli@mongodb.com> | 2021-12-17 16:53:55 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-12-23 17:40:07 +0000 |
commit | ae1292b93bac1075faeacb6b015a8eefb1623b72 (patch) | |
tree | 5c51b4d345b1faa7326ddc24c50f45846904662c | |
parent | c5051f95ad9813b80b9fc3e26ba79f94a610cfe2 (diff) | |
download | mongo-ae1292b93bac1075faeacb6b015a8eefb1623b72.tar.gz |
SERVER-61003 ReadConcernMajorityNotAvailableYet errors from ShardRegistry must be retried
-rw-r--r-- | src/mongo/s/client/shard_registry.cpp | 29 | ||||
-rw-r--r-- | src/mongo/s/client/shard_registry.h | 2 |
2 files changed, 28 insertions, 3 deletions
diff --git a/src/mongo/s/client/shard_registry.cpp b/src/mongo/s/client/shard_registry.cpp index eb7b18671de..a1195844572 100644 --- a/src/mongo/s/client/shard_registry.cpp +++ b/src/mongo/s/client/shard_registry.cpp @@ -46,7 +46,9 @@ #include "mongo/s/catalog/sharding_catalog_client.h" #include "mongo/s/catalog/type_shard.h" #include "mongo/s/grid.h" +#include "mongo/util/future_util.h" #include "mongo/util/str.h" +#include "mongo/util/testing_proctor.h" namespace mongo { @@ -63,6 +65,7 @@ bool useActualTopologyTime() { serverGlobalParams.featureCompatibility.isGreaterThanOrEqualTo( ServerGlobalParams::FeatureCompatibility::Version::kVersion47); } +const Backoff kExponentialBackoff(Seconds(1), Milliseconds::max()); } // namespace @@ -285,9 +288,6 @@ void ShardRegistry::_periodicReload(const CallbackArgs& cbArgs) { try { reload(opCtx.get()); } catch (const DBException& e) { - if (e.code() == ErrorCodes::ReadConcernMajorityNotAvailableYet) { - refreshPeriod = Seconds(1); - } LOGV2(22727, "Error running periodic reload of shard registry caused by {error}; will retry after " "{shardRegistryReloadInterval}", @@ -454,6 +454,29 @@ void ShardRegistry::toBSON(BSONObjBuilder* result) const { } void ShardRegistry::reload(OperationContext* opCtx) { + if (MONGO_unlikely(TestingProctor::instance().isEnabled())) { + // TODO SERVER-62152 investigate hang on reload in unit tests + // Some unit tests don't support running the reload's AsyncTry on the fixed executor. + _reloadInternal(opCtx); + } else { + AsyncTry([=]() mutable { + ThreadClient tc("ShardRegistry::reload", getGlobalServiceContext()); + auto opCtx = tc->makeOperationContext(); + + _reloadInternal(opCtx.get()); + }) + .until([](Status status) mutable { + return status != ErrorCodes::ReadConcernMajorityNotAvailableYet; + }) + .withBackoffBetweenIterations(kExponentialBackoff) + .on(Grid::get(opCtx)->getExecutorPool()->getFixedExecutor(), + CancellationToken::uncancelable()) + .semi() + .get(opCtx); + } +} + +void ShardRegistry::_reloadInternal(OperationContext* opCtx) { // Make the next acquire do a lookup. auto value = _forceReloadIncrement.addAndFetch(1); LOGV2_DEBUG(4620253, 2, "Forcing ShardRegistry reload", "newForceReloadIncrement"_attr = value); diff --git a/src/mongo/s/client/shard_registry.h b/src/mongo/s/client/shard_registry.h index d4f98846d4a..fa241007731 100644 --- a/src/mongo/s/client/shard_registry.h +++ b/src/mongo/s/client/shard_registry.h @@ -440,6 +440,8 @@ private: void _periodicReload(const executor::TaskExecutor::CallbackArgs& cbArgs); + void _reloadInternal(OperationContext* opCtx); + /** * Factory to create shards. Never changed after startup so safe to access outside of _mutex. */ |