mongo 2.13.0.beta1 → 2.13.0.rc1
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 +1 -5
- data/Rakefile +15 -9
- data/lib/mongo.rb +4 -2
- data/lib/mongo/auth/aws/request.rb +4 -2
- data/lib/mongo/bulk_write.rb +1 -0
- data/lib/mongo/client.rb +143 -21
- data/lib/mongo/cluster.rb +53 -17
- data/lib/mongo/cluster/sdam_flow.rb +13 -10
- data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -2
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/single.rb +1 -1
- data/lib/mongo/collection.rb +17 -13
- data/lib/mongo/collection/view/readable.rb +3 -1
- data/lib/mongo/collection/view/writable.rb +41 -5
- data/lib/mongo/database.rb +31 -4
- data/lib/mongo/database/view.rb +19 -4
- data/lib/mongo/distinguishing_semaphore.rb +55 -0
- data/lib/mongo/error.rb +1 -0
- data/lib/mongo/error/invalid_session.rb +2 -1
- data/lib/mongo/error/operation_failure.rb +6 -0
- data/lib/mongo/error/sessions_not_supported.rb +35 -0
- data/lib/mongo/event/base.rb +6 -0
- data/lib/mongo/grid/file.rb +5 -0
- data/lib/mongo/grid/file/chunk.rb +2 -0
- data/lib/mongo/grid/fs_bucket.rb +15 -13
- data/lib/mongo/grid/stream/write.rb +9 -3
- data/lib/mongo/monitoring.rb +38 -0
- data/lib/mongo/monitoring/command_log_subscriber.rb +10 -2
- data/lib/mongo/monitoring/event/command_failed.rb +11 -0
- data/lib/mongo/monitoring/event/command_started.rb +37 -2
- data/lib/mongo/monitoring/event/command_succeeded.rb +11 -0
- data/lib/mongo/monitoring/event/server_closed.rb +1 -1
- data/lib/mongo/monitoring/event/server_description_changed.rb +27 -4
- data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +9 -2
- data/lib/mongo/monitoring/event/server_heartbeat_started.rb +9 -2
- data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +9 -2
- data/lib/mongo/monitoring/event/server_opening.rb +1 -1
- data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
- data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
- data/lib/mongo/monitoring/publishable.rb +6 -3
- data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +9 -1
- data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
- data/lib/mongo/protocol/message.rb +36 -8
- data/lib/mongo/protocol/msg.rb +14 -0
- data/lib/mongo/protocol/serializers.rb +5 -2
- data/lib/mongo/server.rb +10 -3
- data/lib/mongo/server/connection.rb +4 -4
- data/lib/mongo/server/connection_base.rb +3 -1
- data/lib/mongo/server/description.rb +5 -0
- data/lib/mongo/server/monitor.rb +76 -44
- data/lib/mongo/server/monitor/connection.rb +55 -7
- data/lib/mongo/server/pending_connection.rb +14 -4
- data/lib/mongo/server/push_monitor.rb +173 -0
- data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
- data/lib/mongo/server_selector.rb +0 -1
- data/lib/mongo/server_selector/base.rb +579 -1
- data/lib/mongo/server_selector/nearest.rb +1 -6
- data/lib/mongo/server_selector/primary.rb +1 -6
- data/lib/mongo/server_selector/primary_preferred.rb +7 -10
- data/lib/mongo/server_selector/secondary.rb +1 -6
- data/lib/mongo/server_selector/secondary_preferred.rb +1 -7
- data/lib/mongo/session.rb +2 -0
- data/lib/mongo/socket.rb +20 -8
- data/lib/mongo/socket/ssl.rb +1 -1
- data/lib/mongo/socket/tcp.rb +1 -1
- data/lib/mongo/topology_version.rb +9 -0
- data/lib/mongo/utils.rb +62 -0
- data/lib/mongo/version.rb +1 -1
- data/spec/README.aws-auth.md +2 -2
- data/spec/integration/awaited_ismaster_spec.rb +28 -0
- data/spec/integration/change_stream_examples_spec.rb +6 -2
- data/spec/integration/check_clean_slate_spec.rb +16 -0
- data/spec/integration/client_construction_spec.rb +1 -0
- data/spec/integration/connect_single_rs_name_spec.rb +5 -2
- data/spec/integration/connection_spec.rb +7 -4
- data/spec/integration/crud_spec.rb +4 -4
- data/spec/integration/docs_examples_spec.rb +6 -0
- data/spec/integration/grid_fs_bucket_spec.rb +48 -0
- data/spec/integration/heartbeat_events_spec.rb +4 -23
- data/spec/integration/read_concern_spec.rb +1 -1
- data/spec/integration/retryable_errors_spec.rb +1 -1
- data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +2 -2
- data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -3
- data/spec/integration/retryable_writes/shared/performs_no_retries.rb +2 -2
- data/spec/integration/sdam_error_handling_spec.rb +37 -15
- data/spec/integration/sdam_events_spec.rb +77 -6
- data/spec/integration/sdam_prose_spec.rb +64 -0
- data/spec/integration/server_monitor_spec.rb +25 -1
- data/spec/integration/size_limit_spec.rb +7 -3
- data/spec/integration/size_limit_spec.rb~12e1e9c4f... RUBY-2242 Fix zlib compression (#2021) +98 -0
- data/spec/integration/ssl_uri_options_spec.rb +2 -2
- data/spec/integration/zlib_compression_spec.rb +25 -0
- data/spec/lite_spec_helper.rb +12 -5
- data/spec/mongo/auth/aws/request_spec.rb +76 -0
- data/spec/mongo/auth/scram_spec.rb +1 -1
- data/spec/mongo/client_construction_spec.rb +207 -0
- data/spec/mongo/client_spec.rb +38 -3
- data/spec/mongo/cluster/topology/replica_set_spec.rb +52 -9
- data/spec/mongo/cluster/topology/single_spec.rb +4 -2
- data/spec/mongo/cluster_spec.rb +34 -35
- data/spec/mongo/collection/view/change_stream_resume_spec.rb +6 -6
- data/spec/mongo/collection_spec.rb +500 -0
- data/spec/mongo/database_spec.rb +245 -8
- data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
- data/spec/mongo/error/operation_failure_spec.rb +40 -0
- data/spec/mongo/index/view_spec.rb +2 -2
- data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
- data/spec/mongo/protocol/msg_spec.rb +10 -0
- data/spec/mongo/semaphore_spec.rb +51 -0
- data/spec/mongo/server/connection_auth_spec.rb +2 -2
- data/spec/mongo/server_selector/nearest_spec.rb +23 -23
- data/spec/mongo/server_selector/primary_preferred_spec.rb +26 -26
- data/spec/mongo/server_selector/primary_spec.rb +9 -9
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +22 -22
- data/spec/mongo/server_selector/secondary_spec.rb +18 -18
- data/spec/mongo/server_selector_spec.rb +4 -4
- data/spec/mongo/session_spec.rb +35 -0
- data/spec/runners/change_streams/test.rb +2 -2
- data/spec/runners/cmap.rb +1 -1
- data/spec/runners/command_monitoring.rb +3 -34
- data/spec/runners/crud/context.rb +9 -5
- data/spec/runners/crud/operation.rb +59 -27
- data/spec/runners/crud/spec.rb +0 -8
- data/spec/runners/crud/test.rb +1 -1
- data/spec/runners/sdam.rb +2 -2
- data/spec/runners/server_selection.rb +242 -28
- data/spec/runners/transactions.rb +12 -12
- data/spec/runners/transactions/operation.rb +151 -25
- data/spec/runners/transactions/test.rb +60 -16
- data/spec/spec_tests/command_monitoring_spec.rb +22 -12
- data/spec/spec_tests/crud_spec.rb +1 -1
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +4 -8
- data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +66 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
- data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
- data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
- data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
- data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
- data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
- data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
- data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
- data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
- data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
- data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
- data/spec/spec_tests/max_staleness_spec.rb +4 -142
- data/spec/spec_tests/retryable_reads_spec.rb +2 -2
- data/spec/spec_tests/sdam_integration_spec.rb +13 -0
- data/spec/spec_tests/sdam_monitoring_spec.rb +1 -2
- data/spec/spec_tests/server_selection_spec.rb +4 -116
- data/spec/stress/cleanup_spec.rb +17 -2
- data/spec/stress/connection_pool_stress_spec.rb +10 -8
- data/spec/support/child_process_helper.rb +78 -0
- data/spec/support/client_registry.rb +1 -0
- data/spec/support/cluster_config.rb +4 -0
- data/spec/support/event_subscriber.rb +123 -33
- data/spec/support/keyword_struct.rb +26 -0
- data/spec/support/shared/server_selector.rb +13 -1
- data/spec/support/spec_config.rb +38 -13
- data/spec/support/spec_organizer.rb +129 -0
- data/spec/support/spec_setup.rb +1 -1
- data/spec/support/utils.rb +46 -0
- metadata +992 -942
- metadata.gz.sig +0 -0
- data/lib/mongo/server_selector/selectable.rb +0 -560
- data/spec/runners/sdam_monitoring.rb +0 -89
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: db8c88ed58f349728a9361db891376926e93450f4a8ac86aae0bc67599c91a7b
|
4
|
+
data.tar.gz: b4f7daaf1d43b55839c1f689504d4f1c212c638e45f6d2211732bc07a41f77e5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 22471d116179fff42716707a40fa18ebc3c53492a6313bb16be96f447db725110b8ed0b3ee8e199026098a59b8f2941290cd1493249c8e9120ec2849e0229fa1
|
7
|
+
data.tar.gz: 8965e04c6926343e4363110d010e14b1a8fde146eb4e239f620005f251ff24b63393bc13f5f332ac4d8aa39cc790a66f080401d9b0923c54a8b40b7d80aa25ea
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
data/Rakefile
CHANGED
@@ -45,16 +45,16 @@ namespace :spec do
|
|
45
45
|
client = ClientRegistry.instance.global_client('authorized')
|
46
46
|
client.database.command(ping: 1)
|
47
47
|
deadline = Time.now + 300
|
48
|
-
|
49
|
-
|
48
|
+
loop do
|
49
|
+
begin
|
50
|
+
client.cluster.validate_session_support!
|
50
51
|
break
|
52
|
+
rescue Mongo::Error::SessionsNotSupported
|
53
|
+
if Time.now >= deadline
|
54
|
+
raise "Sessions did not become supported in 300 seconds"
|
55
|
+
end
|
56
|
+
client.cluster.scan!
|
51
57
|
end
|
52
|
-
sleep 1
|
53
|
-
client.close
|
54
|
-
client.reconnect
|
55
|
-
end
|
56
|
-
unless client.cluster.send(:sessions_supported?)
|
57
|
-
raise "Sessions did not become supported in the allowed time"
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -71,7 +71,13 @@ namespace :spec do
|
|
71
71
|
SpecConfig.instance.print_summary
|
72
72
|
end
|
73
73
|
|
74
|
-
task :ci => ['spec:prepare'
|
74
|
+
task :ci => ['spec:prepare'] do
|
75
|
+
$: << File.join(File.dirname(__FILE__), 'spec')
|
76
|
+
|
77
|
+
require 'support/spec_organizer'
|
78
|
+
|
79
|
+
SpecOrganizer.new.run
|
80
|
+
end
|
75
81
|
end
|
76
82
|
|
77
83
|
namespace :release do
|
data/lib/mongo.rb
CHANGED
@@ -34,6 +34,7 @@ require 'bson'
|
|
34
34
|
require 'mongo/id'
|
35
35
|
require 'mongo/bson'
|
36
36
|
require 'mongo/semaphore'
|
37
|
+
require 'mongo/distinguishing_semaphore'
|
37
38
|
require 'mongo/options'
|
38
39
|
require 'mongo/loggable'
|
39
40
|
require 'mongo/cluster_time'
|
@@ -54,9 +55,11 @@ require 'mongo/collection'
|
|
54
55
|
require 'mongo/database'
|
55
56
|
require 'mongo/crypt'
|
56
57
|
require 'mongo/client' # Purposely out-of-order so that database is loaded first
|
58
|
+
require 'mongo/client_encryption'
|
57
59
|
require 'mongo/dbref'
|
58
60
|
require 'mongo/grid'
|
59
61
|
require 'mongo/index'
|
62
|
+
require 'mongo/lint'
|
60
63
|
require 'mongo/server'
|
61
64
|
require 'mongo/server_selector'
|
62
65
|
require 'mongo/session'
|
@@ -66,5 +69,4 @@ require 'mongo/timeout'
|
|
66
69
|
require 'mongo/uri'
|
67
70
|
require 'mongo/version'
|
68
71
|
require 'mongo/write_concern'
|
69
|
-
require 'mongo/
|
70
|
-
require 'mongo/client_encryption'
|
72
|
+
require 'mongo/utils'
|
@@ -12,7 +12,9 @@
|
|
12
12
|
# See the License for the specific language governing permissions and
|
13
13
|
# limitations under the License.
|
14
14
|
|
15
|
-
|
15
|
+
module Net
|
16
|
+
autoload :HTTP, 'net/http'
|
17
|
+
end
|
16
18
|
|
17
19
|
module Mongo
|
18
20
|
module Auth
|
@@ -86,7 +88,7 @@ module Mongo
|
|
86
88
|
# @return [ String ] formatted_time ISO8601-formatted time of the
|
87
89
|
# request, as would be used in X-Amz-Date header.
|
88
90
|
def formatted_time
|
89
|
-
@formatted_time ||= @time.
|
91
|
+
@formatted_time ||= @time.getutc.strftime('%Y%m%dT%H%M%SZ')
|
90
92
|
end
|
91
93
|
|
92
94
|
# @return [ String ] formatted_date YYYYMMDD formatted date of the request.
|
data/lib/mongo/bulk_write.rb
CHANGED
@@ -170,6 +170,7 @@ module Mongo
|
|
170
170
|
:ordered => ordered?,
|
171
171
|
:operation_id => operation_id,
|
172
172
|
:bypass_document_validation => !!options[:bypass_document_validation],
|
173
|
+
:max_time_ms => options[:max_time_ms],
|
173
174
|
:options => options,
|
174
175
|
:id_generator => client.options[:id_generator],
|
175
176
|
:session => session
|
data/lib/mongo/client.rb
CHANGED
@@ -55,6 +55,7 @@ module Mongo
|
|
55
55
|
:auth_mech_properties,
|
56
56
|
:auth_source,
|
57
57
|
:auto_encryption_options,
|
58
|
+
:bg_error_backtrace,
|
58
59
|
:cleanup,
|
59
60
|
:compressors,
|
60
61
|
:direct_connection,
|
@@ -213,6 +214,10 @@ module Mongo
|
|
213
214
|
# use. One of :mongodb_cr, :mongodb_x509, :plain, :scram, :scram256
|
214
215
|
# @option options [ Hash ] :auth_mech_properties
|
215
216
|
# @option options [ String ] :auth_source The source to authenticate from.
|
217
|
+
# @option options [ true | false | nil | Integer ] :bg_error_backtrace
|
218
|
+
# Experimental. Set to true to log complete backtraces for errors in
|
219
|
+
# background threads. Set to false or nil to not log backtraces. Provide
|
220
|
+
# a positive integer to log up to that many backtrace lines.
|
216
221
|
# @option options [ Array<String> ] :compressors A list of potential
|
217
222
|
# compressors to use, in order of preference. The driver chooses the
|
218
223
|
# first compressor that is also supported by the server. Currently the
|
@@ -443,6 +448,12 @@ module Mongo
|
|
443
448
|
@srv_records = uri.srv_records
|
444
449
|
else
|
445
450
|
addresses = addresses_or_uri
|
451
|
+
addresses.each do |addr|
|
452
|
+
if addr =~ /\Amongodb(\+srv)?:\/\//i
|
453
|
+
raise ArgumentError, "Host '#{addr}' should not contain protocol. Did you mean to not use an array?"
|
454
|
+
end
|
455
|
+
end
|
456
|
+
|
446
457
|
@srv_records = nil
|
447
458
|
end
|
448
459
|
|
@@ -489,7 +500,6 @@ module Mongo
|
|
489
500
|
end
|
490
501
|
end
|
491
502
|
|
492
|
-
yield(self) if block_given?
|
493
503
|
rescue
|
494
504
|
begin
|
495
505
|
@cluster.disconnect!
|
@@ -499,6 +509,14 @@ module Mongo
|
|
499
509
|
end
|
500
510
|
raise
|
501
511
|
end
|
512
|
+
|
513
|
+
if block_given?
|
514
|
+
begin
|
515
|
+
yield(self)
|
516
|
+
ensure
|
517
|
+
close
|
518
|
+
end
|
519
|
+
end
|
502
520
|
end
|
503
521
|
|
504
522
|
# @api private
|
@@ -802,6 +820,13 @@ module Mongo
|
|
802
820
|
# @param [ Hash ] filter The filter criteria for getting a list of databases.
|
803
821
|
# @param [ Hash ] opts The command options.
|
804
822
|
#
|
823
|
+
# @option opts [ true, false ] :authorized_databases A flag that determines
|
824
|
+
# which databases are returned based on user privileges when access control
|
825
|
+
# is enabled
|
826
|
+
#
|
827
|
+
# See https://docs.mongodb.com/manual/reference/command/listDatabases/
|
828
|
+
# for more information and usage.
|
829
|
+
#
|
805
830
|
# @return [ Array<String> ] The names of the databases.
|
806
831
|
#
|
807
832
|
# @since 2.0.5
|
@@ -818,6 +843,13 @@ module Mongo
|
|
818
843
|
# @param [ true, false ] name_only Whether to only return each database name without full metadata.
|
819
844
|
# @param [ Hash ] opts The command options.
|
820
845
|
#
|
846
|
+
# @option opts [ true, false ] :authorized_databases A flag that determines
|
847
|
+
# which databases are returned based on user privileges when access control
|
848
|
+
# is enabled
|
849
|
+
#
|
850
|
+
# See https://docs.mongodb.com/manual/reference/command/listDatabases/
|
851
|
+
# for more information and usage.
|
852
|
+
#
|
821
853
|
# @return [ Array<Hash> ] The info for each database.
|
822
854
|
#
|
823
855
|
# @since 2.0.5
|
@@ -825,6 +857,7 @@ module Mongo
|
|
825
857
|
cmd = { listDatabases: 1 }
|
826
858
|
cmd[:nameOnly] = !!name_only
|
827
859
|
cmd[:filter] = filter unless filter.empty?
|
860
|
+
cmd[:authorizedDatabases] = true if opts[:authorized_databases]
|
828
861
|
use(Database::ADMIN).database.read_command(cmd, opts).first[Database::DATABASES]
|
829
862
|
end
|
830
863
|
|
@@ -865,8 +898,16 @@ module Mongo
|
|
865
898
|
#
|
866
899
|
# @since 2.5.0
|
867
900
|
def start_session(options = {})
|
868
|
-
get_session(options.merge(implicit: false))
|
869
|
-
|
901
|
+
session = get_session!(options.merge(implicit: false))
|
902
|
+
if block_given?
|
903
|
+
begin
|
904
|
+
yield session
|
905
|
+
ensure
|
906
|
+
session.end_session
|
907
|
+
end
|
908
|
+
else
|
909
|
+
session
|
910
|
+
end
|
870
911
|
end
|
871
912
|
|
872
913
|
# As of version 3.6 of the MongoDB server, a ``$changeStream`` pipeline stage is supported
|
@@ -912,6 +953,59 @@ module Mongo
|
|
912
953
|
options)
|
913
954
|
end
|
914
955
|
|
956
|
+
# Returns a session to use for operations if possible.
|
957
|
+
#
|
958
|
+
# If :session option is set, validates that session and returns it.
|
959
|
+
# Otherwise, if deployment supports sessions, creates a new session and
|
960
|
+
# returns it. When a new session is created, the session will be implicit
|
961
|
+
# (lifecycle is managed by the driver) if the :implicit option is given,
|
962
|
+
# otherwise the session will be explicit (lifecycle managed by the
|
963
|
+
# application). If deployment does not support session, returns nil.
|
964
|
+
#
|
965
|
+
# @option options [ true | false ] :implicit When no session is passed in,
|
966
|
+
# whether to create an implicit session.
|
967
|
+
# @option options [ Session ] :session The session to validate and return.
|
968
|
+
#
|
969
|
+
# @return [ Session | nil ] Session object or nil if sessions are not
|
970
|
+
# supported by the deployment.
|
971
|
+
#
|
972
|
+
# @api private
|
973
|
+
def get_session(options = {})
|
974
|
+
get_session!(options)
|
975
|
+
rescue Error::SessionsNotSupported
|
976
|
+
nil
|
977
|
+
end
|
978
|
+
|
979
|
+
# Creates a session to use for operations if possible and yields it to
|
980
|
+
# the provided block.
|
981
|
+
#
|
982
|
+
# If :session option is set, validates that session and uses it.
|
983
|
+
# Otherwise, if deployment supports sessions, creates a new session and
|
984
|
+
# uses it. When a new session is created, the session will be implicit
|
985
|
+
# (lifecycle is managed by the driver) if the :implicit option is given,
|
986
|
+
# otherwise the session will be explicit (lifecycle managed by the
|
987
|
+
# application). If deployment does not support session, yields nil to
|
988
|
+
# the block.
|
989
|
+
#
|
990
|
+
# When the block finishes, if the session was created and was implicit,
|
991
|
+
# or if an implicit session was passed in, the session is ended which
|
992
|
+
# returns it to the pool of available sessions.
|
993
|
+
#
|
994
|
+
# @option options [ true | false ] :implicit When no session is passed in,
|
995
|
+
# whether to create an implicit session.
|
996
|
+
# @option options [ Session ] :session The session to validate and return.
|
997
|
+
#
|
998
|
+
# @api private
|
999
|
+
def with_session(options = {}, &block)
|
1000
|
+
session = get_session(options)
|
1001
|
+
|
1002
|
+
yield session
|
1003
|
+
ensure
|
1004
|
+
if session && session.implicit?
|
1005
|
+
session.end_session
|
1006
|
+
end
|
1007
|
+
end
|
1008
|
+
|
915
1009
|
private
|
916
1010
|
|
917
1011
|
# Create a new encrypter object using the client's auto encryption options
|
@@ -944,30 +1038,34 @@ module Mongo
|
|
944
1038
|
close_encrypter
|
945
1039
|
end
|
946
1040
|
|
947
|
-
#
|
948
|
-
# If deployment supports sessions, creates a new session and returns it.
|
949
|
-
# The session is implicit unless options[:implicit] is given.
|
950
|
-
# If deployment does not support session, returns nil.
|
1041
|
+
# Returns a session to use for operations.
|
951
1042
|
#
|
952
|
-
#
|
953
|
-
#
|
954
|
-
|
1043
|
+
# If :session option is set, validates that session and returns it.
|
1044
|
+
# Otherwise, if deployment supports sessions, creates a new session and
|
1045
|
+
# returns it. When a new session is created, the session will be implicit
|
1046
|
+
# (lifecycle is managed by the driver) if the :implicit option is given,
|
1047
|
+
# otherwise the session will be explicit (lifecycle managed by the
|
1048
|
+
# application). If deployment does not support session, raises
|
1049
|
+
# Error::InvalidSession.
|
1050
|
+
#
|
1051
|
+
# @option options [ true | false ] :implicit When no session is passed in,
|
1052
|
+
# whether to create an implicit session.
|
1053
|
+
# @option options [ Session ] :session The session to validate and return.
|
1054
|
+
#
|
1055
|
+
# @return [ Session ] A session object.
|
1056
|
+
#
|
1057
|
+
# @raise Error::SessionsNotSupported if sessions are not supported by
|
1058
|
+
# the deployment.
|
1059
|
+
#
|
1060
|
+
# @api private
|
1061
|
+
def get_session!(options = {})
|
955
1062
|
if options[:session]
|
956
1063
|
return options[:session].validate!(self)
|
957
1064
|
end
|
958
1065
|
|
959
|
-
|
960
|
-
Session.new(cluster.session_pool.checkout, self, { implicit: true }.merge(options))
|
961
|
-
end
|
962
|
-
end
|
1066
|
+
cluster.validate_session_support!
|
963
1067
|
|
964
|
-
|
965
|
-
session = get_session(options)
|
966
|
-
yield(session)
|
967
|
-
ensure
|
968
|
-
if session && session.implicit?
|
969
|
-
session.end_session
|
970
|
-
end
|
1068
|
+
Session.new(cluster.session_pool.checkout, self, { implicit: true }.merge(options))
|
971
1069
|
end
|
972
1070
|
|
973
1071
|
def initialize_copy(original)
|
@@ -1038,6 +1136,30 @@ module Mongo
|
|
1038
1136
|
if options[:direct_connection] == false && options[:connect] && options[:connect].to_sym == :direct
|
1039
1137
|
raise ArgumentError, "Conflicting client options: direct_connection=false and connect=#{options[:connect]}"
|
1040
1138
|
end
|
1139
|
+
|
1140
|
+
%i(connect_timeout socket_timeout).each do |key|
|
1141
|
+
if value = options[key]
|
1142
|
+
unless Numeric === value
|
1143
|
+
raise ArgumentError, "#{key} must be a non-negative number: #{value}"
|
1144
|
+
end
|
1145
|
+
if value < 0
|
1146
|
+
raise ArgumentError, "#{key} must be a non-negative number: #{value}"
|
1147
|
+
end
|
1148
|
+
end
|
1149
|
+
end
|
1150
|
+
|
1151
|
+
if value = options[:bg_error_backtrace]
|
1152
|
+
case value
|
1153
|
+
when Integer
|
1154
|
+
if value <= 0
|
1155
|
+
raise ArgumentError, ":bg_error_backtrace option value must be true, false, nil or a positive integer: #{value}"
|
1156
|
+
end
|
1157
|
+
when true
|
1158
|
+
# OK
|
1159
|
+
else
|
1160
|
+
raise ArgumentError, ":bg_error_backtrace option value must be true, false, nil or a positive integer: #{value}"
|
1161
|
+
end
|
1162
|
+
end
|
1041
1163
|
end
|
1042
1164
|
|
1043
1165
|
# Validates all authentication-related options after they are set on the client
|
data/lib/mongo/cluster.rb
CHANGED
@@ -395,7 +395,7 @@ module Mongo
|
|
395
395
|
#
|
396
396
|
# @since 2.0.0
|
397
397
|
def servers
|
398
|
-
topology.servers(servers_list
|
398
|
+
topology.servers(servers_list)
|
399
399
|
end
|
400
400
|
|
401
401
|
# The addresses in the cluster.
|
@@ -599,11 +599,14 @@ module Mongo
|
|
599
599
|
# respective server is cleared. Set this option to true to keep the
|
600
600
|
# existing connection pool (required when handling not master errors
|
601
601
|
# on 4.2+ servers).
|
602
|
+
# @option aptions [ true | false ] :awaited Whether the updated description
|
603
|
+
# was a result of processing an awaited ismaster.
|
602
604
|
#
|
603
605
|
# @api private
|
604
606
|
def run_sdam_flow(previous_desc, updated_desc, options = {})
|
605
607
|
@sdam_flow_lock.synchronize do
|
606
|
-
flow = SdamFlow.new(self, previous_desc, updated_desc
|
608
|
+
flow = SdamFlow.new(self, previous_desc, updated_desc,
|
609
|
+
awaited: options[:awaited])
|
607
610
|
flow.server_description_changed
|
608
611
|
|
609
612
|
# SDAM flow may alter the updated description - grab the final
|
@@ -886,21 +889,26 @@ module Mongo
|
|
886
889
|
end
|
887
890
|
end
|
888
891
|
|
889
|
-
#
|
890
|
-
# sessions.
|
892
|
+
# Raises Error::SessionsNotAvailable if the deployment that the driver
|
893
|
+
# is connected to does not support sessions.
|
891
894
|
#
|
892
895
|
# Session support may change over time, for example due to servers in the
|
893
|
-
# deployment being upgraded or downgraded.
|
894
|
-
#
|
895
|
-
#
|
896
|
-
#
|
897
|
-
# the deployment
|
896
|
+
# deployment being upgraded or downgraded. If the client is currently not
|
897
|
+
# connected to any data bearing servers, this method considers the state
|
898
|
+
# of session support as of when the client was last connected to at
|
899
|
+
# least one server. If the client has never connected to any servers,
|
900
|
+
# the deployment is considered to not support sessions.
|
898
901
|
#
|
899
|
-
# @return [ true | false ] Whether deployment supports sessions.
|
900
902
|
# @api private
|
901
|
-
def
|
902
|
-
|
903
|
-
|
903
|
+
def validate_session_support!
|
904
|
+
@state_change_lock.synchronize do
|
905
|
+
@sdam_flow_lock.synchronize do
|
906
|
+
if topology.data_bearing_servers?
|
907
|
+
unless topology.logical_session_timeout
|
908
|
+
raise_sessions_not_supported
|
909
|
+
end
|
910
|
+
end
|
911
|
+
end
|
904
912
|
end
|
905
913
|
|
906
914
|
# No data bearing servers known - perform server selection to try to
|
@@ -908,12 +916,24 @@ module Mongo
|
|
908
916
|
# assessment of whether sessions are currently supported.
|
909
917
|
begin
|
910
918
|
ServerSelector.get(mode: :primary_preferred).select_server(self)
|
911
|
-
|
919
|
+
@state_change_lock.synchronize do
|
920
|
+
@sdam_flow_lock.synchronize do
|
921
|
+
unless topology.logical_session_timeout
|
922
|
+
raise_sessions_not_supported
|
923
|
+
end
|
924
|
+
end
|
925
|
+
end
|
912
926
|
rescue Error::NoServerAvailable
|
913
927
|
# We haven't been able to contact any servers - use last known
|
914
|
-
# value for
|
915
|
-
@
|
916
|
-
@
|
928
|
+
# value for session support.
|
929
|
+
@state_change_lock.synchronize do
|
930
|
+
@sdam_flow_lock.synchronize do
|
931
|
+
@update_lock.synchronize do
|
932
|
+
unless @sessions_supported
|
933
|
+
raise_sessions_not_supported
|
934
|
+
end
|
935
|
+
end
|
936
|
+
end
|
917
937
|
end
|
918
938
|
end
|
919
939
|
end
|
@@ -952,6 +972,22 @@ module Mongo
|
|
952
972
|
end
|
953
973
|
end
|
954
974
|
end
|
975
|
+
|
976
|
+
def raise_sessions_not_supported
|
977
|
+
# Intentionally using @servers instead of +servers+ here because we
|
978
|
+
# are supposed to be already holding the @update_lock and we cannot
|
979
|
+
# recursively acquire it again.
|
980
|
+
offending_servers = @servers.select do |server|
|
981
|
+
server.description.data_bearing? && server.logical_session_timeout.nil?
|
982
|
+
end
|
983
|
+
reason = if offending_servers.empty?
|
984
|
+
"There are no known data bearing servers (current seeds: #{@servers.map(&:address).map(&:seed).join(', ')})"
|
985
|
+
else
|
986
|
+
"The following servers have null logical session timeout: #{offending_servers.map(&:address).map(&:seed).join(', ')}"
|
987
|
+
end
|
988
|
+
msg = "The deployment that the driver is connected to does not support sessions: #{reason}"
|
989
|
+
raise Error::SessionsNotSupported, msg
|
990
|
+
end
|
955
991
|
end
|
956
992
|
end
|
957
993
|
|