mongo 2.11.0.rc0 → 2.11.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 +0 -0
- data.tar.gz.sig +0 -0
- data/Rakefile +2 -0
- data/lib/mongo/auth.rb +11 -2
- 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 +4 -1
- data/lib/mongo/auth/user.rb +15 -1
- data/lib/mongo/auth/user/view.rb +10 -4
- data/lib/mongo/auth/x509.rb +11 -1
- data/lib/mongo/auth/x509/conversation.rb +15 -6
- data/lib/mongo/background_thread.rb +28 -13
- data/lib/mongo/client.rb +23 -15
- data/lib/mongo/collection/view/change_stream.rb +5 -1
- data/lib/mongo/collection/view/readable.rb +5 -2
- data/lib/mongo/collection/view/writable.rb +3 -1
- data/lib/mongo/cursor/builder/get_more_command.rb +4 -1
- data/lib/mongo/cursor/builder/kill_cursors_command.rb +16 -5
- data/lib/mongo/cursor/builder/op_get_more.rb +2 -2
- data/lib/mongo/cursor/builder/op_kill_cursors.rb +17 -5
- data/lib/mongo/error/operation_failure.rb +3 -3
- data/lib/mongo/monitoring/command_log_subscriber.rb +5 -3
- data/lib/mongo/monitoring/event/command_started.rb +13 -3
- data/lib/mongo/monitoring/publishable.rb +4 -2
- data/lib/mongo/operation/create_user/command.rb +1 -0
- data/lib/mongo/operation/remove_user/command.rb +1 -0
- data/lib/mongo/operation/update_user/command.rb +1 -0
- data/lib/mongo/protocol/get_more.rb +2 -1
- data/lib/mongo/protocol/kill_cursors.rb +6 -13
- data/lib/mongo/protocol/serializers.rb +10 -4
- data/lib/mongo/retryable.rb +1 -1
- data/lib/mongo/server/connection.rb +6 -2
- data/lib/mongo/server/connection_base.rb +2 -1
- data/lib/mongo/server/monitor.rb +1 -1
- data/lib/mongo/server/pending_connection.rb +6 -0
- data/lib/mongo/socket/ssl.rb +1 -1
- data/lib/mongo/uri.rb +5 -41
- data/lib/mongo/version.rb +1 -1
- data/mongo.gemspec +11 -2
- data/spec/README.md +105 -9
- data/spec/USERS.md +72 -0
- data/spec/integration/auth_spec.rb +20 -6
- data/spec/integration/client_construction_spec.rb +3 -1
- data/spec/integration/client_options_spec.rb +437 -0
- data/spec/integration/command_monitoring_spec.rb +4 -1
- data/spec/integration/connection_pool_populator_spec.rb +4 -0
- data/spec/integration/connection_spec.rb +4 -2
- data/spec/integration/cursor_reaping_spec.rb +1 -1
- data/spec/integration/get_more_spec.rb +32 -0
- data/spec/integration/retryable_errors_spec.rb +99 -0
- data/spec/integration/retryable_writes_errors_spec.rb +11 -10
- data/spec/lite_spec_helper.rb +2 -1
- data/spec/mongo/auth/scram_spec.rb +1 -0
- data/spec/mongo/auth/user/view_spec.rb +102 -1
- data/spec/mongo/auth/user_spec.rb +56 -15
- data/spec/mongo/auth/x509_spec.rb +31 -1
- data/spec/mongo/bulk_write_spec.rb +2 -2
- data/spec/mongo/collection/view/change_stream_spec.rb +2 -2
- data/spec/mongo/collection/view/readable_spec.rb +8 -4
- data/spec/mongo/cursor/builder/get_more_command_spec.rb +4 -2
- data/spec/mongo/cursor/builder/op_get_more_spec.rb +4 -2
- data/spec/mongo/cursor_spec.rb +3 -3
- data/spec/mongo/retryable_spec.rb +31 -52
- data/spec/mongo/server/connection_auth_spec.rb +3 -0
- data/spec/mongo/server/connection_pool_spec.rb +4 -0
- data/spec/mongo/server/connection_spec.rb +12 -4
- data/spec/mongo/server/monitor_spec.rb +19 -1
- data/spec/mongo/socket/ssl_spec.rb +1 -1
- data/spec/mongo/uri/srv_protocol_spec.rb +0 -13
- data/spec/mongo/uri_option_parsing_spec.rb +0 -8
- data/spec/mongo/uri_spec.rb +6 -20
- data/spec/runners/connection_string.rb +116 -0
- data/spec/runners/read_write_concern_document.rb +67 -0
- data/spec/spec_tests/change_streams_spec.rb +17 -2
- data/spec/spec_tests/connection_string_spec.rb +2 -59
- data/spec/spec_tests/data/change_streams/change-streams-errors.yml +3 -3
- data/spec/spec_tests/data/change_streams/change-streams.yml +88 -20
- data/spec/spec_tests/data/cmap/connection-must-have-id.yml +6 -0
- data/spec/spec_tests/data/cmap/connection-must-order-ids.yml +6 -0
- data/spec/spec_tests/data/cmap/pool-checkin-destroy-closed.yml +3 -0
- data/spec/spec_tests/data/cmap/pool-checkin-destroy-stale.yml +3 -0
- data/spec/spec_tests/data/cmap/pool-checkin-make-available.yml +3 -0
- data/spec/spec_tests/data/cmap/pool-checkin.yml +1 -0
- data/spec/spec_tests/data/cmap/pool-checkout-connection.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-checkout-error-closed.yml +5 -0
- data/spec/spec_tests/data/cmap/pool-checkout-multiple.yml +3 -0
- data/spec/spec_tests/data/cmap/pool-checkout-no-idle.yml +4 -0
- data/spec/spec_tests/data/cmap/pool-checkout-no-stale.yml +4 -0
- data/spec/spec_tests/data/cmap/pool-close-destroy-conns.yml +2 -0
- data/spec/spec_tests/data/cmap/pool-create-max-size.yml +15 -0
- data/spec/spec_tests/data/cmap/pool-create-min-size.yml +4 -0
- data/spec/spec_tests/data/cmap/wait-queue-fairness.yml +31 -1
- data/spec/spec_tests/data/cmap/wait-queue-timeout.yml +5 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/read-concern.yml +32 -0
- data/spec/spec_tests/data/read_write_concern/connection-string/write-concern.yml +82 -0
- data/spec/spec_tests/data/read_write_concern/document/read-concern.yml +37 -0
- data/spec/spec_tests/data/read_write_concern/document/write-concern.yml +100 -0
- data/spec/spec_tests/data/retryable_reads/aggregate-merge.yml +39 -0
- data/spec/spec_tests/data/retryable_reads/aggregate-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch-serverErrors.yml +2 -2
- data/spec/spec_tests/data/retryable_reads/changeStreams-client.watch.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch-serverErrors.yml +2 -2
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.coll.watch.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch-serverErrors.yml +2 -2
- data/spec/spec_tests/data/retryable_reads/changeStreams-db.watch.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/count-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/countDocuments-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/distinct-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/estimatedDocumentCount-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/find-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/findOne-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/gridfs-download-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/gridfs-downloadByName-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listCollectionNames-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listCollectionObjects-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listCollections-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listDatabaseNames-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listDatabaseObjects-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listDatabases-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listIndexNames-serverErrors.yml +1 -1
- data/spec/spec_tests/data/retryable_reads/listIndexes-serverErrors.yml +1 -1
- data/spec/spec_tests/data/transactions/read-concern.yml +6 -6
- data/spec/spec_tests/data/transactions/transaction-options-repl.yml +117 -0
- data/spec/spec_tests/data/transactions/transaction-options.yml +14 -121
- data/spec/spec_tests/data/transactions/write-concern.yml +3 -0
- data/spec/spec_tests/data/transactions_api/transaction-options.yml +11 -12
- data/spec/spec_tests/dns_seedlist_discovery_spec.rb +17 -7
- data/spec/spec_tests/read_write_concern_connection_string_spec.rb +8 -0
- data/spec/spec_tests/read_write_concern_document_spec.rb +74 -0
- data/spec/spec_tests/retryable_reads_spec.rb +32 -1
- data/spec/spec_tests/uri_options_spec.rb +4 -2
- data/spec/support/auth.rb +5 -14
- data/spec/support/certificates/client-x509.crt +78 -0
- data/spec/support/certificates/client-x509.key +27 -0
- data/spec/support/certificates/client-x509.pem +105 -0
- data/spec/support/change_streams.rb +8 -11
- data/spec/support/client_registry.rb +26 -12
- data/spec/support/cluster_tools.rb +2 -2
- data/spec/support/cmap.rb +11 -7
- data/spec/support/command_monitoring.rb +8 -8
- data/spec/support/connection_string.rb +56 -28
- data/spec/support/constraints.rb +8 -0
- data/spec/support/crud/spec.rb +5 -8
- data/spec/support/event_subscriber.rb +7 -0
- data/spec/support/gridfs.rb +4 -7
- data/spec/support/server_discovery_and_monitoring.rb +3 -8
- data/spec/support/server_selection.rb +4 -9
- data/spec/support/server_selection_rtt.rb +4 -7
- data/spec/support/spec_config.rb +47 -19
- data/spec/support/spec_setup.rb +5 -0
- data/spec/support/utils.rb +46 -8
- metadata +637 -597
- metadata.gz.sig +0 -0
@@ -129,7 +129,9 @@ module Mongo
|
|
129
129
|
cmd[:new] = !!(opts[:return_document] && opts[:return_document] == :after)
|
130
130
|
cmd[:upsert] = opts[:upsert] if opts[:upsert]
|
131
131
|
cmd[:maxTimeMS] = max_time_ms if max_time_ms
|
132
|
-
|
132
|
+
if opts[:bypass_document_validation]
|
133
|
+
cmd[:bypassDocumentValidation] = true
|
134
|
+
end
|
133
135
|
|
134
136
|
value = with_session(opts) do |session|
|
135
137
|
applied_write_concern = applied_write_concern(opts[:session])
|
@@ -57,7 +57,10 @@ module Mongo
|
|
57
57
|
private
|
58
58
|
|
59
59
|
def get_more_command
|
60
|
-
command = {
|
60
|
+
command = {
|
61
|
+
:getMore => BSON::Int64.new(cursor.id),
|
62
|
+
:collection => collection_name,
|
63
|
+
}
|
61
64
|
command[:batchSize] = batch_size.abs if batch_size && batch_size != 0
|
62
65
|
# If the max_await_time_ms option is set, then we set maxTimeMS on
|
63
66
|
# the get more command.
|
@@ -54,7 +54,10 @@ module Mongo
|
|
54
54
|
private
|
55
55
|
|
56
56
|
def kill_cursors_command
|
57
|
-
{
|
57
|
+
{
|
58
|
+
killCursors: collection_name,
|
59
|
+
cursors: [ BSON::Int64.new(cursor.id) ],
|
60
|
+
}
|
58
61
|
end
|
59
62
|
|
60
63
|
class << self
|
@@ -65,11 +68,19 @@ module Mongo
|
|
65
68
|
# KillCursorsCommand.update_cursors(spec, ids)
|
66
69
|
#
|
67
70
|
# @return [ Hash ] The specification.
|
68
|
-
# @return [ Array ] The ids to update with.
|
71
|
+
# @return [ Array<Integer> ] The ids to update with.
|
69
72
|
#
|
70
73
|
# @since 2.3.0
|
71
74
|
def update_cursors(spec, ids)
|
72
|
-
|
75
|
+
# Ruby 2.5+ can & BSON::Int64 instances.
|
76
|
+
# Ruby 2.4 and earlier cannot.
|
77
|
+
# Convert stored ids to Ruby integers for compatibility with
|
78
|
+
# older Rubies.
|
79
|
+
ids = get_cursors_list(spec) & ids
|
80
|
+
ids = ids.map do |cursor_id|
|
81
|
+
BSON::Int64.new(cursor_id)
|
82
|
+
end
|
83
|
+
spec[:selector].merge!(cursors: ids)
|
73
84
|
end
|
74
85
|
|
75
86
|
# Get the list of cursor ids from a spec generated by this Builder.
|
@@ -77,11 +88,11 @@ module Mongo
|
|
77
88
|
# @example Get the list of cursor ids.
|
78
89
|
# KillCursorsCommand.cursors(spec)
|
79
90
|
#
|
80
|
-
# @return [
|
91
|
+
# @return [ Array<Integer> ] The cursor ids.
|
81
92
|
#
|
82
93
|
# @since 2.3.0
|
83
94
|
def get_cursors_list(spec)
|
84
|
-
spec[:selector][:cursors]
|
95
|
+
spec[:selector][:cursors].map(&:value)
|
85
96
|
end
|
86
97
|
end
|
87
98
|
end
|
@@ -50,9 +50,9 @@ module Mongo
|
|
50
50
|
def specification
|
51
51
|
{
|
52
52
|
:to_return => to_return,
|
53
|
-
:cursor_id => cursor.id,
|
53
|
+
:cursor_id => BSON::Int64.new(cursor.id),
|
54
54
|
:db_name => database.name,
|
55
|
-
:coll_name => collection_name
|
55
|
+
:coll_name => collection_name,
|
56
56
|
}
|
57
57
|
end
|
58
58
|
end
|
@@ -48,7 +48,11 @@ module Mongo
|
|
48
48
|
#
|
49
49
|
# @since 2.2.0
|
50
50
|
def specification
|
51
|
-
{
|
51
|
+
{
|
52
|
+
coll_name: collection_name,
|
53
|
+
db_name: database.name,
|
54
|
+
cursor_ids: [ BSON::Int64.new(cursor.id) ],
|
55
|
+
}
|
52
56
|
end
|
53
57
|
|
54
58
|
class << self
|
@@ -59,11 +63,19 @@ module Mongo
|
|
59
63
|
# OpKillCursors.update_cursors(spec, ids)
|
60
64
|
#
|
61
65
|
# @return [ Hash ] The specification.
|
62
|
-
# @return [ Array ] The ids to update with.
|
66
|
+
# @return [ Array<Integer> ] The ids to update with.
|
63
67
|
#
|
64
68
|
# @since 2.3.0
|
65
69
|
def update_cursors(spec, ids)
|
66
|
-
|
70
|
+
# Ruby 2.5+ can & BSON::Int64 instances.
|
71
|
+
# Ruby 2.4 and earlier cannot.
|
72
|
+
# Convert stored ids to Ruby integers for compatibility with
|
73
|
+
# older Rubies.
|
74
|
+
ids = get_cursors_list(spec) & ids
|
75
|
+
ids = ids.map do |cursor_id|
|
76
|
+
BSON::Int64.new(cursor_id)
|
77
|
+
end
|
78
|
+
spec.merge!(cursor_ids: ids)
|
67
79
|
end
|
68
80
|
|
69
81
|
# Get the list of cursor ids from a spec generated by this Builder.
|
@@ -71,11 +83,11 @@ module Mongo
|
|
71
83
|
# @example Get the list of cursor ids.
|
72
84
|
# OpKillCursors.cursors(spec)
|
73
85
|
#
|
74
|
-
# @return [
|
86
|
+
# @return [ Array<Integer> ] The cursor ids.
|
75
87
|
#
|
76
88
|
# @since 2.3.0
|
77
89
|
def get_cursors_list(spec)
|
78
|
-
spec[:cursor_ids]
|
90
|
+
spec[:cursor_ids].map(&:value)
|
79
91
|
end
|
80
92
|
end
|
81
93
|
end
|
@@ -80,15 +80,15 @@ module Mongo
|
|
80
80
|
# @since 2.6.0
|
81
81
|
attr_reader :code_name
|
82
82
|
|
83
|
-
# Whether the error is a retryable error according to the legacy
|
84
|
-
# logic.
|
83
|
+
# Whether the error is a retryable error according to the legacy
|
84
|
+
# read retry logic.
|
85
85
|
#
|
86
86
|
# @return [ true, false ]
|
87
87
|
#
|
88
88
|
# @since 2.1.1
|
89
89
|
# @deprecated
|
90
90
|
def retryable?
|
91
|
-
RETRY_MESSAGES.any?{ |m| message.include?(m) }
|
91
|
+
write_retryable? || RETRY_MESSAGES.any?{ |m| message.include?(m) }
|
92
92
|
end
|
93
93
|
|
94
94
|
# Whether the error is a retryable error according to the modern retryable
|
@@ -54,7 +54,8 @@ module Mongo
|
|
54
54
|
# @since 2.1.0
|
55
55
|
def started(event)
|
56
56
|
if logger.debug?
|
57
|
-
log_debug("#{prefix(event
|
57
|
+
log_debug("#{prefix(event, connection_id: event.connection_id)} | " +
|
58
|
+
"STARTED | #{format_command(event.command)}")
|
58
59
|
end
|
59
60
|
end
|
60
61
|
|
@@ -96,8 +97,9 @@ module Mongo
|
|
96
97
|
end
|
97
98
|
end
|
98
99
|
|
99
|
-
def prefix(event)
|
100
|
-
"#{event.
|
100
|
+
def prefix(event, connection_id: nil)
|
101
|
+
"[#{event.request_id}] #{event.address.to_s}#{connection_id && " ##{connection_id}"} | " +
|
102
|
+
"#{event.database_name}.#{event.command_name}"
|
101
103
|
end
|
102
104
|
|
103
105
|
def truncate(command)
|
@@ -45,6 +45,12 @@ module Mongo
|
|
45
45
|
# @api private
|
46
46
|
attr_reader :socket_object_id
|
47
47
|
|
48
|
+
# @return [ Integer ] The ID for the connection over which the command
|
49
|
+
# is sent.
|
50
|
+
#
|
51
|
+
# @api private
|
52
|
+
attr_reader :connection_id
|
53
|
+
|
48
54
|
# Create the new event.
|
49
55
|
#
|
50
56
|
# @example Create the event.
|
@@ -59,7 +65,7 @@ module Mongo
|
|
59
65
|
# @since 2.1.0
|
60
66
|
# @api private
|
61
67
|
def initialize(command_name, database_name, address, request_id,
|
62
|
-
operation_id, command, socket_object_id
|
68
|
+
operation_id, command, socket_object_id: nil, connection_id: nil
|
63
69
|
)
|
64
70
|
@command_name = command_name.to_s
|
65
71
|
@database_name = database_name
|
@@ -68,6 +74,7 @@ module Mongo
|
|
68
74
|
@operation_id = operation_id
|
69
75
|
@command = redacted(command_name, command)
|
70
76
|
@socket_object_id = socket_object_id
|
77
|
+
@connection_id = connection_id
|
71
78
|
end
|
72
79
|
|
73
80
|
# Create the event from a wire protocol message payload.
|
@@ -83,7 +90,9 @@ module Mongo
|
|
83
90
|
#
|
84
91
|
# @since 2.1.0
|
85
92
|
# @api private
|
86
|
-
def self.generate(address, operation_id, payload,
|
93
|
+
def self.generate(address, operation_id, payload,
|
94
|
+
socket_object_id: nil, connection_id: nil
|
95
|
+
)
|
87
96
|
new(
|
88
97
|
payload[:command_name],
|
89
98
|
payload[:database_name],
|
@@ -91,7 +100,8 @@ module Mongo
|
|
91
100
|
payload[:request_id],
|
92
101
|
operation_id,
|
93
102
|
payload[:command],
|
94
|
-
socket_object_id,
|
103
|
+
socket_object_id: socket_object_id,
|
104
|
+
connection_id: connection_id,
|
95
105
|
)
|
96
106
|
end
|
97
107
|
|
@@ -44,11 +44,13 @@ module Mongo
|
|
44
44
|
|
45
45
|
private
|
46
46
|
|
47
|
-
def command_started(address, operation_id, payload,
|
47
|
+
def command_started(address, operation_id, payload,
|
48
|
+
socket_object_id: nil, connection_id: nil
|
49
|
+
)
|
48
50
|
monitoring.started(
|
49
51
|
Monitoring::COMMAND,
|
50
52
|
Event::CommandStarted.generate(address, operation_id, payload,
|
51
|
-
socket_object_id)
|
53
|
+
socket_object_id: socket_object_id, connection_id: connection_id)
|
52
54
|
)
|
53
55
|
end
|
54
56
|
|
@@ -110,6 +110,7 @@ module Mongo
|
|
110
110
|
# The get more constant.
|
111
111
|
#
|
112
112
|
# @since 2.2.0
|
113
|
+
# @deprecated
|
113
114
|
GET_MORE = 'getMore'.freeze
|
114
115
|
|
115
116
|
# @return [ String ] collection The name of the collection.
|
@@ -148,7 +149,7 @@ module Mongo
|
|
148
149
|
# @since 2.1.0
|
149
150
|
def command
|
150
151
|
document = BSON::Document.new
|
151
|
-
document.store(
|
152
|
+
document.store('getMore', BSON::Int64.new(cursor_id))
|
152
153
|
document.store(Message::BATCH_SIZE, number_to_return)
|
153
154
|
document.store(Message::COLLECTION, collection)
|
154
155
|
document
|
@@ -52,7 +52,7 @@ module Mongo
|
|
52
52
|
command_name: 'killCursors',
|
53
53
|
database_name: @database,
|
54
54
|
command: upconverter.command,
|
55
|
-
request_id: request_id
|
55
|
+
request_id: request_id,
|
56
56
|
)
|
57
57
|
end
|
58
58
|
|
@@ -85,16 +85,6 @@ module Mongo
|
|
85
85
|
# @since 2.1.0
|
86
86
|
class Upconverter
|
87
87
|
|
88
|
-
# The kill cursors constant.
|
89
|
-
#
|
90
|
-
# @since 2.2.0
|
91
|
-
KILL_CURSORS = 'killCursors'.freeze
|
92
|
-
|
93
|
-
# The cursors constant.
|
94
|
-
#
|
95
|
-
# @since 2.2.0
|
96
|
-
CURSORS = 'cursors'.freeze
|
97
|
-
|
98
88
|
# @return [ String ] collection The name of the collection.
|
99
89
|
attr_reader :collection
|
100
90
|
|
@@ -125,8 +115,11 @@ module Mongo
|
|
125
115
|
# @since 2.1.0
|
126
116
|
def command
|
127
117
|
document = BSON::Document.new
|
128
|
-
document.store(
|
129
|
-
|
118
|
+
document.store('killCursors', collection)
|
119
|
+
store_ids = cursor_ids.map do |cursor_id|
|
120
|
+
BSON::Int64.new(cursor_id)
|
121
|
+
end
|
122
|
+
document.store('cursors', store_ids)
|
130
123
|
document
|
131
124
|
end
|
132
125
|
end
|
@@ -102,13 +102,16 @@ module Mongo
|
|
102
102
|
# Serializes and de-serializes one 32-bit integer.
|
103
103
|
module Int32
|
104
104
|
|
105
|
-
# Serializes a
|
105
|
+
# Serializes a number to a 32-bit integer
|
106
106
|
#
|
107
107
|
# @param buffer [ String ] Buffer to receive the serialized Int32.
|
108
|
-
# @param value [
|
108
|
+
# @param value [ Integer | BSON::Int32 ] 32-bit integer to be serialized.
|
109
109
|
#
|
110
110
|
# @return [String] Buffer with serialized value.
|
111
111
|
def self.serialize(buffer, value, validating_keys = BSON::Config.validating_keys?)
|
112
|
+
if value.is_a?(BSON::Int32)
|
113
|
+
value = value.value
|
114
|
+
end
|
112
115
|
buffer.put_int32(value)
|
113
116
|
end
|
114
117
|
|
@@ -127,13 +130,16 @@ module Mongo
|
|
127
130
|
# Serializes and de-serializes one 64-bit integer.
|
128
131
|
module Int64
|
129
132
|
|
130
|
-
# Serializes a
|
133
|
+
# Serializes a number to a 64-bit integer
|
131
134
|
#
|
132
135
|
# @param buffer [ String ] Buffer to receive the serialized Int64.
|
133
|
-
# @param value [
|
136
|
+
# @param value [ Integer | BSON::Int64 ] 64-bit integer to be serialized.
|
134
137
|
#
|
135
138
|
# @return [ String ] Buffer with serialized value.
|
136
139
|
def self.serialize(buffer, value, validating_keys = BSON::Config.validating_keys?)
|
140
|
+
if value.is_a?(BSON::Int64)
|
141
|
+
value = value.value
|
142
|
+
end
|
137
143
|
buffer.put_int64(value)
|
138
144
|
end
|
139
145
|
|
data/lib/mongo/retryable.rb
CHANGED
@@ -333,7 +333,7 @@ module Mongo
|
|
333
333
|
retry
|
334
334
|
rescue Error::OperationFailure => e
|
335
335
|
e.add_note("attempt #{attempt + 1}")
|
336
|
-
if
|
336
|
+
if e.retryable? && !(session && session.in_transaction?)
|
337
337
|
if attempt > client.max_read_retries
|
338
338
|
raise e
|
339
339
|
end
|
@@ -186,7 +186,7 @@ module Mongo
|
|
186
186
|
|
187
187
|
begin
|
188
188
|
handshake!(socket)
|
189
|
-
pending_connection = PendingConnection.new(socket, @server, monitoring, options)
|
189
|
+
pending_connection = PendingConnection.new(socket, @server, monitoring, options.merge(id: id))
|
190
190
|
authenticate!(pending_connection)
|
191
191
|
rescue Exception
|
192
192
|
socket.close
|
@@ -362,7 +362,11 @@ module Mongo
|
|
362
362
|
|
363
363
|
def authenticate!(pending_connection)
|
364
364
|
if options[:user] || options[:auth_mech]
|
365
|
-
|
365
|
+
user_options = Options::Redacted.new(:auth_mech => default_mechanism).merge(options)
|
366
|
+
if user_options[:auth_mech] == :mongodb_x509
|
367
|
+
user_options[:auth_source] = '$external'
|
368
|
+
end
|
369
|
+
user = Auth::User.new(user_options)
|
366
370
|
@server.handle_auth_failure! do
|
367
371
|
begin
|
368
372
|
Auth.get(user).login(pending_connection)
|
@@ -96,7 +96,8 @@ module Mongo
|
|
96
96
|
buffer = serialize(message)
|
97
97
|
ensure_connected do |socket|
|
98
98
|
operation_id = Monitoring.next_operation_id
|
99
|
-
command_started(address, operation_id, message.payload,
|
99
|
+
command_started(address, operation_id, message.payload,
|
100
|
+
socket_object_id: socket.object_id, connection_id: id)
|
100
101
|
start = Time.now
|
101
102
|
result = nil
|
102
103
|
begin
|
data/lib/mongo/server/monitor.rb
CHANGED
@@ -204,7 +204,7 @@ module Mongo
|
|
204
204
|
connection.ismaster
|
205
205
|
end
|
206
206
|
if exc
|
207
|
-
log_debug("Error running ismaster on #{server.address}: #{exc.message}")
|
207
|
+
log_debug("Error running ismaster on #{server.address}: #{exc.class}: #{exc.message}")
|
208
208
|
if monitoring.monitoring?
|
209
209
|
monitoring.failed(
|
210
210
|
Monitoring::SERVER_HEARTBEAT,
|
@@ -26,8 +26,14 @@ module Mongo
|
|
26
26
|
@options = options
|
27
27
|
@server = server
|
28
28
|
@monitoring = monitoring
|
29
|
+
@id = options[:id]
|
29
30
|
end
|
30
31
|
|
32
|
+
# @return [ Integer ] The ID for the connection. This is the same ID
|
33
|
+
# as that of the regular Connection object for which this
|
34
|
+
# PendingConnection instance was created.
|
35
|
+
attr_reader :id
|
36
|
+
|
31
37
|
def ensure_connected
|
32
38
|
yield @socket
|
33
39
|
end
|
data/lib/mongo/socket/ssl.rb
CHANGED
@@ -112,7 +112,7 @@ module Mongo
|
|
112
112
|
|
113
113
|
def verify_hostname?
|
114
114
|
@verify_hostname ||=
|
115
|
-
|
115
|
+
# If ssl_verify_hostname is not present, disable only if ssl_verify is
|
116
116
|
# explicitly set to false.
|
117
117
|
if options[:ssl_verify_hostname].nil?
|
118
118
|
options[:ssl_verify] != false
|
data/lib/mongo/uri.rb
CHANGED
@@ -241,7 +241,10 @@ module Mongo
|
|
241
241
|
#
|
242
242
|
# @since 2.0.0
|
243
243
|
def client_options
|
244
|
-
opts =
|
244
|
+
opts = uri_options.tap do |opts|
|
245
|
+
opts[:database] = @database if @database
|
246
|
+
end
|
247
|
+
|
245
248
|
@user ? opts.merge(credentials) : opts
|
246
249
|
end
|
247
250
|
|
@@ -442,35 +445,6 @@ module Mongo
|
|
442
445
|
decode(string) if string.length > 0
|
443
446
|
end
|
444
447
|
|
445
|
-
def default_client_options
|
446
|
-
opts = Options::Redacted.new(database: database)
|
447
|
-
|
448
|
-
if @uri_options[:auth_mech] || @user
|
449
|
-
opts[:auth_source] = default_auth_source
|
450
|
-
end
|
451
|
-
|
452
|
-
if @uri_options[:auth_mech] == :gssapi
|
453
|
-
opts[:auth_mech_properties] = default_auth_mech_properties
|
454
|
-
end
|
455
|
-
|
456
|
-
opts
|
457
|
-
end
|
458
|
-
|
459
|
-
def default_auth_mech_properties
|
460
|
-
{ service_name: 'mongodb' }
|
461
|
-
end
|
462
|
-
|
463
|
-
def default_auth_source
|
464
|
-
case @uri_options[:auth_mech]
|
465
|
-
when :gssapi, :mongodb_x509
|
466
|
-
:external
|
467
|
-
when :plain
|
468
|
-
@database || :external
|
469
|
-
else
|
470
|
-
@database || Database::ADMIN
|
471
|
-
end
|
472
|
-
end
|
473
|
-
|
474
448
|
def raise_invalid_error!(details)
|
475
449
|
raise Error::InvalidURI.new(@string, details, FORMAT)
|
476
450
|
end
|
@@ -544,7 +518,7 @@ module Mongo
|
|
544
518
|
uri_option 'connect', :connect, type: :symbol
|
545
519
|
|
546
520
|
# Auth Options
|
547
|
-
uri_option 'authsource', :auth_source
|
521
|
+
uri_option 'authsource', :auth_source
|
548
522
|
uri_option 'authmechanism', :auth_mech, :type => :auth_mech
|
549
523
|
uri_option 'authmechanismproperties', :auth_mech_properties, :type => :auth_mech_props
|
550
524
|
|
@@ -632,16 +606,6 @@ module Mongo
|
|
632
606
|
merge_uri_option(target, value, strategy[:name])
|
633
607
|
end
|
634
608
|
|
635
|
-
# Auth source transformation, either db string or :external.
|
636
|
-
#
|
637
|
-
# @param value [String] Authentication source.
|
638
|
-
#
|
639
|
-
# @return [String] If auth source is database name.
|
640
|
-
# @return [:external] If auth source is external authentication.
|
641
|
-
def auth_source(value)
|
642
|
-
value == '$external' ? :external : value
|
643
|
-
end
|
644
|
-
|
645
609
|
# Authentication mechanism transformation.
|
646
610
|
#
|
647
611
|
# @param value [String] The authentication mechanism.
|