mongo 2.1.0.rc0 → 2.1.0
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 +5 -2
- data.tar.gz.sig +0 -0
- data/Rakefile +2 -2
- data/lib/mongo.rb +2 -1
- data/lib/mongo/address.rb +11 -5
- data/lib/mongo/address/ipv4.rb +6 -1
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +1 -1
- data/lib/mongo/auth/scram/conversation.rb +1 -1
- data/lib/mongo/auth/user/view.rb +2 -2
- data/lib/mongo/auth/x509/conversation.rb +1 -1
- data/lib/mongo/bulk_write.rb +12 -9
- data/lib/mongo/bulk_write/transformable.rb +20 -5
- data/lib/mongo/client.rb +11 -11
- data/lib/mongo/cluster.rb +2 -2
- data/lib/mongo/collection.rb +21 -8
- data/lib/mongo/collection/view.rb +1 -0
- data/lib/mongo/collection/view/aggregation.rb +11 -5
- data/lib/mongo/collection/view/iterable.rb +6 -2
- data/lib/mongo/collection/view/map_reduce.rb +39 -5
- data/lib/mongo/collection/view/readable.rb +35 -30
- data/lib/mongo/collection/view/writable.rb +26 -18
- data/lib/mongo/database.rb +12 -2
- data/lib/mongo/database/view.rb +4 -3
- data/lib/mongo/dbref.rb +4 -4
- data/lib/mongo/grid/fs_bucket.rb +8 -1
- data/lib/mongo/grid/stream/read.rb +1 -1
- data/lib/mongo/index.rb +5 -0
- data/lib/mongo/index/view.rb +2 -2
- data/lib/mongo/monitoring/command_log_subscriber.rb +9 -3
- data/lib/mongo/monitoring/event.rb +1 -0
- data/lib/mongo/monitoring/event/command_started.rb +2 -1
- data/lib/mongo/monitoring/event/command_succeeded.rb +6 -3
- data/lib/mongo/monitoring/event/secure.rb +58 -0
- data/lib/mongo/operation.rb +31 -1
- data/lib/mongo/operation/commands/collections_info.rb +2 -0
- data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
- data/lib/mongo/operation/commands/list_indexes/result.rb +2 -1
- data/lib/mongo/operation/commands/map_reduce/result.rb +1 -1
- data/lib/mongo/operation/read/query.rb +2 -0
- data/lib/mongo/operation/read/query/result.rb +40 -0
- data/lib/mongo/operation/result.rb +13 -1
- data/lib/mongo/operation/write/bulk/delete.rb +2 -2
- data/lib/mongo/operation/write/bulk/update.rb +3 -3
- data/lib/mongo/operation/write/delete.rb +2 -2
- data/lib/mongo/operation/write/update.rb +9 -4
- data/lib/mongo/options.rb +1 -0
- data/lib/mongo/options/redacted.rb +156 -0
- data/lib/mongo/protocol/insert.rb +25 -6
- data/lib/mongo/protocol/query.rb +45 -31
- data/lib/mongo/protocol/reply.rb +29 -6
- data/lib/mongo/protocol/serializers.rb +1 -1
- data/lib/mongo/retryable.rb +83 -0
- data/lib/mongo/server.rb +16 -3
- data/lib/mongo/server/connectable.rb +21 -3
- data/lib/mongo/server/connection.rb +38 -4
- data/lib/mongo/server/connection_pool.rb +12 -0
- data/lib/mongo/server/connection_pool/queue.rb +15 -0
- data/lib/mongo/server/monitor/connection.rb +2 -2
- data/lib/mongo/server_selector.rb +5 -0
- data/lib/mongo/server_selector/selectable.rb +16 -9
- data/lib/mongo/socket.rb +6 -2
- data/lib/mongo/uri.rb +1 -1
- data/lib/mongo/version.rb +1 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +11 -11
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +10 -10
- data/spec/mongo/client_spec.rb +101 -18
- data/spec/mongo/collection_spec.rb +44 -0
- data/spec/mongo/connection_string_spec.rb +36 -58
- data/spec/mongo/database_spec.rb +20 -0
- data/spec/mongo/grid/fs_bucket_spec.rb +1 -1
- data/spec/mongo/grid/stream/write_spec.rb +2 -2
- data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
- data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
- data/spec/mongo/operation/commands/aggregate_spec.rb +0 -16
- data/spec/mongo/operation/commands/command_spec.rb +0 -18
- data/spec/mongo/operation/kill_cursors_spec.rb +0 -16
- data/spec/mongo/operation/read/get_more_spec.rb +0 -16
- data/spec/mongo/operation/read/query_spec.rb +19 -16
- data/spec/mongo/operation/write/bulk/delete_spec.rb +16 -16
- data/spec/mongo/operation/write/bulk/update_spec.rb +6 -6
- data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
- data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
- data/spec/mongo/operation/write/command/update_spec.rb +0 -16
- data/spec/mongo/operation/write/delete_spec.rb +3 -3
- data/spec/mongo/operation/write/update_spec.rb +6 -6
- data/spec/mongo/options/redacted_spec.rb +350 -0
- data/spec/mongo/protocol/query_spec.rb +15 -1
- data/spec/mongo/retryable_spec.rb +147 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
- data/spec/mongo/server/connection_pool_spec.rb +32 -0
- data/spec/mongo/server/connection_spec.rb +37 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +24 -59
- data/spec/mongo/server_selection_rtt_spec.rb +37 -57
- data/spec/mongo/server_selection_spec.rb +2 -0
- data/spec/mongo/server_selector/nearest_spec.rb +1 -0
- data/spec/mongo/server_selector/primary_preferred_spec.rb +1 -0
- data/spec/mongo/server_selector/primary_spec.rb +8 -2
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +1 -0
- data/spec/mongo/server_selector/secondary_spec.rb +1 -0
- data/spec/mongo/server_spec.rb +68 -1
- data/spec/mongo/socket/ssl_spec.rb +29 -5
- data/spec/mongo/uri_spec.rb +20 -20
- data/spec/support/crud.rb +7 -1
- data/spec/support/matchers.rb +1 -1
- data/spec/support/shared/server_selector.rb +58 -2
- metadata +20 -5
- metadata.gz.sig +0 -0
|
@@ -54,6 +54,18 @@ module Mongo
|
|
|
54
54
|
queue.dequeue
|
|
55
55
|
end
|
|
56
56
|
|
|
57
|
+
# Disconnect the connection pool.
|
|
58
|
+
#
|
|
59
|
+
# @example Disconnect the connection pool.
|
|
60
|
+
# pool.disconnect!
|
|
61
|
+
#
|
|
62
|
+
# @return [ true ] true.
|
|
63
|
+
#
|
|
64
|
+
# @since 2.1.0
|
|
65
|
+
def disconnect!
|
|
66
|
+
queue.disconnect!
|
|
67
|
+
end
|
|
68
|
+
|
|
57
69
|
# Create the new connection pool.
|
|
58
70
|
#
|
|
59
71
|
# @example Create the new connection pool.
|
|
@@ -63,6 +63,21 @@ module Mongo
|
|
|
63
63
|
end
|
|
64
64
|
end
|
|
65
65
|
|
|
66
|
+
# Disconnect all connections in the queue.
|
|
67
|
+
#
|
|
68
|
+
# @example Disconnect all connections.
|
|
69
|
+
# queue.disconnect!
|
|
70
|
+
#
|
|
71
|
+
# @return [ true ] Always true.
|
|
72
|
+
#
|
|
73
|
+
# @since 2.1.0
|
|
74
|
+
def disconnect!
|
|
75
|
+
mutex.synchronize do
|
|
76
|
+
queue.each{ |connection| connection.disconnect! }
|
|
77
|
+
true
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
66
81
|
# Enqueue a connection in the queue.
|
|
67
82
|
#
|
|
68
83
|
# @example Enqueue a connection.
|
|
@@ -36,7 +36,7 @@ module Mongo
|
|
|
36
36
|
def connect!
|
|
37
37
|
unless socket
|
|
38
38
|
@socket = address.socket(timeout, ssl_options)
|
|
39
|
-
|
|
39
|
+
socket.connect!
|
|
40
40
|
end
|
|
41
41
|
true
|
|
42
42
|
end
|
|
@@ -96,7 +96,7 @@ module Mongo
|
|
|
96
96
|
def initialize(address, options = {})
|
|
97
97
|
@address = address
|
|
98
98
|
@options = options.freeze
|
|
99
|
-
@ssl_options = options.reject { |k, v| !k.to_s.start_with?(
|
|
99
|
+
@ssl_options = options.reject { |k, v| !k.to_s.start_with?(SSL) }
|
|
100
100
|
@socket = nil
|
|
101
101
|
@pid = Process.pid
|
|
102
102
|
end
|
|
@@ -38,6 +38,11 @@ module Mongo
|
|
|
38
38
|
# @since 2.0.0
|
|
39
39
|
SERVER_SELECTION_TIMEOUT = 30.freeze
|
|
40
40
|
|
|
41
|
+
# Primary read preference.
|
|
42
|
+
#
|
|
43
|
+
# @since 2.1.0
|
|
44
|
+
PRIMARY = Options::Redacted.new(mode: :primary).freeze
|
|
45
|
+
|
|
41
46
|
# Hash lookup for the selector classes based off the symbols
|
|
42
47
|
# provided in configuration.
|
|
43
48
|
#
|
|
@@ -61,10 +61,10 @@ module Mongo
|
|
|
61
61
|
#
|
|
62
62
|
# @since 2.0.0
|
|
63
63
|
def initialize(options = {})
|
|
64
|
+
@options = (options || {}).freeze
|
|
64
65
|
tag_sets = options[:tag_sets] || []
|
|
65
66
|
validate_tag_sets!(tag_sets)
|
|
66
|
-
@tag_sets = tag_sets
|
|
67
|
-
@options = options
|
|
67
|
+
@tag_sets = tag_sets.freeze
|
|
68
68
|
end
|
|
69
69
|
|
|
70
70
|
# Select a server from eligible candidates.
|
|
@@ -80,14 +80,11 @@ module Mongo
|
|
|
80
80
|
def select_server(cluster)
|
|
81
81
|
deadline = Time.now + server_selection_timeout
|
|
82
82
|
while (deadline - Time.now) > 0
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
else
|
|
88
|
-
servers = select(cluster.servers)
|
|
83
|
+
servers = candidates(cluster)
|
|
84
|
+
if servers && !servers.compact.empty?
|
|
85
|
+
server = servers.first
|
|
86
|
+
return server if server.connectable?
|
|
89
87
|
end
|
|
90
|
-
return servers.first if servers && !servers.compact.empty?
|
|
91
88
|
cluster.scan!
|
|
92
89
|
end
|
|
93
90
|
raise Error::NoServerAvailable.new(self)
|
|
@@ -120,6 +117,16 @@ module Mongo
|
|
|
120
117
|
|
|
121
118
|
private
|
|
122
119
|
|
|
120
|
+
def candidates(cluster)
|
|
121
|
+
if cluster.single?
|
|
122
|
+
cluster.servers
|
|
123
|
+
elsif cluster.sharded?
|
|
124
|
+
near_servers(cluster.servers)
|
|
125
|
+
else
|
|
126
|
+
select(cluster.servers)
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
|
|
123
130
|
# Select the primary from a list of provided candidates.
|
|
124
131
|
#
|
|
125
132
|
# @param [ Array ] candidates List of candidate servers to select the
|
data/lib/mongo/socket.rb
CHANGED
|
@@ -54,7 +54,7 @@ module Mongo
|
|
|
54
54
|
#
|
|
55
55
|
# @return [ true, false ] If the socket is alive.
|
|
56
56
|
#
|
|
57
|
-
# @
|
|
57
|
+
# @deprecated Use #connectable? on the connection instead.
|
|
58
58
|
def alive?
|
|
59
59
|
sock_arr = [ @socket ]
|
|
60
60
|
if Kernel::select(sock_arr, nil, sock_arr, 0)
|
|
@@ -172,10 +172,14 @@ module Mongo
|
|
|
172
172
|
@socket.read(length) || String.new
|
|
173
173
|
end
|
|
174
174
|
|
|
175
|
+
def unix_socket?(sock)
|
|
176
|
+
defined?(UNIXSocket) && sock.is_a?(UNIXSocket)
|
|
177
|
+
end
|
|
178
|
+
|
|
175
179
|
def set_socket_options(sock)
|
|
176
180
|
sock.set_encoding(BSON::BINARY)
|
|
177
181
|
|
|
178
|
-
unless
|
|
182
|
+
unless unix_socket?(sock) && BSON::Environment.jruby?
|
|
179
183
|
encoded_timeout = [ timeout, 0 ].pack(TIMEOUT_PACK)
|
|
180
184
|
sock.setsockopt(SOL_SOCKET, SO_RCVTIMEO, encoded_timeout)
|
|
181
185
|
sock.setsockopt(SOL_SOCKET, SO_SNDTIMEO, encoded_timeout)
|
data/lib/mongo/uri.rb
CHANGED
|
@@ -268,7 +268,7 @@ module Mongo
|
|
|
268
268
|
|
|
269
269
|
def parse_db_opts!(string)
|
|
270
270
|
auth_db, d, uri_opts = string.partition(URI_OPTS_DELIM)
|
|
271
|
-
@uri_options = parse_uri_options!(uri_opts)
|
|
271
|
+
@uri_options = Options::Redacted.new(parse_uri_options!(uri_opts))
|
|
272
272
|
@database = parse_database!(auth_db)
|
|
273
273
|
end
|
|
274
274
|
|
data/lib/mongo/version.rb
CHANGED
|
@@ -24,8 +24,8 @@ describe Mongo::BulkWrite::OrderedCombiner do
|
|
|
24
24
|
[
|
|
25
25
|
{
|
|
26
26
|
delete_one: [
|
|
27
|
-
{ q
|
|
28
|
-
{ q
|
|
27
|
+
{ 'q' => { _id: 0 }, 'limit' => 1 },
|
|
28
|
+
{ 'q' => { _id: 1 }, 'limit' => 1 }
|
|
29
29
|
]
|
|
30
30
|
}
|
|
31
31
|
]
|
|
@@ -66,8 +66,8 @@ describe Mongo::BulkWrite::OrderedCombiner do
|
|
|
66
66
|
[
|
|
67
67
|
{
|
|
68
68
|
delete_many: [
|
|
69
|
-
{ q
|
|
70
|
-
{ q
|
|
69
|
+
{ 'q' => { _id: 0 }, 'limit' => 0 },
|
|
70
|
+
{ 'q' => { _id: 1 }, 'limit' => 0 }
|
|
71
71
|
]
|
|
72
72
|
}
|
|
73
73
|
]
|
|
@@ -137,8 +137,8 @@ describe Mongo::BulkWrite::OrderedCombiner do
|
|
|
137
137
|
[
|
|
138
138
|
{
|
|
139
139
|
replace_one: [
|
|
140
|
-
{ q
|
|
141
|
-
{ q
|
|
140
|
+
{ 'q' => { _id: 0 }, 'u' => { name: 'test' }, 'multi' => false, 'upsert' => false },
|
|
141
|
+
{ 'q' => { _id: 1 }, 'u' => { name: 'test' }, 'multi' => false, 'upsert' => false }
|
|
142
142
|
]
|
|
143
143
|
}
|
|
144
144
|
]
|
|
@@ -179,8 +179,8 @@ describe Mongo::BulkWrite::OrderedCombiner do
|
|
|
179
179
|
[
|
|
180
180
|
{
|
|
181
181
|
update_one: [
|
|
182
|
-
{ q
|
|
183
|
-
{ q
|
|
182
|
+
{ 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => false, 'upsert' => false },
|
|
183
|
+
{ 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => false, 'upsert' => false }
|
|
184
184
|
]
|
|
185
185
|
}
|
|
186
186
|
]
|
|
@@ -221,8 +221,8 @@ describe Mongo::BulkWrite::OrderedCombiner do
|
|
|
221
221
|
[
|
|
222
222
|
{
|
|
223
223
|
update_many: [
|
|
224
|
-
{ q
|
|
225
|
-
{ q
|
|
224
|
+
{ 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, 'upsert' => false },
|
|
225
|
+
{ 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, 'upsert' => false }
|
|
226
226
|
]
|
|
227
227
|
}
|
|
228
228
|
]
|
|
@@ -261,7 +261,7 @@ describe Mongo::BulkWrite::OrderedCombiner do
|
|
|
261
261
|
expect(combiner.combine).to eq(
|
|
262
262
|
[
|
|
263
263
|
{ insert_one: [{ _id: 0 }]},
|
|
264
|
-
{ delete_one: [{ q
|
|
264
|
+
{ delete_one: [{ 'q' => { _id: 0 }, 'limit' => 1 }]},
|
|
265
265
|
{ insert_one: [{ _id: 1 }]}
|
|
266
266
|
]
|
|
267
267
|
)
|
|
@@ -24,8 +24,8 @@ describe Mongo::BulkWrite::UnorderedCombiner do
|
|
|
24
24
|
[
|
|
25
25
|
{
|
|
26
26
|
delete_one: [
|
|
27
|
-
{ q
|
|
28
|
-
{ q
|
|
27
|
+
{ 'q' => { _id: 0 }, 'limit' => 1 },
|
|
28
|
+
{ 'q' => { _id: 1 }, 'limit' => 1 }
|
|
29
29
|
]
|
|
30
30
|
}
|
|
31
31
|
]
|
|
@@ -66,8 +66,8 @@ describe Mongo::BulkWrite::UnorderedCombiner do
|
|
|
66
66
|
[
|
|
67
67
|
{
|
|
68
68
|
delete_many: [
|
|
69
|
-
{ q
|
|
70
|
-
{ q
|
|
69
|
+
{ 'q' => { _id: 0 }, 'limit' => 0 },
|
|
70
|
+
{ 'q' => { _id: 1 }, 'limit' => 0 }
|
|
71
71
|
]
|
|
72
72
|
}
|
|
73
73
|
]
|
|
@@ -137,8 +137,8 @@ describe Mongo::BulkWrite::UnorderedCombiner do
|
|
|
137
137
|
[
|
|
138
138
|
{
|
|
139
139
|
update_one: [
|
|
140
|
-
{ q
|
|
141
|
-
{ q
|
|
140
|
+
{ 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => false, 'upsert' => false },
|
|
141
|
+
{ 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => false, 'upsert' => false }
|
|
142
142
|
]
|
|
143
143
|
}
|
|
144
144
|
]
|
|
@@ -179,8 +179,8 @@ describe Mongo::BulkWrite::UnorderedCombiner do
|
|
|
179
179
|
[
|
|
180
180
|
{
|
|
181
181
|
update_many: [
|
|
182
|
-
{ q
|
|
183
|
-
{ q
|
|
182
|
+
{ 'q' => { _id: 0 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, 'upsert' => false },
|
|
183
|
+
{ 'q' => { _id: 1 }, 'u' => { '$set' => { name: 'test' }}, 'multi' => true, 'upsert' => false }
|
|
184
184
|
]
|
|
185
185
|
}
|
|
186
186
|
]
|
|
@@ -227,8 +227,8 @@ describe Mongo::BulkWrite::UnorderedCombiner do
|
|
|
227
227
|
},
|
|
228
228
|
{
|
|
229
229
|
delete_one: [
|
|
230
|
-
{ q
|
|
231
|
-
{ q
|
|
230
|
+
{ 'q' => { _id: 0 }, 'limit' => 1 },
|
|
231
|
+
{ 'q' => { _id: 1 }, 'limit' => 1 }
|
|
232
232
|
]
|
|
233
233
|
}
|
|
234
234
|
]
|
data/spec/mongo/client_spec.rb
CHANGED
|
@@ -167,16 +167,20 @@ describe Mongo::Client do
|
|
|
167
167
|
['127.0.0.1:27017'],
|
|
168
168
|
:read => { :mode => :primary },
|
|
169
169
|
:local_threshold_ms => 10,
|
|
170
|
-
:
|
|
170
|
+
:server_selection_timeout => 10000,
|
|
171
171
|
:database => TEST_DB
|
|
172
172
|
)
|
|
173
173
|
end
|
|
174
174
|
|
|
175
|
+
let(:options) do
|
|
176
|
+
Mongo::Options::Redacted.new(:read => { :mode => :primary },
|
|
177
|
+
:local_threshold_ms => 10,
|
|
178
|
+
:server_selection_timeout => 10000,
|
|
179
|
+
:database => TEST_DB)
|
|
180
|
+
end
|
|
181
|
+
|
|
175
182
|
let(:expected) do
|
|
176
|
-
[client.cluster,
|
|
177
|
-
:local_threshold_ms => 10,
|
|
178
|
-
:server_selection_timeout_ms => 10000,
|
|
179
|
-
:database => TEST_DB }].hash
|
|
183
|
+
[client.cluster, options].hash
|
|
180
184
|
end
|
|
181
185
|
|
|
182
186
|
it 'returns a hash of the cluster and options' do
|
|
@@ -199,6 +203,23 @@ describe Mongo::Client do
|
|
|
199
203
|
"<Mongo::Client:0x#{client.object_id} cluster=127.0.0.1:27017"
|
|
200
204
|
)
|
|
201
205
|
end
|
|
206
|
+
|
|
207
|
+
context 'when there is sensitive data in the options' do
|
|
208
|
+
|
|
209
|
+
let(:client) do
|
|
210
|
+
described_class.new(
|
|
211
|
+
['127.0.0.1:27017'],
|
|
212
|
+
:read => { :mode => :primary },
|
|
213
|
+
:database => TEST_DB,
|
|
214
|
+
:password => 'some_password',
|
|
215
|
+
:user => 'emily'
|
|
216
|
+
)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
it 'does not print out sensitive data' do
|
|
220
|
+
expect(client.inspect).not_to match('some_password')
|
|
221
|
+
end
|
|
222
|
+
end
|
|
202
223
|
end
|
|
203
224
|
|
|
204
225
|
describe '#initialize' do
|
|
@@ -291,8 +312,12 @@ describe Mongo::Client do
|
|
|
291
312
|
described_class.new(uri)
|
|
292
313
|
end
|
|
293
314
|
|
|
315
|
+
let(:expected_options) do
|
|
316
|
+
Mongo::Options::Redacted.new(:write => { :w => 3 }, :database => 'testdb')
|
|
317
|
+
end
|
|
318
|
+
|
|
294
319
|
it 'sets the options' do
|
|
295
|
-
expect(client.options).to eq(
|
|
320
|
+
expect(client.options).to eq(expected_options)
|
|
296
321
|
end
|
|
297
322
|
end
|
|
298
323
|
|
|
@@ -306,8 +331,12 @@ describe Mongo::Client do
|
|
|
306
331
|
described_class.new(uri, :write => { :w => 3 })
|
|
307
332
|
end
|
|
308
333
|
|
|
334
|
+
let(:expected_options) do
|
|
335
|
+
Mongo::Options::Redacted.new(:write => { :w => 3 }, :database => 'testdb')
|
|
336
|
+
end
|
|
337
|
+
|
|
309
338
|
it 'sets the options' do
|
|
310
|
-
expect(client.options).to eq(
|
|
339
|
+
expect(client.options).to eq(expected_options)
|
|
311
340
|
end
|
|
312
341
|
end
|
|
313
342
|
|
|
@@ -321,8 +350,12 @@ describe Mongo::Client do
|
|
|
321
350
|
described_class.new(uri, :write => { :w => 4 })
|
|
322
351
|
end
|
|
323
352
|
|
|
353
|
+
let(:expected_options) do
|
|
354
|
+
Mongo::Options::Redacted.new(:write => { :w => 4 }, :database => 'testdb')
|
|
355
|
+
end
|
|
356
|
+
|
|
324
357
|
it 'allows explicit options to take preference' do
|
|
325
|
-
expect(client.options).to eq(
|
|
358
|
+
expect(client.options).to eq(expected_options)
|
|
326
359
|
end
|
|
327
360
|
end
|
|
328
361
|
|
|
@@ -348,7 +381,8 @@ describe Mongo::Client do
|
|
|
348
381
|
let(:client) do
|
|
349
382
|
described_class.new(['127.0.0.1:27017'],
|
|
350
383
|
:database => TEST_DB,
|
|
351
|
-
:read => mode
|
|
384
|
+
:read => mode,
|
|
385
|
+
:server_selection_timeout => 2)
|
|
352
386
|
end
|
|
353
387
|
|
|
354
388
|
let(:preference) do
|
|
@@ -366,7 +400,7 @@ describe Mongo::Client do
|
|
|
366
400
|
end
|
|
367
401
|
|
|
368
402
|
it 'passes the options to the read preference' do
|
|
369
|
-
expect(preference.options[:
|
|
403
|
+
expect(preference.options[:server_selection_timeout]).to eq(2)
|
|
370
404
|
end
|
|
371
405
|
end
|
|
372
406
|
|
|
@@ -424,6 +458,33 @@ describe Mongo::Client do
|
|
|
424
458
|
expect(preference).to be_a(Mongo::ServerSelector::Primary)
|
|
425
459
|
end
|
|
426
460
|
end
|
|
461
|
+
|
|
462
|
+
context 'when the read preference is printed' do
|
|
463
|
+
|
|
464
|
+
let(:client) do
|
|
465
|
+
described_class.new([ DEFAULT_ADDRESS ], options)
|
|
466
|
+
end
|
|
467
|
+
|
|
468
|
+
let(:options) do
|
|
469
|
+
{ user: 'Emily', password: 'sensitive_data', server_selection_timeout: 0.1 }
|
|
470
|
+
end
|
|
471
|
+
|
|
472
|
+
before do
|
|
473
|
+
allow(client.database.cluster).to receive(:single?).and_return(false)
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
let(:error) do
|
|
477
|
+
begin
|
|
478
|
+
client.database.command(ping: 1)
|
|
479
|
+
rescue => e
|
|
480
|
+
e
|
|
481
|
+
end
|
|
482
|
+
end
|
|
483
|
+
|
|
484
|
+
it 'redacts sensitive client options' do
|
|
485
|
+
expect(error.message).not_to match(options[:password])
|
|
486
|
+
end
|
|
487
|
+
end
|
|
427
488
|
end
|
|
428
489
|
|
|
429
490
|
describe '#use' do
|
|
@@ -497,20 +558,28 @@ describe Mongo::Client do
|
|
|
497
558
|
client.with(:read => { :mode => :primary })
|
|
498
559
|
end
|
|
499
560
|
|
|
561
|
+
let(:new_options) do
|
|
562
|
+
Mongo::Options::Redacted.new(:read => { :mode => :primary },
|
|
563
|
+
:write => { :w => 1 },
|
|
564
|
+
:database => TEST_DB)
|
|
565
|
+
end
|
|
566
|
+
|
|
567
|
+
let(:original_options) do
|
|
568
|
+
Mongo::Options::Redacted.new(:read => { :mode => :secondary },
|
|
569
|
+
:write => { :w => 1 },
|
|
570
|
+
:database => TEST_DB)
|
|
571
|
+
end
|
|
572
|
+
|
|
500
573
|
it 'returns a new client' do
|
|
501
574
|
expect(new_client).not_to equal(client)
|
|
502
575
|
end
|
|
503
576
|
|
|
504
577
|
it 'replaces the existing options' do
|
|
505
|
-
expect(new_client.options).to eq(
|
|
506
|
-
:read => { :mode => :primary }, :write => { :w => 1 }, :database => TEST_DB
|
|
507
|
-
})
|
|
578
|
+
expect(new_client.options).to eq(new_options)
|
|
508
579
|
end
|
|
509
580
|
|
|
510
581
|
it 'does not modify the original client' do
|
|
511
|
-
expect(client.options).to eq(
|
|
512
|
-
:read => { :mode => :secondary }, :write => { :w => 1 }, :database => TEST_DB
|
|
513
|
-
})
|
|
582
|
+
expect(client.options).to eq(original_options)
|
|
514
583
|
end
|
|
515
584
|
|
|
516
585
|
it 'keeps the same cluster' do
|
|
@@ -579,7 +648,7 @@ describe Mongo::Client do
|
|
|
579
648
|
end
|
|
580
649
|
|
|
581
650
|
it 'returns a acknowledged write concern' do
|
|
582
|
-
expect(concern.get_last_error).to eq(:getlasterror => 1,
|
|
651
|
+
expect(concern.get_last_error).to eq(:getlasterror => 1, 'j' => true)
|
|
583
652
|
end
|
|
584
653
|
end
|
|
585
654
|
|
|
@@ -656,7 +725,21 @@ describe Mongo::Client do
|
|
|
656
725
|
|
|
657
726
|
it 'reconnects the cluster and returns true' do
|
|
658
727
|
expect(client.reconnect).to be(true)
|
|
659
|
-
|
|
728
|
+
end
|
|
729
|
+
end
|
|
730
|
+
|
|
731
|
+
describe '#dup' do
|
|
732
|
+
|
|
733
|
+
let(:client) do
|
|
734
|
+
described_class.new(
|
|
735
|
+
['127.0.0.1:27017'],
|
|
736
|
+
:read => { :mode => :primary },
|
|
737
|
+
:database => TEST_DB
|
|
738
|
+
)
|
|
739
|
+
end
|
|
740
|
+
|
|
741
|
+
it 'creates a client with Redacted options' do
|
|
742
|
+
expect(client.dup.options).to be_a(Mongo::Options::Redacted)
|
|
660
743
|
end
|
|
661
744
|
end
|
|
662
745
|
end
|