diff --git a/src/mongo/client/replica_set_monitor.cpp b/src/mongo/client/replica_set_monitor.cpp index 1df2e9f..635471d 100644 --- a/src/mongo/client/replica_set_monitor.cpp +++ b/src/mongo/client/replica_set_monitor.cpp @@ -76,7 +76,8 @@ const double socketTimeoutSecs = 5; // Intentionally chosen to compare worse than all known latencies. const int64_t unknownLatency = numeric_limits::max(); -const ReadPreferenceSetting kPrimaryOnlyReadPreference(ReadPreference::PrimaryOnly, TagSet()); +// AVID FIX. ReadPreference::PrimaryOnly -> ReadPreference::PrimaryPreferred +const ReadPreferenceSetting kPrimaryOnlyReadPreference(ReadPreference::PrimaryPreferred, TagSet()); const Milliseconds kFindHostMaxBackOffTime(500); // TODO: Move to ReplicaSetMonitorManager ************************************************************************************************* diff --git a/src/mongo/db/server_options.h b/src/mongo/db/server_options.h index fee65aa..fc0a7e8 100644 --- a/src/mongo/db/server_options.h +++ b/src/mongo/db/server_options.h @@ -57,6 +57,7 @@ struct ServerGlobalParams { maxConns(DEFAULT_MAX_CONN), unixSocketPermissions(DEFAULT_UNIX_PERMS), logAppend(false), + allowInconsistentConfigReads(false), logRenameOnRotate(true), logWithSyslog(false), isHttpInterfaceEnabled(false) { @@ -105,6 +106,9 @@ struct ServerGlobalParams { std::string logpath; // Path to log file, if logging to a file; otherwise, empty. bool logAppend; // True if logging to a file in append mode. + + // AVID FIX. Add param to allow read from Local Single Config node + bool allowInconsistentConfigReads = false; // True if specified. bool logRenameOnRotate; // True if logging should rename log files on rotate bool logWithSyslog; // True if logging to syslog; must not be set if logpath is set. int syslogFacility; // Facility used when appending messages to the syslog. ************************************************************************************************* diff --git a/src/mongo/db/server_options_helpers.cpp b/src/mongo/db/server_options_helpers.cpp index e538d2d..c64e7ec 100644 --- a/src/mongo/db/server_options_helpers.cpp +++ b/src/mongo/db/server_options_helpers.cpp @@ -245,6 +245,13 @@ Status addGeneralServerOptions(moe::OptionSection* options) { "syslog facility used for mongodb syslog message"); #endif // _WIN32 + + // AVID FIX. Add param to allow read from Local Single Config node + options->addOptionChaining("allowInconsistentConfigReads", + "allowInconsistentConfigReads", + moe::Switch, + "allow Secondary Read Pref from config servers"); + options->addOptionChaining("systemLog.logAppend", "logappend", moe::Switch, @@ -920,6 +927,10 @@ Status storeServerOptions(const moe::Environment& params, const std::vector() == true) { + serverGlobalParams.allowInconsistentConfigReads = true; + } + if (params.count("systemLog.logRotate")) { std::string logRotateParam = params["systemLog.logRotate"].as(); if (logRotateParam == "reopen") { ************************************************************************************************* diff --git a/src/mongo/s/client/shard_registry.cpp b/src/mongo/s/client/shard_registry.cpp index 739348e..90111a1 100644 --- a/src/mongo/s/client/shard_registry.cpp +++ b/src/mongo/s/client/shard_registry.cpp @@ -569,8 +569,9 @@ StatusWith ShardRegistry::_exhaustiveFindOnConfig( BSONObj readConcernObj; { - const repl::ReadConcernArgs readConcern{getConfigOpTime(), - repl::ReadConcernLevel::kMajorityReadConcern}; + // AVID FIX. repl::ReadConcernLevel::kMajorityReadConcern -> repl::ReadConcernLevel::kLocalReadConcern based on param + const repl::ReadConcernArgs readConcern{getConfigOpTime(), + (serverGlobalParams.allowInconsistentConfigReads) ? repl::ReadConcernLevel::kLocalReadConcern : repl::ReadConcernLevel::kMajorityReadConcern}; BSONObjBuilder bob; readConcern.appendInfo(&bob); readConcernObj = @@ -732,10 +733,13 @@ StatusWith ShardRegistry::runCommandOnConfigWithRetries( const std::string& dbname, const BSONObj& cmdObj, const ShardRegistry::ErrorCodesSet& errorsToCheck) { + + + // AVID FIX. ReadPreference::PrimaryOnly -> ReadPreference::PrimaryPreferred auto response = _runCommandWithRetries(txn, _executorPool->getFixedExecutor(), getConfigShard(), - ReadPreferenceSetting{ReadPreference::PrimaryOnly}, + ReadPreferenceSetting{ReadPreference::PrimaryPreferred}, dbname, cmdObj, kReplMetadata,