mongo 2.11.0.rc0 → 2.11.0
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 +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.
|