diff options
author | Spencer T Brody <spencer@mongodb.com> | 2016-12-06 17:51:31 -0500 |
---|---|---|
committer | Spencer T Brody <spencer@mongodb.com> | 2016-12-07 10:59:41 -0500 |
commit | 4182070e85aebf28cba09850e4f7c423485284f8 (patch) | |
tree | a187deebd4e40f445bdeb58c2a3b9aec7e0ddc7c | |
parent | 66edc250f46519ea7c6b65f628d201ffbfd0dfbf (diff) | |
download | mongo-4182070e85aebf28cba09850e4f7c423485284f8.tar.gz |
SERVER-26754 Disallow read concern majority reads with protocol version 0.
This reverts commit 3349bcb22aef6036a48d2696c6cb2802395622a7 from SERVER-26754
(cherry picked from commit 15d73829ec0104b573f087443394313c2e81b5b1)
6 files changed, 9 insertions, 174 deletions
diff --git a/buildscripts/resmokeconfig/suites/aggregation_read_concern_majority_passthrough_pv0.yml b/buildscripts/resmokeconfig/suites/aggregation_read_concern_majority_passthrough_pv0.yml deleted file mode 100644 index c2303389783..00000000000 --- a/buildscripts/resmokeconfig/suites/aggregation_read_concern_majority_passthrough_pv0.yml +++ /dev/null @@ -1,39 +0,0 @@ -selector: - js_test: - roots: - - jstests/aggregation/*.js - - jstests/aggregation/bugs/*.js - - jstests/aggregation/expressions/*.js - - jstests/aggregation/sources/*/*.js - exclude_files: - - jstests/aggregation/bugs/server18198.js # Uses a mocked mongo client to test read preference. - - jstests/aggregation/mongos_slaveok.js # Majority read on secondary requires afterOpTime. - - jstests/aggregation/sources/facet/use_cases.js # Cannot specify write concern when - # secondaryThrottle is not set. - - jstests/aggregation/testSlave.js # Majority read on secondary requires afterOpTime. - -executor: - js_test: - config: - shell_options: - global_vars: - TestData: - enableMajorityReadConcern: '' - eval: "var testingReplication = true; load('jstests/libs/override_methods/set_majority_read_and_write_concerns.js');" - readMode: commands - hooks: - - class: ValidateCollections - - class: CheckReplOplogs - - class: CheckReplDBHash - fixture: - class: ReplicaSetFixture - mongod_options: - enableMajorityReadConcern: '' - set_parameters: - enableTestCommands: 1 - numInitialSyncAttempts: 1 - num_nodes: 2 - replset_config_options: - protocolVersion: 0 - # Needs to be set for any ephemeral or no-journaling storage engine - write_concern_majority_journal_default: false diff --git a/buildscripts/resmokeconfig/suites/read_concern_majority_passthrough_pv0.yml b/buildscripts/resmokeconfig/suites/read_concern_majority_passthrough_pv0.yml deleted file mode 100644 index 33b578c73fe..00000000000 --- a/buildscripts/resmokeconfig/suites/read_concern_majority_passthrough_pv0.yml +++ /dev/null @@ -1,93 +0,0 @@ -selector: - js_test: - roots: - - jstests/core/*.js - exclude_files: - # Tests that won't work with an injected 'majority' readConcern - # and/or an injected 'majority' writeConcern. Where a function is - # listed the reason is we don't have a reliable solution to override - # the write concern for that function. - - jstests/core/batch_write_command*.js # these tests use various write concerns - - jstests/core/bench_test*.js # benchRun() used for writes - - jstests/core/capped_update.js # uses godinsert and can't run under replication. - - jstests/core/crud_api.js # has specific w:0 tests - - jstests/core/error2.js # db.eval() used - - jstests/core/eval0.js # db.eval() used - - jstests/core/eval1.js # db.eval() used - - jstests/core/eval3.js # db.eval() used - - jstests/core/eval4.js # db.eval() used - - jstests/core/eval5.js # db.eval() used - - jstests/core/eval6.js # db.eval() used - - jstests/core/eval7.js # db.eval() used - - jstests/core/eval9.js # db.eval() used - - jstests/core/evala.js # db.eval() used - - jstests/core/evalb.js # db.eval() used - - jstests/core/evalc.js # db.eval() used - - jstests/core/evald.js # db.eval() used - - jstests/core/evale.js # db.eval() used - - jstests/core/evalg.js # db.eval() used - - jstests/core/eval_mr.js # db.eval() used - - jstests/core/eval_nolock.js # db.eval() used - - jstests/core/geo_s2cursorlimitskip.js # drops system.profile collection and counts ops. - - jstests/core/js3.js # db.dbEval() used - - jstests/core/js7.js # db.eval() used - - jstests/core/js9.js # db.eval() used - - jstests/core/mr_merge.js # mr temp tables aren't replicated - - jstests/core/mr_merge2.js # mr temp tables aren't replicated - - jstests/core/mr_outreduce.js # mr temp tables aren't replicated - - jstests/core/mr_outreduce2.js # mr temp tables aren't replicated - - jstests/core/opcounters_active.js # off by n problem with opcounters - - jstests/core/opcounters_write_cmd.js # off by n problem with opcounters - - jstests/core/profile_agg.js # system.profile not replicated - - jstests/core/profile_count.js # system.profile not replicated - - jstests/core/profile_delete.js # system.profile not replicated - - jstests/core/profile_distinct.js # system.profile not replicated - - jstests/core/profile_find.js # system.profile not replicated - - jstests/core/profile_findandmodify.js # system.profile not replicated - - jstests/core/profile_geonear.js # system.profile not replicated - - jstests/core/profile_getmore.js # system.profile not replicated - - jstests/core/profile_group.js # system.profile not replicated - - jstests/core/profile_insert.js # system.profile not replicated - - jstests/core/profile_mapreduce.js # system.profile not replicated - - jstests/core/profile_update.js # system.profile not replicated - - jstests/core/profile1.js # system.profile not replicated - - jstests/core/profile2.js # system.profile not replicated - - jstests/core/profile3.js # system.profile not replicated - - jstests/core/read_after_optime.js # verifies read after optime fails on standalone - - jstests/core/remove8.js # db.eval() used - - jstests/core/rename4.js # db.eval() used - - jstests/core/shell1.js # tests setSlaveOk() variations on standalone mongod - - jstests/core/shellkillop.js # db.eval() used - - jstests/core/shell_writeconcern.js # checks write concern shell helpers - - jstests/core/storefunc.js # db.eval() used - - jstests/core/write_result.js # Tests invalid writeConcern, we shouldn't override. - # Tests that need triaging & remediation | blacklist decision - # Comments list possible problem point under review. - - jstests/core/capped6.js # Uses captrunc test command. - - jstests/core/convert_to_capped_nonexistant.js # Uses convertToCapped and captrunc command. - - jstests/core/stages_delete.js # Uses stageDebug command for deletes. - -executor: - js_test: - config: - shell_options: - eval: "var testingReplication = true; load('jstests/libs/override_methods/set_majority_read_and_write_concerns.js');" - readMode: commands - hooks: - - class: ValidateCollections - - class: CheckReplOplogs - - class: CheckReplDBHash - - class: CleanEveryN - n: 20 - fixture: - class: ReplicaSetFixture - mongod_options: - set_parameters: - enableTestCommands: 1 - numInitialSyncAttempts: 1 - enableMajorityReadConcern: '' - num_nodes: 2 - # Needs to be set for any ephemeral or no-journaling storage engine - write_concern_majority_journal_default: false - replset_config_options: - protocolVersion: 0 diff --git a/buildscripts/resmokeconfig/suites/replica_sets_legacy.yml b/buildscripts/resmokeconfig/suites/replica_sets_legacy.yml index 1ba90512c6a..e38954f573b 100644 --- a/buildscripts/resmokeconfig/suites/replica_sets_legacy.yml +++ b/buildscripts/resmokeconfig/suites/replica_sets_legacy.yml @@ -7,12 +7,15 @@ selector: - jstests/replsets/config_server_checks.js - jstests/replsets/disallow_adding_initialized_node1.js - jstests/replsets/disallow_adding_initialized_node2.js + - jstests/replsets/last_op_visible.js # Linearizable reads not supported on PV0 - jstests/replsets/linearizable_read_concern.js - jstests/replsets/oplog_truncated_on_recovery.js - jstests/replsets/priority_takeover_cascading_priorities.js - jstests/replsets/priority_takeover_one_node_higher_priority.js - jstests/replsets/priority_takeover_two_nodes_equal_priority.js + - jstests/replsets/read_committed*.js + - jstests/replsets/read_majority_two_arbs.js - jstests/replsets/stepup.js # The combination of new bridges and PV0 can lead to an improper spanning tree in sync2.js. - jstests/replsets/sync2.js diff --git a/buildscripts/resmokelib/testing/fixtures/replicaset.py b/buildscripts/resmokelib/testing/fixtures/replicaset.py index 53e6d1a7595..69e82c76f4b 100644 --- a/buildscripts/resmokelib/testing/fixtures/replicaset.py +++ b/buildscripts/resmokelib/testing/fixtures/replicaset.py @@ -120,9 +120,6 @@ class ReplicaSetFixture(interface.ReplFixture): if self.replset_config_options.get("configsvr", False): initiate_cmd_obj["replSetInitiate"]["configsvr"] = True - if "protocolVersion" in self.replset_config_options: - protocol_version = self.replset_config_options["protocolVersion"] - initiate_cmd_obj["replSetInitiate"]["protocolVersion"] = protocol_version if self.replset_config_options.get("settings"): replset_settings = self.replset_config_options["settings"] initiate_cmd_obj["replSetInitiate"]["settings"] = replset_settings diff --git a/etc/evergreen.yml b/etc/evergreen.yml index 30a9d155927..5f22d58d835 100644 --- a/etc/evergreen.yml +++ b/etc/evergreen.yml @@ -1404,18 +1404,6 @@ tasks: run_multiple_jobs: true - <<: *task_template - name: aggregation_read_concern_majority_passthrough_pv0_WT - depends_on: - - name: aggregation_WT - commands: - - func: "do setup" - - func: "run tests" - vars: - resmoke_args: --suites=aggregation_read_concern_majority_passthrough_pv0 --storageEngine=wiredTiger - run_multiple_jobs: true - - -- <<: *task_template name: aggregation_sharded_collections_passthrough_WT depends_on: - name: aggregation_WT @@ -2255,17 +2243,6 @@ tasks: run_multiple_jobs: true - <<: *task_template - name: read_concern_majority_passthrough_pv0_WT - depends_on: - - name: jsCore_WT - commands: - - func: "do setup" - - func: "run tests" - vars: - resmoke_args: --suites=read_concern_majority_passthrough_pv0 --storageEngine=wiredTiger - run_multiple_jobs: true - -- <<: *task_template name: replicasets commands: - func: "do setup" @@ -4649,7 +4626,6 @@ buildvariants: - name: aggregation_WT - name: aggregation_facet_unwind_passthrough_WT - name: aggregation_read_concern_majority_passthrough_WT - - name: aggregation_read_concern_majority_passthrough_pv0_WT - name: aggregation_sharded_collections_passthrough_WT - name: auth - name: auth_WT @@ -4729,9 +4705,6 @@ buildvariants: - name: read_concern_majority_passthrough_WT distros: - windows-64-vs2015-large - - name: read_concern_majority_passthrough_pv0_WT - distros: - - windows-64-vs2015-large - name: read_only - name: read_only_WT - name: read_only_sharded @@ -5130,7 +5103,6 @@ buildvariants: - name: aggregation - name: aggregation_WT - name: aggregation_read_concern_majority_passthrough_WT - - name: aggregation_read_concern_majority_passthrough_pv0_WT - name: aggregation_sharded_collections_passthrough_WT - name: auth - name: auth_WT @@ -5191,7 +5163,6 @@ buildvariants: - name: concurrency_simultaneous - name: concurrency_simultaneous_WT - name: read_concern_majority_passthrough_WT - - name: read_concern_majority_passthrough_pv0_WT - name: replicasets - name: replicasets_WT - name: replication @@ -5349,7 +5320,6 @@ buildvariants: - name: aggregation_auth - name: aggregation_facet_unwind_passthrough_WT - name: aggregation_read_concern_majority_passthrough_WT - - name: aggregation_read_concern_majority_passthrough_pv0_WT - name: aggregation_sharded_collections_passthrough_WT - name: audit - name: audit_WT @@ -5443,9 +5413,6 @@ buildvariants: - name: read_concern_majority_passthrough_WT distros: - rhel62-large - - name: read_concern_majority_passthrough_pv0_WT - distros: - - rhel62-large - name: read_only - name: read_only_WT - name: read_only_sharded @@ -7525,7 +7492,6 @@ buildvariants: - name: aggregation_WT - name: aggregation_auth - name: aggregation_read_concern_majority_passthrough_WT - - name: aggregation_read_concern_majority_passthrough_pv0_WT - name: aggregation_sharded_collections_passthrough_WT - name: audit - name: auth @@ -7565,7 +7531,6 @@ buildvariants: - name: parallel - name: parallel_compatibility - name: read_concern_majority_passthrough_WT - - name: read_concern_majority_passthrough_pv0_WT - name: replicasets_WT - name: replicasets_auth - name: replicasets_legacy @@ -7934,7 +7899,6 @@ buildvariants: - name: aggregation_auth - name: aggregation_facet_unwind_passthrough_WT - name: aggregation_read_concern_majority_passthrough_WT - - name: aggregation_read_concern_majority_passthrough_pv0_WT - name: aggregation_sharded_collections_passthrough_WT - name: audit - name: audit_WT @@ -8006,7 +7970,6 @@ buildvariants: - name: parallel_compatibility - name: parallel_compatibility_WT - name: read_concern_majority_passthrough_WT - - name: read_concern_majority_passthrough_pv0_WT - name: read_only - name: read_only_WT - name: read_only_sharded @@ -8109,7 +8072,6 @@ buildvariants: - name: aggregation_auth - name: aggregation_facet_unwind_passthrough_WT - name: aggregation_read_concern_majority_passthrough_WT - - name: aggregation_read_concern_majority_passthrough_pv0_WT - name: aggregation_sharded_collections_passthrough_WT - name: audit - name: audit_WT @@ -8181,7 +8143,6 @@ buildvariants: - name: parallel_compatibility - name: parallel_compatibility_WT - name: read_concern_majority_passthrough_WT - - name: read_concern_majority_passthrough_pv0_WT - name: read_only - name: read_only_WT - name: read_only_sharded diff --git a/src/mongo/db/read_concern.cpp b/src/mongo/db/read_concern.cpp index 4b36f37528a..cc404cdbf82 100644 --- a/src/mongo/db/read_concern.cpp +++ b/src/mongo/db/read_concern.cpp @@ -117,6 +117,12 @@ Status waitForReadConcern(OperationContext* txn, const repl::ReadConcernArgs& re if ((replCoord->getReplicationMode() == repl::ReplicationCoordinator::Mode::modeReplSet || testingSnapshotBehaviorInIsolation) && readConcernArgs.getLevel() == repl::ReadConcernLevel::kMajorityReadConcern) { + // ReadConcern Majority is not supported in ProtocolVersion 0. + if (!testingSnapshotBehaviorInIsolation && !replCoord->isV1ElectionProtocol()) { + return {ErrorCodes::ReadConcernMajorityNotEnabled, + str::stream() << "Replica sets running protocol version 0 do not support " + "readConcern: majority"}; + } const int debugLevel = serverGlobalParams.clusterRole == ClusterRole::ConfigServer ? 1 : 2; |