mongo 2.2.1 → 2.2.2
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 +1 -0
- data/lib/mongo/bson.rb +1 -1
- data/lib/mongo/cluster/topology/replica_set.rb +21 -4
- data/lib/mongo/collection/view/readable.rb +0 -1
- data/lib/mongo/error/operation_failure.rb +3 -1
- data/lib/mongo/grid/file.rb +14 -11
- data/lib/mongo/grid/file/chunk.rb +12 -10
- data/lib/mongo/grid/fs_bucket.rb +2 -2
- data/lib/mongo/grid/stream/read.rb +1 -1
- data/lib/mongo/grid/stream/write.rb +5 -5
- data/lib/mongo/options/mapper.rb +17 -0
- data/lib/mongo/protocol/message.rb +1 -1
- data/lib/mongo/server/connection.rb +3 -25
- data/lib/mongo/server/description.rb +19 -2
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo/write_concern/normalizable.rb +2 -1
- data/spec/mongo/client_spec.rb +1 -1
- data/spec/mongo/collection/view/readable_spec.rb +18 -0
- data/spec/mongo/grid/file/chunk_spec.rb +1 -0
- data/spec/mongo/grid/file_spec.rb +25 -6
- data/spec/mongo/grid/stream/write_spec.rb +11 -0
- data/spec/mongo/protocol/reply_spec.rb +13 -0
- data/spec/mongo/server/connection_spec.rb +4 -4
- data/spec/mongo/write_concern_spec.rb +15 -0
- data/spec/support/command_monitoring.rb +3 -0
- data/spec/support/sdam/rs/equal_electionids.yml +4 -0
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +7 -1
- data/spec/support/sdam/rs/new_primary_new_setversion.yml +101 -0
- data/spec/support/sdam/rs/null_election_id.yml +8 -1
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +37 -1
- data/spec/support/sdam/rs/primary_disconnect_setversion.yml +160 -0
- data/spec/support/sdam/rs/set_version_without_electionid.yml +69 -0
- data/spec/support/sdam/rs/setversion_without_electionid.yml +69 -0
- data/spec/support/sdam/rs/use_setversion_without_electionid.yml +99 -0
- metadata +36 -5
- metadata.gz.sig +1 -0
- data/lib/csasl/csasl.bundle +0 -0
@@ -57,13 +57,13 @@ describe Mongo::Grid::File do
|
|
57
57
|
described_class.new(data, :filename => 'test.txt')
|
58
58
|
end
|
59
59
|
|
60
|
-
it 'sets the data' do
|
61
|
-
expect(file.data).to eq(data)
|
62
|
-
end
|
63
|
-
|
64
60
|
it 'creates the chunks' do
|
65
61
|
expect(file.chunks.size).to eq(4)
|
66
62
|
end
|
63
|
+
|
64
|
+
it 'returns data' do
|
65
|
+
expect(file.data).to eq(data)
|
66
|
+
end
|
67
67
|
end
|
68
68
|
|
69
69
|
context 'when data is a ruby file' do
|
@@ -80,12 +80,31 @@ describe Mongo::Grid::File do
|
|
80
80
|
described_class.new(data, :filename => File.basename(ruby_file.path))
|
81
81
|
end
|
82
82
|
|
83
|
-
it '
|
83
|
+
it 'creates the chunks' do
|
84
|
+
expect(file.chunks.size).to eq(4)
|
85
|
+
end
|
86
|
+
|
87
|
+
it 'returns data' do
|
84
88
|
expect(file.data).to eq(data)
|
85
89
|
end
|
90
|
+
end
|
91
|
+
|
92
|
+
context 'when data is an IO object' do
|
93
|
+
|
94
|
+
let(:io) do
|
95
|
+
StringIO.new('testing')
|
96
|
+
end
|
97
|
+
|
98
|
+
let(:file) do
|
99
|
+
described_class.new(io, filename: "test.txt")
|
100
|
+
end
|
86
101
|
|
87
102
|
it 'creates the chunks' do
|
88
|
-
expect(file.chunks
|
103
|
+
expect(file.chunks).not_to be_empty
|
104
|
+
end
|
105
|
+
|
106
|
+
it 'returns data' do
|
107
|
+
expect(file.data).to eq 'testing'
|
89
108
|
end
|
90
109
|
end
|
91
110
|
|
@@ -66,6 +66,17 @@ describe Mongo::Grid::FSBucket::Stream::Write do
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
+
context 'when the fs does not have a write concern' do
|
70
|
+
|
71
|
+
let(:fs) do
|
72
|
+
authorized_client.with(write: nil).database.fs
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'uses the write concern default at the operation level' do
|
76
|
+
expect(stream.write(file).closed?).to eq(false)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
69
80
|
context 'when provided options' do
|
70
81
|
|
71
82
|
context 'when provided a write option' do
|
@@ -97,6 +97,19 @@ describe Mongo::Protocol::Reply do
|
|
97
97
|
end
|
98
98
|
end
|
99
99
|
|
100
|
+
context 'when the max message size is nil' do
|
101
|
+
|
102
|
+
let(:reply) { described_class.deserialize(io, nil) }
|
103
|
+
|
104
|
+
let(:length) { Mongo::Protocol::Message::MAX_MESSAGE_SIZE + 1 }
|
105
|
+
|
106
|
+
it 'uses the default max message size for comparison' do
|
107
|
+
expect {
|
108
|
+
reply
|
109
|
+
}.to raise_error(Mongo::Error::MaxMessageSize)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
100
113
|
describe 'response flags' do
|
101
114
|
|
102
115
|
context 'no flags' do
|
@@ -140,8 +140,8 @@ describe Mongo::Server::Connection do
|
|
140
140
|
connection.connect!
|
141
141
|
end
|
142
142
|
|
143
|
-
it 'sets the connection as
|
144
|
-
expect(connection).to
|
143
|
+
it 'sets the connection as connected' do
|
144
|
+
expect(connection).to be_connected
|
145
145
|
end
|
146
146
|
end
|
147
147
|
end
|
@@ -433,8 +433,8 @@ describe Mongo::Server::Connection do
|
|
433
433
|
)
|
434
434
|
end
|
435
435
|
|
436
|
-
it 'sets the
|
437
|
-
expect(connection.
|
436
|
+
it 'sets the auth options' do
|
437
|
+
expect(connection.options[:user]).to eq(user.name)
|
438
438
|
end
|
439
439
|
end
|
440
440
|
end
|
@@ -122,5 +122,20 @@ describe Mongo::WriteConcern do
|
|
122
122
|
expect(Mongo::WriteConcern.get(options).options).to eq(options)
|
123
123
|
end
|
124
124
|
end
|
125
|
+
|
126
|
+
context 'when w is a symbol' do
|
127
|
+
|
128
|
+
let(:options) do
|
129
|
+
{ w: :majority, journal: true }
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'returns an Acknowledged write concern object' do
|
133
|
+
expect(Mongo::WriteConcern.get(options)).to be_a(Mongo::WriteConcern::Acknowledged)
|
134
|
+
end
|
135
|
+
|
136
|
+
it 'sets w to a string' do
|
137
|
+
expect(Mongo::WriteConcern.get(options).options[:w]).to eq('majority')
|
138
|
+
end
|
139
|
+
end
|
125
140
|
end
|
126
141
|
end
|
@@ -129,6 +129,9 @@ module Mongo
|
|
129
129
|
#
|
130
130
|
# @since 2.1.0
|
131
131
|
def hash_matches?(actual, expected)
|
132
|
+
if expected['writeConcern']
|
133
|
+
expected['writeConcern'] = Options::Mapper.transform_keys_to_symbols(expected['writeConcern'])
|
134
|
+
end
|
132
135
|
if expected.keys.first == '$numberLong'
|
133
136
|
converted = expected.values.first.to_i
|
134
137
|
(actual == converted) || actual >= 0
|
@@ -12,6 +12,7 @@ phases: [
|
|
12
12
|
ismaster: true,
|
13
13
|
hosts: ["a:27017", "b:27017"],
|
14
14
|
setName: "rs",
|
15
|
+
setVersion: 1,
|
15
16
|
electionId: {"$oid": "000000000000000000000001"}
|
16
17
|
}],
|
17
18
|
["b:27017", {
|
@@ -19,6 +20,7 @@ phases: [
|
|
19
20
|
ismaster: true,
|
20
21
|
hosts: ["a:27017", "b:27017"],
|
21
22
|
setName: "rs",
|
23
|
+
setVersion: 1,
|
22
24
|
electionId: {"$oid": "000000000000000000000001"}
|
23
25
|
}]
|
24
26
|
],
|
@@ -29,11 +31,13 @@ phases: [
|
|
29
31
|
"a:27017": {
|
30
32
|
type: "Unknown",
|
31
33
|
setName: ,
|
34
|
+
setVersion: ,
|
32
35
|
electionId:
|
33
36
|
},
|
34
37
|
"b:27017": {
|
35
38
|
type: "RSPrimary",
|
36
39
|
setName: "rs",
|
40
|
+
setVersion: 1,
|
37
41
|
electionId: {"$oid": "000000000000000000000001"}
|
38
42
|
}
|
39
43
|
},
|
@@ -1,4 +1,4 @@
|
|
1
|
-
description: "New primary with greater electionId"
|
1
|
+
description: "New primary with greater setVersion and electionId"
|
2
2
|
|
3
3
|
uri: "mongodb://a/?replicaSet=rs"
|
4
4
|
|
@@ -12,6 +12,7 @@ phases: [
|
|
12
12
|
ismaster: true,
|
13
13
|
hosts: ["a:27017", "b:27017"],
|
14
14
|
setName: "rs",
|
15
|
+
setVersion: 1,
|
15
16
|
electionId: {"$oid": "000000000000000000000001"}
|
16
17
|
}]
|
17
18
|
],
|
@@ -21,6 +22,7 @@ phases: [
|
|
21
22
|
"a:27017": {
|
22
23
|
type: "RSPrimary",
|
23
24
|
setName: "rs",
|
25
|
+
setVersion: 1,
|
24
26
|
electionId: {"$oid": "000000000000000000000001"}
|
25
27
|
},
|
26
28
|
"b:27017": {
|
@@ -42,6 +44,7 @@ phases: [
|
|
42
44
|
ismaster: true,
|
43
45
|
hosts: ["a:27017", "b:27017"],
|
44
46
|
setName: "rs",
|
47
|
+
setVersion: 1,
|
45
48
|
electionId: {"$oid": "000000000000000000000002"}
|
46
49
|
}]
|
47
50
|
],
|
@@ -56,6 +59,7 @@ phases: [
|
|
56
59
|
"b:27017": {
|
57
60
|
type: "RSPrimary",
|
58
61
|
setName: "rs",
|
62
|
+
setVersion: 1,
|
59
63
|
electionId: {"$oid": "000000000000000000000002"}
|
60
64
|
}
|
61
65
|
},
|
@@ -72,6 +76,7 @@ phases: [
|
|
72
76
|
ismaster: true,
|
73
77
|
hosts: ["a:27017", "b:27017"],
|
74
78
|
setName: "rs",
|
79
|
+
setVersion: 1,
|
75
80
|
electionId: {"$oid": "000000000000000000000001"}
|
76
81
|
}]
|
77
82
|
],
|
@@ -85,6 +90,7 @@ phases: [
|
|
85
90
|
"b:27017": {
|
86
91
|
type: "RSPrimary",
|
87
92
|
setName: "rs",
|
93
|
+
setVersion: 1,
|
88
94
|
electionId: {"$oid": "000000000000000000000002"}
|
89
95
|
}
|
90
96
|
},
|
@@ -0,0 +1,101 @@
|
|
1
|
+
description: "New primary with greater setVersion"
|
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
|
+
setVersion: 1,
|
16
|
+
electionId: {"$oid": "000000000000000000000001"}
|
17
|
+
}]
|
18
|
+
],
|
19
|
+
|
20
|
+
outcome: {
|
21
|
+
servers: {
|
22
|
+
"a:27017": {
|
23
|
+
type: "RSPrimary",
|
24
|
+
setName: "rs",
|
25
|
+
setVersion: 1,
|
26
|
+
electionId: {"$oid": "000000000000000000000001"}
|
27
|
+
},
|
28
|
+
"b:27017": {
|
29
|
+
type: "Unknown",
|
30
|
+
setName: ,
|
31
|
+
electionId:
|
32
|
+
}
|
33
|
+
},
|
34
|
+
topologyType: "ReplicaSetWithPrimary",
|
35
|
+
setName: "rs",
|
36
|
+
}
|
37
|
+
},
|
38
|
+
|
39
|
+
# RS is reconfigured and B is elected.
|
40
|
+
{
|
41
|
+
responses: [
|
42
|
+
["b:27017", {
|
43
|
+
ok: 1,
|
44
|
+
ismaster: true,
|
45
|
+
hosts: ["a:27017", "b:27017"],
|
46
|
+
setName: "rs",
|
47
|
+
setVersion: 2,
|
48
|
+
electionId: {"$oid": "000000000000000000000001"}
|
49
|
+
}]
|
50
|
+
],
|
51
|
+
|
52
|
+
outcome: {
|
53
|
+
servers: {
|
54
|
+
"a:27017": {
|
55
|
+
type: "Unknown",
|
56
|
+
setName: ,
|
57
|
+
electionId:
|
58
|
+
},
|
59
|
+
"b:27017": {
|
60
|
+
type: "RSPrimary",
|
61
|
+
setName: "rs",
|
62
|
+
setVersion: 2,
|
63
|
+
electionId: {"$oid": "000000000000000000000001"}
|
64
|
+
}
|
65
|
+
},
|
66
|
+
topologyType: "ReplicaSetWithPrimary",
|
67
|
+
setName: "rs",
|
68
|
+
}
|
69
|
+
},
|
70
|
+
|
71
|
+
# A still claims to be primary but it's ignored.
|
72
|
+
{
|
73
|
+
responses: [
|
74
|
+
["a:27017", {
|
75
|
+
ok: 1,
|
76
|
+
ismaster: true,
|
77
|
+
hosts: ["a:27017", "b:27017"],
|
78
|
+
setName: "rs",
|
79
|
+
setVersion: 1,
|
80
|
+
electionId: {"$oid": "000000000000000000000001"}
|
81
|
+
}]
|
82
|
+
],
|
83
|
+
outcome: {
|
84
|
+
servers: {
|
85
|
+
"a:27017": {
|
86
|
+
type: "Unknown",
|
87
|
+
setName: ,
|
88
|
+
electionId:
|
89
|
+
},
|
90
|
+
"b:27017": {
|
91
|
+
type: "RSPrimary",
|
92
|
+
setName: "rs",
|
93
|
+
setVersion: 2,
|
94
|
+
electionId: {"$oid": "000000000000000000000002"}
|
95
|
+
}
|
96
|
+
},
|
97
|
+
topologyType: "ReplicaSetWithPrimary",
|
98
|
+
setName: "rs",
|
99
|
+
}
|
100
|
+
}
|
101
|
+
]
|
@@ -11,6 +11,7 @@ phases: [
|
|
11
11
|
ok: 1,
|
12
12
|
ismaster: true,
|
13
13
|
hosts: ["a:27017", "b:27017", "c:27017"],
|
14
|
+
setVersion: 1,
|
14
15
|
setName: "rs"
|
15
16
|
}]
|
16
17
|
],
|
@@ -20,6 +21,7 @@ phases: [
|
|
20
21
|
"a:27017": {
|
21
22
|
type: "RSPrimary",
|
22
23
|
setName: "rs",
|
24
|
+
setVersion: 1,
|
23
25
|
electionId:
|
24
26
|
},
|
25
27
|
"b:27017": {
|
@@ -46,6 +48,7 @@ phases: [
|
|
46
48
|
ismaster: true,
|
47
49
|
hosts: ["a:27017", "b:27017", "c:27017"],
|
48
50
|
setName: "rs",
|
51
|
+
setVersion: 1,
|
49
52
|
electionId: {"$oid": "000000000000000000000002"}
|
50
53
|
}]
|
51
54
|
],
|
@@ -60,6 +63,7 @@ phases: [
|
|
60
63
|
"b:27017": {
|
61
64
|
type: "RSPrimary",
|
62
65
|
setName: "rs",
|
66
|
+
setVersion: 1,
|
63
67
|
electionId: {"$oid": "000000000000000000000002"}
|
64
68
|
},
|
65
69
|
"c:27017": {
|
@@ -80,6 +84,7 @@ phases: [
|
|
80
84
|
ok: 1,
|
81
85
|
ismaster: true,
|
82
86
|
hosts: ["a:27017", "b:27017", "c:27017"],
|
87
|
+
setVersion: 1,
|
83
88
|
setName: "rs"
|
84
89
|
}]
|
85
90
|
],
|
@@ -88,6 +93,7 @@ phases: [
|
|
88
93
|
"a:27017": {
|
89
94
|
type: "RSPrimary",
|
90
95
|
setName: "rs",
|
96
|
+
setVersion: 1,
|
91
97
|
electionId:
|
92
98
|
},
|
93
99
|
"b:27017": {
|
@@ -106,7 +112,7 @@ phases: [
|
|
106
112
|
}
|
107
113
|
},
|
108
114
|
|
109
|
-
# But we remember
|
115
|
+
# But we remember B's electionId, so when we finally hear from C
|
110
116
|
# claiming it is primary, we ignore it due to its outdated electionId
|
111
117
|
{
|
112
118
|
responses: [
|
@@ -115,6 +121,7 @@ phases: [
|
|
115
121
|
ismaster: true,
|
116
122
|
hosts: ["a:27017", "b:27017", "c:27017"],
|
117
123
|
setName: "rs",
|
124
|
+
setVersion: 1,
|
118
125
|
electionId: {"$oid": "000000000000000000000001"}
|
119
126
|
}]
|
120
127
|
],
|
@@ -1,4 +1,4 @@
|
|
1
|
-
description: "Disconnected from primary, reject stale
|
1
|
+
description: "Disconnected from primary, reject primary with stale electionId"
|
2
2
|
|
3
3
|
uri: "mongodb://a/?replicaSet=rs"
|
4
4
|
|
@@ -12,6 +12,7 @@ phases: [
|
|
12
12
|
ismaster: true,
|
13
13
|
hosts: ["a:27017", "b:27017"],
|
14
14
|
setName: "rs",
|
15
|
+
setVersion: 1,
|
15
16
|
electionId: {"$oid": "000000000000000000000001"}
|
16
17
|
}],
|
17
18
|
["b:27017", {
|
@@ -19,6 +20,7 @@ phases: [
|
|
19
20
|
ismaster: true,
|
20
21
|
hosts: ["a:27017", "b:27017"],
|
21
22
|
setName: "rs",
|
23
|
+
setVersion: 1,
|
22
24
|
electionId: {"$oid": "000000000000000000000002"}
|
23
25
|
}]
|
24
26
|
],
|
@@ -33,6 +35,7 @@ phases: [
|
|
33
35
|
"b:27017": {
|
34
36
|
type: "RSPrimary",
|
35
37
|
setName: "rs",
|
38
|
+
setVersion: 1,
|
36
39
|
electionId: {"$oid": "000000000000000000000002"}
|
37
40
|
}
|
38
41
|
},
|
@@ -72,6 +75,7 @@ phases: [
|
|
72
75
|
ismaster: true,
|
73
76
|
hosts: ["a:27017", "b:27017"],
|
74
77
|
setName: "rs",
|
78
|
+
setVersion: 1,
|
75
79
|
electionId: {"$oid": "000000000000000000000001"}
|
76
80
|
}]
|
77
81
|
],
|
@@ -101,6 +105,7 @@ phases: [
|
|
101
105
|
ismaster: true,
|
102
106
|
hosts: ["a:27017", "b:27017"],
|
103
107
|
setName: "rs",
|
108
|
+
setVersion: 1,
|
104
109
|
electionId: {"$oid": "000000000000000000000003"}
|
105
110
|
}]
|
106
111
|
],
|
@@ -109,6 +114,7 @@ phases: [
|
|
109
114
|
"a:27017": {
|
110
115
|
type: "RSPrimary",
|
111
116
|
setName: "rs",
|
117
|
+
setVersion: 1,
|
112
118
|
electionId: {"$oid": "000000000000000000000003"}
|
113
119
|
},
|
114
120
|
"b:27017": {
|
@@ -120,5 +126,35 @@ phases: [
|
|
120
126
|
topologyType: "ReplicaSetWithPrimary",
|
121
127
|
setName: "rs",
|
122
128
|
}
|
129
|
+
},
|
130
|
+
|
131
|
+
# B comes back as secondary.
|
132
|
+
{
|
133
|
+
responses: [
|
134
|
+
["b:27017", {
|
135
|
+
ok: 1,
|
136
|
+
ismaster: false,
|
137
|
+
secondary: true,
|
138
|
+
hosts: ["a:27017", "b:27017"],
|
139
|
+
setName: "rs",
|
140
|
+
setVersion: 2
|
141
|
+
}]
|
142
|
+
],
|
143
|
+
outcome: {
|
144
|
+
servers: {
|
145
|
+
"a:27017": {
|
146
|
+
type: "RSPrimary",
|
147
|
+
setName: "rs",
|
148
|
+
setVersion: 1,
|
149
|
+
electionId: {"$oid": "000000000000000000000002"}
|
150
|
+
},
|
151
|
+
"b:27017": {
|
152
|
+
type: "RSSecondary",
|
153
|
+
setName: "rs"
|
154
|
+
}
|
155
|
+
},
|
156
|
+
topologyType: "ReplicaSetWithPrimary",
|
157
|
+
setName: "rs",
|
158
|
+
}
|
123
159
|
}
|
124
160
|
]
|