mongo 2.0.6 → 2.1.0.beta
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/lib/mongo.rb +2 -0
- data/lib/mongo/bulk_write.rb +1 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +87 -31
- data/lib/mongo/bulk_write/deletable.rb +8 -7
- data/lib/mongo/bulk_write/insertable.rb +4 -3
- data/lib/mongo/bulk_write/ordered_bulk_write.rb +6 -6
- data/lib/mongo/bulk_write/replacable.rb +4 -3
- data/lib/mongo/bulk_write/result.rb +138 -0
- data/lib/mongo/bulk_write/unordered_bulk_write.rb +5 -8
- data/lib/mongo/bulk_write/updatable.rb +8 -7
- data/lib/mongo/client.rb +36 -4
- data/lib/mongo/cluster.rb +39 -4
- data/lib/mongo/cluster/topology/replica_set.rb +20 -4
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/collection.rb +282 -29
- data/lib/mongo/collection/view/aggregation.rb +32 -4
- data/lib/mongo/collection/view/iterable.rb +2 -1
- data/lib/mongo/collection/view/map_reduce.rb +3 -1
- data/lib/mongo/collection/view/readable.rb +89 -14
- data/lib/mongo/collection/view/writable.rb +11 -5
- data/lib/mongo/cursor.rb +11 -3
- data/lib/mongo/dbref.rb +113 -0
- data/lib/mongo/error.rb +6 -2
- data/lib/mongo/error/parser.rb +1 -1
- data/lib/mongo/event/description_changed.rb +1 -1
- data/lib/mongo/grid/file.rb +1 -1
- data/lib/mongo/grid/fs.rb +2 -5
- data/lib/mongo/monitoring.rb +199 -0
- data/lib/mongo/monitoring/command_log_subscriber.rb +88 -0
- data/lib/mongo/monitoring/event.rb +17 -0
- data/lib/mongo/monitoring/event/command_failed.rb +96 -0
- data/lib/mongo/monitoring/event/command_started.rb +88 -0
- data/lib/mongo/monitoring/event/command_succeeded.rb +96 -0
- data/lib/mongo/monitoring/publishable.rb +96 -0
- data/lib/mongo/operation.rb +1 -0
- data/lib/mongo/operation/executable.rb +1 -1
- data/lib/mongo/operation/parallel_scan.rb +76 -0
- data/lib/mongo/operation/parallel_scan/result.rb +72 -0
- data/lib/mongo/operation/specifiable.rb +18 -0
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +1 -1
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +1 -1
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +2 -2
- data/lib/mongo/operation/write/bulk/bulk_update.rb +1 -1
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +13 -1
- data/lib/mongo/protocol/delete.rb +8 -13
- data/lib/mongo/protocol/get_more.rb +13 -13
- data/lib/mongo/protocol/insert.rb +8 -13
- data/lib/mongo/protocol/kill_cursors.rb +7 -11
- data/lib/mongo/protocol/query.rb +58 -20
- data/lib/mongo/protocol/reply.rb +12 -0
- data/lib/mongo/protocol/update.rb +13 -14
- data/lib/mongo/server.rb +23 -2
- data/lib/mongo/server/connectable.rb +0 -22
- data/lib/mongo/server/connection.rb +29 -0
- data/lib/mongo/server/description.rb +23 -1
- data/lib/mongo/server/monitor.rb +17 -1
- data/lib/mongo/server/monitor/connection.rb +24 -0
- data/lib/mongo/socket/ssl.rb +28 -16
- data/lib/mongo/socket/tcp.rb +1 -1
- data/lib/mongo/socket/unix.rb +1 -1
- data/lib/mongo/uri.rb +12 -5
- data/lib/mongo/version.rb +1 -1
- data/spec/mongo/auth/cr_spec.rb +9 -1
- data/spec/mongo/auth/ldap_spec.rb +9 -1
- data/spec/mongo/auth/scram_spec.rb +9 -1
- data/spec/mongo/auth/x509_spec.rb +9 -1
- data/spec/mongo/{bulk/bulk_write_spec.rb → bulk_write_spec.rb} +15 -15
- data/spec/mongo/client_spec.rb +42 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -9
- data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
- data/spec/mongo/cluster/topology/single_spec.rb +12 -4
- data/spec/mongo/cluster_spec.rb +55 -10
- data/spec/mongo/collection/view/aggregation_spec.rb +123 -1
- data/spec/mongo/collection/view/explainable_spec.rb +1 -1
- data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
- data/spec/mongo/collection/view/readable_spec.rb +251 -6
- data/spec/mongo/collection/view/writable_spec.rb +4 -4
- data/spec/mongo/collection/view_spec.rb +233 -71
- data/spec/mongo/collection_spec.rb +905 -9
- data/spec/mongo/crud_spec.rb +2 -2
- data/spec/mongo/cursor_spec.rb +3 -3
- data/spec/mongo/dbref_spec.rb +149 -0
- data/spec/mongo/monitoring_spec.rb +168 -0
- data/spec/mongo/operation/map_reduce_spec.rb +1 -1
- data/spec/mongo/operation/write/bulk/bulk_delete_spec.rb +1 -1
- data/spec/mongo/operation/write/bulk/bulk_insert_spec.rb +2 -2
- data/spec/mongo/operation/write/bulk/bulk_update_spec.rb +1 -1
- data/spec/mongo/operation/write/delete_spec.rb +1 -1
- data/spec/mongo/operation/write/insert_spec.rb +2 -2
- data/spec/mongo/operation/write/update_spec.rb +1 -1
- data/spec/mongo/protocol/query_spec.rb +0 -29
- data/spec/mongo/server/connection_pool_spec.rb +18 -6
- data/spec/mongo/server/connection_spec.rb +12 -4
- data/spec/mongo/server/description_spec.rb +7 -3
- data/spec/mongo/server/monitor_spec.rb +30 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +11 -4
- data/spec/mongo/server_selection_spec.rb +14 -6
- data/spec/mongo/server_spec.rb +27 -8
- data/spec/mongo/socket/ssl_spec.rb +94 -8
- data/spec/mongo/uri_spec.rb +25 -9
- data/spec/spec_helper.rb +29 -20
- data/spec/support/authorization.rb +19 -4
- data/spec/support/certificates/client.pem +4 -4
- data/spec/support/crud/read.rb +9 -10
- data/spec/support/crud/write.rb +24 -20
- data/spec/support/sdam/rs/equal_electionids.yml +45 -0
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +98 -0
- data/spec/support/sdam/rs/null_election_id.yml +144 -0
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
- data/spec/support/server_discovery_and_monitoring.rb +19 -2
- data/spec/support/shared/bulk_write.rb +26 -22
- data/spec/support/shared/server_selector.rb +2 -1
- metadata +31 -7
- metadata.gz.sig +0 -0
- data/lib/mongo/error/invalid_uri_option.rb +0 -38
data/spec/mongo/uri_spec.rb
CHANGED
@@ -129,11 +129,11 @@ describe Mongo::URI do
|
|
129
129
|
describe '#database' do
|
130
130
|
let(:servers) { 'localhost' }
|
131
131
|
let(:string) { "#{scheme}#{servers}/#{db}" }
|
132
|
-
let(:db) {
|
132
|
+
let(:db) { 'auth-db' }
|
133
133
|
|
134
134
|
context 'database provided' do
|
135
135
|
it 'returns the database name' do
|
136
|
-
expect(uri.database).to eq(
|
136
|
+
expect(uri.database).to eq(db)
|
137
137
|
end
|
138
138
|
end
|
139
139
|
end
|
@@ -171,7 +171,7 @@ describe Mongo::URI do
|
|
171
171
|
end
|
172
172
|
|
173
173
|
context 'journal' do
|
174
|
-
let(:options) { '
|
174
|
+
let(:options) { 'journal=true' }
|
175
175
|
let(:concern) { { :j => true } }
|
176
176
|
|
177
177
|
it 'sets the write concern options' do
|
@@ -248,7 +248,7 @@ describe Mongo::URI do
|
|
248
248
|
end
|
249
249
|
end
|
250
250
|
|
251
|
-
context 'read
|
251
|
+
context 'read preference tags provided' do
|
252
252
|
|
253
253
|
context 'single read preference tag set' do
|
254
254
|
let(:options) do
|
@@ -505,12 +505,28 @@ describe Mongo::URI do
|
|
505
505
|
|
506
506
|
context 'when an invalid option is provided' do
|
507
507
|
|
508
|
-
let(:options) { '
|
508
|
+
let(:options) { 'invalidOption=10' }
|
509
509
|
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
|
510
|
+
let(:uri_options) do
|
511
|
+
uri.options
|
512
|
+
end
|
513
|
+
|
514
|
+
it 'does not raise an exception' do
|
515
|
+
expect(uri_options).to be_empty
|
516
|
+
end
|
517
|
+
|
518
|
+
context 'when an invalid option is combined with valid options' do
|
519
|
+
|
520
|
+
let(:options) { 'invalidOption=10&waitQueueTimeoutMS=500&ssl=true' }
|
521
|
+
|
522
|
+
it 'does not raise an exception' do
|
523
|
+
expect(uri_options).not_to be_empty
|
524
|
+
end
|
525
|
+
|
526
|
+
it 'sets the valid options' do
|
527
|
+
expect(uri_options[:wait_queue_timeout]).to eq(0.5)
|
528
|
+
expect(uri_options[:ssl]).to be true
|
529
|
+
end
|
514
530
|
end
|
515
531
|
end
|
516
532
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -17,6 +17,20 @@ if RUBY_VERSION > '1.9' && RUBY_VERSION < '2.2'
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
TEST_SET = 'ruby-driver-rs'
|
21
|
+
COVERAGE_MIN = 90
|
22
|
+
CURRENT_PATH = File.expand_path(File.dirname(__FILE__))
|
23
|
+
SERVER_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/support/sdam/**/*.yml")
|
24
|
+
SERVER_SELECTION_RTT_TESTS = Dir.glob("#{CURRENT_PATH}/support/server_selection/rtt/*.yml")
|
25
|
+
SERVER_SELECTION_TESTS = Dir.glob("#{CURRENT_PATH}/support/server_selection/selection/**/*.yml")
|
26
|
+
CRUD_TESTS = Dir.glob("#{CURRENT_PATH}/support/crud_tests/**/*.yml")
|
27
|
+
|
28
|
+
SSL_CERTS_DIR = "#{CURRENT_PATH}/support/certificates"
|
29
|
+
CLIENT_PEM = "#{SSL_CERTS_DIR}/client.pem"
|
30
|
+
CLIENT_PASSWORD_PEM = "#{SSL_CERTS_DIR}/password_protected.pem"
|
31
|
+
CA_PEM = "#{SSL_CERTS_DIR}/ca.pem"
|
32
|
+
CRL_PEM = "#{SSL_CERTS_DIR}/crl.pem"
|
33
|
+
|
20
34
|
require 'mongo'
|
21
35
|
|
22
36
|
require 'support/travis'
|
@@ -61,20 +75,6 @@ RSpec.configure do |config|
|
|
61
75
|
end
|
62
76
|
end
|
63
77
|
|
64
|
-
TEST_SET = 'ruby-driver-rs'
|
65
|
-
COVERAGE_MIN = 90
|
66
|
-
CURRENT_PATH = File.expand_path(File.dirname(__FILE__))
|
67
|
-
SERVER_DISCOVERY_TESTS = Dir.glob("#{CURRENT_PATH}/support/sdam/**/*.yml")
|
68
|
-
SERVER_SELECTION_RTT_TESTS = Dir.glob("#{CURRENT_PATH}/support/server_selection/rtt/*.yml")
|
69
|
-
SERVER_SELECTION_TESTS = Dir.glob("#{CURRENT_PATH}/support/server_selection/selection/**/*.yml")
|
70
|
-
CRUD_TESTS = Dir.glob("#{CURRENT_PATH}/support/crud_tests/**/*.yml")
|
71
|
-
|
72
|
-
SSL_CERTS_DIR = "#{CURRENT_PATH}/support/certificates"
|
73
|
-
CLIENT_PEM = "#{SSL_CERTS_DIR}/client.pem"
|
74
|
-
CLIENT_PASSWORD_PEM = "#{SSL_CERTS_DIR}/password_protected.pem"
|
75
|
-
CA_PEM = "#{SSL_CERTS_DIR}/ca.pem"
|
76
|
-
CRL_PEM = "#{SSL_CERTS_DIR}/crl.pem"
|
77
|
-
|
78
78
|
# Determine whether the test clients are connecting to a standalone.
|
79
79
|
#
|
80
80
|
# @since 2.0.0
|
@@ -91,12 +91,13 @@ def replica_set?
|
|
91
91
|
$replica_set ||= $mongo_client.cluster.replica_set?
|
92
92
|
end
|
93
93
|
|
94
|
-
# Determine whether the test clients are connecting to a sharded cluster
|
94
|
+
# Determine whether the test clients are connecting to a sharded cluster
|
95
|
+
# or a single mongos.
|
95
96
|
#
|
96
97
|
# @since 2.0.0
|
97
98
|
def sharded?
|
98
99
|
$mongo_client ||= initialize_scanned_client!
|
99
|
-
$sharded ||= $mongo_client.cluster.sharded?
|
100
|
+
$sharded ||= ($mongo_client.cluster.sharded? || single_mongos?)
|
100
101
|
end
|
101
102
|
|
102
103
|
# Determine whether the single address provided is a replica set member.
|
@@ -107,7 +108,8 @@ end
|
|
107
108
|
# @since 2.0.0
|
108
109
|
def single_rs_member?
|
109
110
|
$mongo_client ||= initialize_scanned_client!
|
110
|
-
single_seed? &&
|
111
|
+
$single_rs_member ||= (single_seed? &&
|
112
|
+
$mongo_client.cluster.servers.first.replica_set_name)
|
111
113
|
end
|
112
114
|
|
113
115
|
# Determine whether the single address provided is a mongos.
|
@@ -118,7 +120,8 @@ end
|
|
118
120
|
# @since 2.0.0
|
119
121
|
def single_mongos?
|
120
122
|
$mongo_client ||= initialize_scanned_client!
|
121
|
-
single_seed? &&
|
123
|
+
$single_mongos ||= (single_seed? &&
|
124
|
+
$mongo_client.cluster.servers.first.mongos?)
|
122
125
|
end
|
123
126
|
|
124
127
|
# Determine whether a single address was provided.
|
@@ -146,10 +149,16 @@ def list_command_enabled?
|
|
146
149
|
$list_command_enabled ||= $mongo_client.cluster.servers.first.features.list_indexes_enabled?
|
147
150
|
end
|
148
151
|
|
149
|
-
|
150
|
-
|
152
|
+
# Is the test suite running locally (not on Travis or Jenkins).
|
153
|
+
#
|
154
|
+
# @since 2.1.0
|
155
|
+
def testing_ssl_locally?
|
156
|
+
running_ssl? && !(ENV['CI'] || ENV['JENKINS_CI'])
|
151
157
|
end
|
152
158
|
|
159
|
+
# Is the test suite running on SSL.
|
160
|
+
#
|
161
|
+
# @since 2.0.2
|
153
162
|
def running_ssl?
|
154
163
|
SSL
|
155
164
|
end
|
@@ -50,13 +50,28 @@ WRITE_CONCERN = CONNECT[:connect] == :replica_set ? { w: ADDRESSES.size } : { w:
|
|
50
50
|
# @since 2.0.3
|
51
51
|
SSL = ENV['SSL_ENABLED'] == 'true'
|
52
52
|
|
53
|
+
# SSL options.
|
54
|
+
#
|
55
|
+
# @since 2.1.0
|
56
|
+
SSL_OPTIONS = {
|
57
|
+
ssl: SSL,
|
58
|
+
ssl_verify: false,
|
59
|
+
ssl_cert: CLIENT_PEM,
|
60
|
+
ssl_key: CLIENT_PEM
|
61
|
+
}
|
62
|
+
|
63
|
+
# Base test options.
|
64
|
+
#
|
65
|
+
# @since 2.1.0
|
66
|
+
BASE_OPTIONS = {
|
67
|
+
max_pool_size: 1,
|
68
|
+
write: WRITE_CONCERN
|
69
|
+
}
|
70
|
+
|
53
71
|
# Options for test suite clients.
|
54
72
|
#
|
55
73
|
# @since 2.0.3
|
56
|
-
TEST_OPTIONS = CONNECT.merge(
|
57
|
-
write: WRITE_CONCERN,
|
58
|
-
ssl: SSL,
|
59
|
-
server_selection_timeout: 3)
|
74
|
+
TEST_OPTIONS = BASE_OPTIONS.merge(CONNECT).merge(SSL_OPTIONS)
|
60
75
|
|
61
76
|
# The root user name.
|
62
77
|
#
|
@@ -32,13 +32,13 @@ Certificate:
|
|
32
32
|
6e:a7
|
33
33
|
Exponent: 65537 (0x10001)
|
34
34
|
X509v3 extensions:
|
35
|
-
X509v3 Basic Constraints:
|
35
|
+
X509v3 Basic Constraints:
|
36
36
|
CA:FALSE
|
37
|
-
Netscape Comment:
|
37
|
+
Netscape Comment:
|
38
38
|
OpenSSL Generated Certificate
|
39
|
-
X509v3 Subject Key Identifier:
|
39
|
+
X509v3 Subject Key Identifier:
|
40
40
|
4A:8B:EE:22:42:E6:F8:62:4C:86:38:8D:C5:78:95:98:C1:10:05:7C
|
41
|
-
X509v3 Authority Key Identifier:
|
41
|
+
X509v3 Authority Key Identifier:
|
42
42
|
keyid:07:41:19:3A:9F:7E:C5:B7:22:4E:B7:BC:D5:DF:E4:FC:09:B8:64:16
|
43
43
|
|
44
44
|
Signature Algorithm: sha1WithRSAEncryption
|
data/spec/support/crud/read.rb
CHANGED
@@ -93,30 +93,29 @@ module Mongo
|
|
93
93
|
private
|
94
94
|
|
95
95
|
def count(collection)
|
96
|
-
view = collection.find(filter)
|
97
96
|
options = ARGUMENT_MAP.reduce({}) do |opts, (key, value)|
|
98
97
|
opts.merge!(key => arguments[value]) if arguments[value]
|
99
98
|
opts
|
100
99
|
end
|
101
|
-
|
100
|
+
collection.count(filter, options)
|
102
101
|
end
|
103
102
|
|
104
103
|
def aggregate(collection)
|
105
|
-
collection.
|
106
|
-
view = view.batch_size(batch_size) if batch_size
|
107
|
-
end.aggregate(pipeline).to_a
|
104
|
+
collection.aggregate(pipeline, options).to_a
|
108
105
|
end
|
109
106
|
|
110
107
|
def distinct(collection)
|
111
|
-
collection.
|
108
|
+
collection.distinct(field_name, filter, options)
|
112
109
|
end
|
113
110
|
|
114
111
|
def find(collection)
|
115
|
-
|
116
|
-
|
117
|
-
|
112
|
+
collection.find(filter, options).to_a
|
113
|
+
end
|
114
|
+
|
115
|
+
def options
|
116
|
+
ARGUMENT_MAP.reduce({}) do |opts, (key, value)|
|
117
|
+
arguments[value] ? opts.merge!(key => arguments[value]) : opts
|
118
118
|
end
|
119
|
-
view.to_a
|
120
119
|
end
|
121
120
|
|
122
121
|
def batch_size
|
data/spec/support/crud/write.rb
CHANGED
@@ -42,7 +42,9 @@ module Mongo
|
|
42
42
|
# @since 2.0.0
|
43
43
|
ARGUMENT_MAP = {
|
44
44
|
:sort => 'sort',
|
45
|
-
:projection => 'projection'
|
45
|
+
:projection => 'projection',
|
46
|
+
:return_document => 'returnDocument',
|
47
|
+
:upsert => 'upsert'
|
46
48
|
}
|
47
49
|
|
48
50
|
# Operations that need a check if results on < 2.6 will match.
|
@@ -111,12 +113,12 @@ module Mongo
|
|
111
113
|
private
|
112
114
|
|
113
115
|
def delete_many(collection)
|
114
|
-
result = collection.
|
116
|
+
result = collection.delete_many(filter)
|
115
117
|
{ 'deletedCount' => result.deleted_count }
|
116
118
|
end
|
117
119
|
|
118
120
|
def delete_one(collection)
|
119
|
-
result = collection.
|
121
|
+
result = collection.delete_one(filter)
|
120
122
|
{ 'deletedCount' => result.deleted_count }
|
121
123
|
end
|
122
124
|
|
@@ -137,48 +139,50 @@ module Mongo
|
|
137
139
|
end
|
138
140
|
|
139
141
|
def replace_one(collection)
|
140
|
-
result = collection.
|
142
|
+
result = collection.replace_one(filter, replacement, options)
|
141
143
|
update_return_doc(result)
|
142
144
|
end
|
143
145
|
|
144
146
|
def update_many(collection)
|
145
|
-
result = collection.
|
147
|
+
result = collection.update_many(filter, update, options)
|
146
148
|
update_return_doc(result)
|
147
149
|
end
|
148
150
|
|
149
151
|
def update_one(collection)
|
150
|
-
result = collection.
|
152
|
+
result = collection.update_one(filter, update, options)
|
151
153
|
update_return_doc(result)
|
152
154
|
end
|
153
155
|
|
154
156
|
def find_one_and_delete(collection)
|
155
|
-
|
156
|
-
ARGUMENT_MAP.each do |key, value|
|
157
|
-
view = view.send(key, arguments[value]) if arguments[value]
|
158
|
-
end
|
159
|
-
view.find_one_and_delete
|
157
|
+
collection.find_one_and_delete(filter, options)
|
160
158
|
end
|
161
159
|
|
162
160
|
def find_one_and_replace(collection)
|
163
|
-
|
164
|
-
ARGUMENT_MAP.each do |key, value|
|
165
|
-
view = view.send(key, arguments[value]) if arguments[value]
|
166
|
-
end
|
167
|
-
view.find_one_and_replace(replacement, upsert: upsert, return_document: return_document)
|
161
|
+
collection.find_one_and_replace(filter, replacement, options)
|
168
162
|
end
|
169
163
|
|
170
164
|
def find_one_and_update(collection)
|
171
|
-
|
172
|
-
|
173
|
-
|
165
|
+
collection.find_one_and_update(filter, update, options)
|
166
|
+
end
|
167
|
+
|
168
|
+
def options
|
169
|
+
ARGUMENT_MAP.reduce({}) do |opts, (key, value)|
|
170
|
+
arguments[value] ? opts.merge!(key => send(key)) : opts
|
174
171
|
end
|
175
|
-
view.find_one_and_update(update, upsert: upsert, return_document: return_document)
|
176
172
|
end
|
177
173
|
|
178
174
|
def replacement
|
179
175
|
arguments['replacement']
|
180
176
|
end
|
181
177
|
|
178
|
+
def sort
|
179
|
+
arguments['sort']
|
180
|
+
end
|
181
|
+
|
182
|
+
def projection
|
183
|
+
arguments['projection']
|
184
|
+
end
|
185
|
+
|
182
186
|
def documents
|
183
187
|
arguments['documents']
|
184
188
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
description: "New primary with equal electionId"
|
2
|
+
|
3
|
+
uri: "mongodb://a/?replicaSet=rs"
|
4
|
+
|
5
|
+
phases: [
|
6
|
+
|
7
|
+
# A and B claim to be primaries, with equal electionIds.
|
8
|
+
{
|
9
|
+
responses: [
|
10
|
+
["a:27017", {
|
11
|
+
ok: 1,
|
12
|
+
ismaster: true,
|
13
|
+
hosts: ["a:27017", "b:27017"],
|
14
|
+
setName: "rs",
|
15
|
+
electionId: {"$oid": "000000000000000000000001"}
|
16
|
+
}],
|
17
|
+
["b:27017", {
|
18
|
+
ok: 1,
|
19
|
+
ismaster: true,
|
20
|
+
hosts: ["a:27017", "b:27017"],
|
21
|
+
setName: "rs",
|
22
|
+
electionId: {"$oid": "000000000000000000000001"}
|
23
|
+
}]
|
24
|
+
],
|
25
|
+
|
26
|
+
# No choice but to believe the latter response.
|
27
|
+
outcome: {
|
28
|
+
servers: {
|
29
|
+
"a:27017": {
|
30
|
+
type: "Unknown",
|
31
|
+
setName: ,
|
32
|
+
electionId: ,
|
33
|
+
},
|
34
|
+
"b:27017": {
|
35
|
+
type: "RSPrimary",
|
36
|
+
setName: "rs",
|
37
|
+
electionId: {"$oid": "000000000000000000000001"}
|
38
|
+
}
|
39
|
+
},
|
40
|
+
topologyType: "ReplicaSetWithPrimary",
|
41
|
+
setName: "rs",
|
42
|
+
maxElectionId: {"$oid": "000000000000000000000001"}
|
43
|
+
}
|
44
|
+
}
|
45
|
+
]
|
@@ -0,0 +1,98 @@
|
|
1
|
+
description: "New primary with greater electionId"
|
2
|
+
|
3
|
+
uri: "mongodb://a/?replicaSet=rs"
|
4
|
+
|
5
|
+
phases: [
|
6
|
+
|
7
|
+
# Primary A is discovered and tells us about B.
|
8
|
+
{
|
9
|
+
responses: [
|
10
|
+
["a:27017", {
|
11
|
+
ok: 1,
|
12
|
+
ismaster: true,
|
13
|
+
hosts: ["a:27017", "b:27017"],
|
14
|
+
setName: "rs",
|
15
|
+
electionId: {"$oid": "000000000000000000000001"}
|
16
|
+
}]
|
17
|
+
],
|
18
|
+
|
19
|
+
outcome: {
|
20
|
+
servers: {
|
21
|
+
"a:27017": {
|
22
|
+
type: "RSPrimary",
|
23
|
+
setName: "rs",
|
24
|
+
electionId: {"$oid": "000000000000000000000001"}
|
25
|
+
},
|
26
|
+
"b:27017": {
|
27
|
+
type: "Unknown",
|
28
|
+
setName: ,
|
29
|
+
electionId:
|
30
|
+
}
|
31
|
+
},
|
32
|
+
topologyType: "ReplicaSetWithPrimary",
|
33
|
+
setName: "rs",
|
34
|
+
maxElectionId: {"$oid": "000000000000000000000001"}
|
35
|
+
}
|
36
|
+
},
|
37
|
+
|
38
|
+
# B is elected.
|
39
|
+
{
|
40
|
+
responses: [
|
41
|
+
["b:27017", {
|
42
|
+
ok: 1,
|
43
|
+
ismaster: true,
|
44
|
+
hosts: ["a:27017", "b:27017"],
|
45
|
+
setName: "rs",
|
46
|
+
electionId: {"$oid": "000000000000000000000002"}
|
47
|
+
}]
|
48
|
+
],
|
49
|
+
|
50
|
+
outcome: {
|
51
|
+
servers: {
|
52
|
+
"a:27017": {
|
53
|
+
type: "Unknown",
|
54
|
+
setName: ,
|
55
|
+
electionId:
|
56
|
+
},
|
57
|
+
"b:27017": {
|
58
|
+
type: "RSPrimary",
|
59
|
+
setName: "rs",
|
60
|
+
electionId: {"$oid": "000000000000000000000002"}
|
61
|
+
}
|
62
|
+
},
|
63
|
+
topologyType: "ReplicaSetWithPrimary",
|
64
|
+
setName: "rs",
|
65
|
+
maxElectionId: {"$oid": "000000000000000000000002"}
|
66
|
+
}
|
67
|
+
},
|
68
|
+
|
69
|
+
# A still claims to be primary but it's ignored.
|
70
|
+
{
|
71
|
+
responses: [
|
72
|
+
["a:27017", {
|
73
|
+
ok: 1,
|
74
|
+
ismaster: true,
|
75
|
+
hosts: ["a:27017", "b:27017"],
|
76
|
+
setName: "rs",
|
77
|
+
electionId: {"$oid": "000000000000000000000001"}
|
78
|
+
}]
|
79
|
+
],
|
80
|
+
outcome: {
|
81
|
+
servers: {
|
82
|
+
"a:27017": {
|
83
|
+
type: "Unknown",
|
84
|
+
setName: ,
|
85
|
+
electionId:
|
86
|
+
},
|
87
|
+
"b:27017": {
|
88
|
+
type: "RSPrimary",
|
89
|
+
setName: "rs",
|
90
|
+
electionId: {"$oid": "000000000000000000000002"}
|
91
|
+
}
|
92
|
+
},
|
93
|
+
topologyType: "ReplicaSetWithPrimary",
|
94
|
+
setName: "rs",
|
95
|
+
maxElectionId: {"$oid": "000000000000000000000002"}
|
96
|
+
}
|
97
|
+
}
|
98
|
+
]
|