mongo 2.0.6 → 2.1.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
]
|