mongo 2.10.1 → 2.10.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 +0 -0
- data/lib/mongo/client.rb +1 -1
- data/lib/mongo/collection.rb +1 -1
- data/lib/mongo/database.rb +31 -0
- data/lib/mongo/server_selector/selectable.rb +32 -3
- data/lib/mongo/version.rb +1 -1
- data/spec/integration/retryable_writes_spec.rb +17 -0
- data/spec/mongo/server_selector_spec.rb +45 -0
- data/spec/support/common_shortcuts.rb +5 -1
- metadata +2 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d640dac0ce599ea7aa742522d55ead0bd20a2f3f4d9a8c632c28eb5090d38b44
|
4
|
+
data.tar.gz: cb6993b9aa97c89f93e6e4018aaa7f2f5de0473566162364d5f8beb6f49df2b8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11e03d68d1209e627911032bc2e818c77d100afde0f7b5b0b3166c4b52be2224f50299d086edbfb41b20151e5ea8985cb1c79b095047d72c313830836fd8b4b3
|
7
|
+
data.tar.gz: f450cba2ee21f571c4eb9e94029dc1d883158409fb9e7d2012633466b4445cb659264e0d2f971a0b3b96d699c631cc6d444e20ff5183a18a428b1ced7518f463
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/lib/mongo/client.rb
CHANGED
@@ -709,7 +709,7 @@ module Mongo
|
|
709
709
|
cmd = { listDatabases: 1 }
|
710
710
|
cmd[:nameOnly] = !!name_only
|
711
711
|
cmd[:filter] = filter unless filter.empty?
|
712
|
-
use(Database::ADMIN).
|
712
|
+
use(Database::ADMIN).database.read_command(cmd, opts).first[Database::DATABASES]
|
713
713
|
end
|
714
714
|
|
715
715
|
# Returns a list of Mongo::Database objects.
|
data/lib/mongo/collection.rb
CHANGED
@@ -212,7 +212,7 @@ module Mongo
|
|
212
212
|
#
|
213
213
|
# @since 2.0.0
|
214
214
|
def capped?
|
215
|
-
database.
|
215
|
+
database.read_command(:collstats => name).documents[0][CAPPED]
|
216
216
|
end
|
217
217
|
|
218
218
|
# Force the collection to be created in the database.
|
data/lib/mongo/database.rb
CHANGED
@@ -159,6 +159,37 @@ module Mongo
|
|
159
159
|
#
|
160
160
|
# @return [ Hash ] The result of the command execution.
|
161
161
|
def command(operation, opts = {})
|
162
|
+
txn_read_pref = if opts[:session] && opts[:session].in_transaction?
|
163
|
+
opts[:session].txn_read_preference
|
164
|
+
else
|
165
|
+
nil
|
166
|
+
end
|
167
|
+
txn_read_pref ||= opts[:read] || ServerSelector::PRIMARY
|
168
|
+
Lint.validate_underscore_read_preference(txn_read_pref)
|
169
|
+
selector = ServerSelector.get(txn_read_pref)
|
170
|
+
|
171
|
+
client.send(:with_session, opts) do |session|
|
172
|
+
server = selector.select_server(cluster, nil, session)
|
173
|
+
Operation::Command.new({
|
174
|
+
:selector => operation.dup,
|
175
|
+
:db_name => name,
|
176
|
+
:read => selector,
|
177
|
+
:session => session
|
178
|
+
}).execute(server)
|
179
|
+
end
|
180
|
+
end
|
181
|
+
|
182
|
+
# Execute a read command on the database, retrying the read if necessary.
|
183
|
+
#
|
184
|
+
# @param [ Hash ] operation The command to execute.
|
185
|
+
# @param [ Hash ] opts The command options.
|
186
|
+
#
|
187
|
+
# @option opts :read [ Hash ] The read preference for this command.
|
188
|
+
# @option opts :session [ Session ] The session to use for this command.
|
189
|
+
#
|
190
|
+
# @return [ Hash ] The result of the command execution.
|
191
|
+
# @api private
|
192
|
+
def read_command(operation, opts = {})
|
162
193
|
txn_read_pref = if opts[:session] && opts[:session].in_transaction?
|
163
194
|
opts[:session].txn_read_preference
|
164
195
|
else
|
@@ -193,6 +193,12 @@ module Mongo
|
|
193
193
|
servers = candidates(cluster)
|
194
194
|
if Lint.enabled?
|
195
195
|
servers.each do |server|
|
196
|
+
# It is possible for a server to have a nil average RTT here
|
197
|
+
# because the ARTT comes from description which may be updated
|
198
|
+
# by a background thread while server selection is running.
|
199
|
+
# Currently lint mode is not a public feature, if/when this
|
200
|
+
# changes (https://jira.mongodb.org/browse/RUBY-1576) the
|
201
|
+
# requirement for ARTT to be not nil would need to be removed.
|
196
202
|
if server.average_round_trip_time.nil?
|
197
203
|
raise Error::LintError, "Server #{server.address} has nil average rtt"
|
198
204
|
end
|
@@ -361,11 +367,34 @@ module Mongo
|
|
361
367
|
# @since 2.0.0
|
362
368
|
def near_servers(candidates = [], local_threshold = nil)
|
363
369
|
return candidates if candidates.empty?
|
364
|
-
|
370
|
+
|
371
|
+
# Average RTT on any server may change at any time by the server
|
372
|
+
# monitor's background thread. ARTT may also become nil if the
|
373
|
+
# server is marked unknown. Take a snapshot of ARTTs for the duration
|
374
|
+
# of this method.
|
375
|
+
|
376
|
+
candidates = candidates.map do |server|
|
377
|
+
{server: server, artt: server.average_round_trip_time}
|
378
|
+
end.reject do |candidate|
|
379
|
+
candidate[:artt].nil?
|
380
|
+
end
|
381
|
+
|
382
|
+
return candidates if candidates.empty?
|
383
|
+
|
384
|
+
nearest_candidate = candidates.min_by do |candidate|
|
385
|
+
candidate[:artt]
|
386
|
+
end
|
387
|
+
|
365
388
|
# Default for legacy signarure
|
366
389
|
local_threshold ||= self.local_threshold
|
367
|
-
|
368
|
-
|
390
|
+
|
391
|
+
threshold = nearest_candidate[:artt] + local_threshold
|
392
|
+
|
393
|
+
candidates.select do |candidate|
|
394
|
+
candidate[:artt] <= threshold
|
395
|
+
end.map do |candidate|
|
396
|
+
candidate[:server]
|
397
|
+
end.shuffle!
|
369
398
|
end
|
370
399
|
|
371
400
|
# Select the servers matching the defined tag sets.
|
data/lib/mongo/version.rb
CHANGED
@@ -737,4 +737,21 @@ describe 'Retryable writes integration tests' do
|
|
737
737
|
|
738
738
|
it_behaves_like 'an operation that does not support retryable writes'
|
739
739
|
end
|
740
|
+
|
741
|
+
context 'when the operation is database#command' do
|
742
|
+
|
743
|
+
let(:operation) do
|
744
|
+
collection.database.command(ping: 1)
|
745
|
+
end
|
746
|
+
|
747
|
+
let(:expectation) do
|
748
|
+
0
|
749
|
+
end
|
750
|
+
|
751
|
+
let(:unsuccessful_retry_value) do
|
752
|
+
0
|
753
|
+
end
|
754
|
+
|
755
|
+
it_behaves_like 'an operation that does not support retryable writes'
|
756
|
+
end
|
740
757
|
end
|
@@ -564,4 +564,49 @@ describe Mongo::ServerSelector do
|
|
564
564
|
it_behaves_like 'staleness filter'
|
565
565
|
end
|
566
566
|
end
|
567
|
+
|
568
|
+
describe '#candidates' do
|
569
|
+
let(:selector) { Mongo::ServerSelector::Primary.new(options) }
|
570
|
+
|
571
|
+
let(:cluster) { double('cluster') }
|
572
|
+
|
573
|
+
let(:options) { {} }
|
574
|
+
|
575
|
+
context 'sharded' do
|
576
|
+
let(:servers) do
|
577
|
+
[make_server(:mongos)]
|
578
|
+
end
|
579
|
+
|
580
|
+
before do
|
581
|
+
allow(cluster).to receive(:single?).and_return(false)
|
582
|
+
allow(cluster).to receive(:sharded?).and_return(true)
|
583
|
+
allow(cluster).to receive(:options).and_return({})
|
584
|
+
allow(cluster).to receive(:servers).and_return(servers)
|
585
|
+
end
|
586
|
+
|
587
|
+
it 'returns the servers' do
|
588
|
+
expect(selector.candidates(cluster)).to eq(servers)
|
589
|
+
end
|
590
|
+
|
591
|
+
context 'with local threshold' do
|
592
|
+
let(:options) do
|
593
|
+
{local_threshold: 1}
|
594
|
+
end
|
595
|
+
|
596
|
+
it 'returns the servers' do
|
597
|
+
expect(selector.candidates(cluster)).to eq(servers)
|
598
|
+
end
|
599
|
+
|
600
|
+
context 'when servers become unknown' do
|
601
|
+
let(:servers) do
|
602
|
+
[make_server(:unknown)]
|
603
|
+
end
|
604
|
+
|
605
|
+
it 'returns an empty list' do
|
606
|
+
expect(selector.candidates(cluster)).to eq([])
|
607
|
+
end
|
608
|
+
end
|
609
|
+
end
|
610
|
+
end
|
611
|
+
end
|
567
612
|
end
|
@@ -74,7 +74,11 @@ module CommonShortcuts
|
|
74
74
|
|
75
75
|
def make_server(mode, options = {})
|
76
76
|
tags = options[:tags] || {}
|
77
|
-
average_round_trip_time =
|
77
|
+
average_round_trip_time = if mode == :unknown
|
78
|
+
nil
|
79
|
+
else
|
80
|
+
options[:average_round_trip_time] || 0
|
81
|
+
end
|
78
82
|
|
79
83
|
if mode == :unknown
|
80
84
|
ismaster = {}
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mongo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.10.
|
4
|
+
version: 2.10.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tyler Brock
|
@@ -31,7 +31,7 @@ cert_chain:
|
|
31
31
|
bMYVwXXhV8czdzgkQB/ZPWHSbEWXnmkze1mzvqWBCPOVXYrcnL9cnEl/RoxtS1hr
|
32
32
|
Db6Ac6mCUSYfYHBWpWqxjc45n70i5Xi1
|
33
33
|
-----END CERTIFICATE-----
|
34
|
-
date: 2019-
|
34
|
+
date: 2019-09-23 00:00:00.000000000 Z
|
35
35
|
dependencies:
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: bson
|
metadata.gz.sig
CHANGED
Binary file
|