mongo 2.1.0.rc0 → 2.1.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 +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
@@ -104,6 +104,26 @@ module Mongo
|
|
104
104
|
# @since 2.1.0
|
105
105
|
class Upconverter
|
106
106
|
|
107
|
+
# Insert field constant.
|
108
|
+
#
|
109
|
+
# @since 2.1.0
|
110
|
+
INSERT = 'insert'.freeze
|
111
|
+
|
112
|
+
# Documents field constant.
|
113
|
+
#
|
114
|
+
# @since 2.1.0
|
115
|
+
DOCUMENTS = 'documents'.freeze
|
116
|
+
|
117
|
+
# Ordered field constant.
|
118
|
+
#
|
119
|
+
# @since 2.1.0
|
120
|
+
ORDERED = 'ordered'.freeze
|
121
|
+
|
122
|
+
# Write concern field constant.
|
123
|
+
#
|
124
|
+
# @since 2.1.0
|
125
|
+
WRITE_CONCERN = 'writeConcern'.freeze
|
126
|
+
|
107
127
|
# @return [ String ] collection The name of the collection.
|
108
128
|
attr_reader :collection
|
109
129
|
|
@@ -138,12 +158,11 @@ module Mongo
|
|
138
158
|
#
|
139
159
|
# @since 2.1.0
|
140
160
|
def command
|
141
|
-
document = BSON::Document.new
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
)
|
146
|
-
document.merge!(writeConcern: options[:write_concern].options) if options[:write_concern]
|
161
|
+
document = BSON::Document.new
|
162
|
+
document.store(INSERT, collection)
|
163
|
+
document.store(DOCUMENTS, documents)
|
164
|
+
document.store(ORDERED, options.fetch(:ordered, true))
|
165
|
+
document.merge!(WRITE_CONCERN => options[:write_concern].options) if options[:write_concern]
|
147
166
|
document
|
148
167
|
end
|
149
168
|
end
|
data/lib/mongo/protocol/query.rb
CHANGED
@@ -158,37 +158,47 @@ module Mongo
|
|
158
158
|
#
|
159
159
|
# @since 2.1.0
|
160
160
|
OPTION_MAPPINGS = {
|
161
|
-
:project =>
|
162
|
-
:skip =>
|
163
|
-
:limit =>
|
164
|
-
:batch_size =>
|
165
|
-
}
|
161
|
+
:project => 'projection',
|
162
|
+
:skip => 'skip',
|
163
|
+
:limit => 'limit',
|
164
|
+
:batch_size => 'batchSize'
|
165
|
+
}.freeze
|
166
166
|
|
167
167
|
SPECIAL_FIELD_MAPPINGS = {
|
168
|
-
:$readPreference =>
|
169
|
-
:$orderby =>
|
170
|
-
:$hint =>
|
171
|
-
:$comment =>
|
172
|
-
:$returnKey =>
|
173
|
-
:$snapshot =>
|
174
|
-
:$maxScan =>
|
175
|
-
:$max =>
|
176
|
-
:$min =>
|
177
|
-
:$maxTimeMS =>
|
178
|
-
:$showDiskLoc =>
|
179
|
-
:$explain =>
|
180
|
-
}
|
168
|
+
:$readPreference => 'readPreference',
|
169
|
+
:$orderby => 'sort',
|
170
|
+
:$hint => 'hint',
|
171
|
+
:$comment => 'comment',
|
172
|
+
:$returnKey => 'returnKey',
|
173
|
+
:$snapshot => 'snapshot',
|
174
|
+
:$maxScan => 'maxScan',
|
175
|
+
:$max => 'max',
|
176
|
+
:$min => 'min',
|
177
|
+
:$maxTimeMS => 'maxTimeMS',
|
178
|
+
:$showDiskLoc => 'showRecordId',
|
179
|
+
:$explain => 'explain'
|
180
|
+
}.freeze
|
181
181
|
|
182
182
|
# Mapping of flags to find command options.
|
183
183
|
#
|
184
184
|
# @since 2.1.0
|
185
185
|
FLAG_MAPPINGS = {
|
186
|
-
:tailable_cursor =>
|
187
|
-
:oplog_replay =>
|
188
|
-
:no_cursor_timeout =>
|
189
|
-
:await_data =>
|
190
|
-
:partial =>
|
191
|
-
}
|
186
|
+
:tailable_cursor => 'tailable',
|
187
|
+
:oplog_replay => 'oplogReplay',
|
188
|
+
:no_cursor_timeout => 'noCursorTimeout',
|
189
|
+
:await_data => 'awaitData',
|
190
|
+
:partial => 'allowPartialResults'
|
191
|
+
}.freeze
|
192
|
+
|
193
|
+
# Find command constant.
|
194
|
+
#
|
195
|
+
# @since 2.1.0
|
196
|
+
FIND = 'find'.freeze
|
197
|
+
|
198
|
+
# Filter attribute constant.
|
199
|
+
#
|
200
|
+
# @since 2.1.0
|
201
|
+
FILTER = 'filter'.freeze
|
192
202
|
|
193
203
|
# @return [ String ] collection The name of the collection.
|
194
204
|
attr_reader :collection
|
@@ -242,7 +252,7 @@ module Mongo
|
|
242
252
|
#
|
243
253
|
# @since 2.1.0
|
244
254
|
def command_name
|
245
|
-
command? ? filter.keys.first :
|
255
|
+
command? ? filter.keys.first : FIND
|
246
256
|
end
|
247
257
|
|
248
258
|
private
|
@@ -252,21 +262,25 @@ module Mongo
|
|
252
262
|
end
|
253
263
|
|
254
264
|
def op_command
|
255
|
-
BSON::Document.new
|
265
|
+
document = BSON::Document.new
|
266
|
+
filter.each do |field, value|
|
267
|
+
document.store(field.to_s, value)
|
268
|
+
end
|
269
|
+
document
|
256
270
|
end
|
257
271
|
|
258
272
|
def find_command
|
259
273
|
document = BSON::Document.new
|
260
|
-
document
|
261
|
-
document
|
274
|
+
document.store(FIND, collection)
|
275
|
+
document.store(FILTER, filter[:$query] ? filter[:$query] : filter)
|
262
276
|
OPTION_MAPPINGS.each do |legacy, option|
|
263
|
-
document
|
277
|
+
document.store(option, options[legacy]) unless options[legacy].nil?
|
264
278
|
end
|
265
279
|
SPECIAL_FIELD_MAPPINGS.each do |special, normal|
|
266
|
-
document
|
280
|
+
document.store(normal, filter[special]) unless filter[special].nil?
|
267
281
|
end
|
268
282
|
FLAG_MAPPINGS.each do |legacy, flag|
|
269
|
-
document
|
283
|
+
document.store(flag, true) if flags.include?(legacy)
|
270
284
|
end
|
271
285
|
document
|
272
286
|
end
|
data/lib/mongo/protocol/reply.rb
CHANGED
@@ -101,6 +101,26 @@ module Mongo
|
|
101
101
|
# @since 2.1.0
|
102
102
|
class Upconverter
|
103
103
|
|
104
|
+
# Next batch constant.
|
105
|
+
#
|
106
|
+
# @since 2.1.0
|
107
|
+
NEXT_BATCH = 'nextBatch'.freeze
|
108
|
+
|
109
|
+
# First batch constant.
|
110
|
+
#
|
111
|
+
# @since 2.1.0
|
112
|
+
FIRST_BATCH = 'firstBatch'.freeze
|
113
|
+
|
114
|
+
# Cursor field constant.
|
115
|
+
#
|
116
|
+
# @since 2.1.0
|
117
|
+
CURSOR = 'cursor'.freeze
|
118
|
+
|
119
|
+
# Id field constant.
|
120
|
+
#
|
121
|
+
# @since 2.1.0
|
122
|
+
ID = 'id'.freeze
|
123
|
+
|
104
124
|
# @return [ Array<BSON::Document> ] documents The documents.
|
105
125
|
attr_reader :documents
|
106
126
|
|
@@ -141,18 +161,21 @@ module Mongo
|
|
141
161
|
private
|
142
162
|
|
143
163
|
def batch_field
|
144
|
-
starting_from > 0 ?
|
164
|
+
starting_from > 0 ? NEXT_BATCH : FIRST_BATCH
|
145
165
|
end
|
146
166
|
|
147
167
|
def command?
|
148
|
-
!documents.empty? && documents.first.key?(
|
168
|
+
!documents.empty? && documents.first.key?(Operation::Result::OK)
|
149
169
|
end
|
150
170
|
|
151
171
|
def find_command
|
152
|
-
BSON::Document.new
|
153
|
-
|
154
|
-
|
155
|
-
)
|
172
|
+
document = BSON::Document.new
|
173
|
+
cursor_document = BSON::Document.new
|
174
|
+
cursor_document.store(ID, cursor_id)
|
175
|
+
cursor_document.store(batch_field, documents)
|
176
|
+
document.store(Operation::Result::OK, 1)
|
177
|
+
document.store(CURSOR, cursor_document)
|
178
|
+
document
|
156
179
|
end
|
157
180
|
|
158
181
|
def op_command
|
@@ -0,0 +1,83 @@
|
|
1
|
+
# Copyright (C) 2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
|
17
|
+
# Defines basic behaviour around retrying operations.
|
18
|
+
#
|
19
|
+
# @since 2.1.0
|
20
|
+
module Retryable
|
21
|
+
|
22
|
+
# The not master error message.
|
23
|
+
#
|
24
|
+
# @since 2.1.0
|
25
|
+
NOT_MASTER = 'not master'.freeze
|
26
|
+
|
27
|
+
# Execute a read operation with a retry.
|
28
|
+
#
|
29
|
+
# @example Execute the read.
|
30
|
+
# read_with_retry do
|
31
|
+
# ...
|
32
|
+
# end
|
33
|
+
#
|
34
|
+
# @note This only retries read operations on socket errors.
|
35
|
+
#
|
36
|
+
# @param [ Proc ] block The block to execute.
|
37
|
+
#
|
38
|
+
# @return [ Result ] The result of the operation.
|
39
|
+
#
|
40
|
+
# @since 2.1.0
|
41
|
+
def read_with_retry(&block)
|
42
|
+
begin
|
43
|
+
block.call
|
44
|
+
rescue Error::SocketError, Error::SocketTimeoutError
|
45
|
+
retry_operation(&block)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Execute a write operation with a retry.
|
50
|
+
#
|
51
|
+
# @example Execute the write.
|
52
|
+
# write_with_retry do
|
53
|
+
# ...
|
54
|
+
# end
|
55
|
+
#
|
56
|
+
# @note This only retries operations on not master failures, since it is
|
57
|
+
# the only case we can be sure a partial write did not already occur.
|
58
|
+
#
|
59
|
+
# @param [ Proc ] block The block to execute.
|
60
|
+
#
|
61
|
+
# @return [ Result ] The result of the operation.
|
62
|
+
#
|
63
|
+
# @since 2.1.0
|
64
|
+
def write_with_retry(&block)
|
65
|
+
begin
|
66
|
+
block.call
|
67
|
+
rescue Error::OperationFailure => e
|
68
|
+
if e.message.include?(NOT_MASTER)
|
69
|
+
retry_operation(&block)
|
70
|
+
else
|
71
|
+
raise e
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def retry_operation(&block)
|
79
|
+
cluster.scan!
|
80
|
+
block.call
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
data/lib/mongo/server.rb
CHANGED
@@ -92,6 +92,21 @@ module Mongo
|
|
92
92
|
Context.new(self)
|
93
93
|
end
|
94
94
|
|
95
|
+
# Determine if a connection to the server is able to be established and
|
96
|
+
# messages can be sent to it.
|
97
|
+
#
|
98
|
+
# @example Is the server connectable?
|
99
|
+
# server.connectable?
|
100
|
+
#
|
101
|
+
# @return [ true, false ] If the server is connectable.
|
102
|
+
#
|
103
|
+
# @since 2.1.0
|
104
|
+
def connectable?
|
105
|
+
context.with_connection do |connection|
|
106
|
+
connection.connectable?
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
95
110
|
# Disconnect the server from the connection.
|
96
111
|
#
|
97
112
|
# @example Disconnect the server.
|
@@ -101,9 +116,7 @@ module Mongo
|
|
101
116
|
#
|
102
117
|
# @since 2.0.0
|
103
118
|
def disconnect!
|
104
|
-
|
105
|
-
connection.disconnect!
|
106
|
-
end
|
119
|
+
pool.disconnect!
|
107
120
|
monitor.stop! and true
|
108
121
|
end
|
109
122
|
|
@@ -20,6 +20,11 @@ module Mongo
|
|
20
20
|
# @since 2.0.0
|
21
21
|
module Connectable
|
22
22
|
|
23
|
+
# The ssl option prefix.
|
24
|
+
#
|
25
|
+
# @since 2.1.0
|
26
|
+
SSL = 'ssl'.freeze
|
27
|
+
|
23
28
|
# The default time in seconds to timeout a connection attempt.
|
24
29
|
#
|
25
30
|
# @since 2.0.0
|
@@ -34,6 +39,19 @@ module Mongo
|
|
34
39
|
# @return [ Integer ] pid The process id when the connection was created.
|
35
40
|
attr_reader :pid
|
36
41
|
|
42
|
+
# Determine if the server is connectable. This will check not only if the
|
43
|
+
# connection exists, but if messages can send to it successfully.
|
44
|
+
#
|
45
|
+
# @example Is the server connectable?
|
46
|
+
# connection.connectable?
|
47
|
+
#
|
48
|
+
# @return [ true, false ] If the connection is connectable.
|
49
|
+
#
|
50
|
+
# @since 2.1.0
|
51
|
+
def connectable?
|
52
|
+
begin; ping; rescue; false; end
|
53
|
+
end
|
54
|
+
|
37
55
|
# Determine if the connection is currently connected.
|
38
56
|
#
|
39
57
|
# @example Is the connection connected?
|
@@ -41,7 +59,7 @@ module Mongo
|
|
41
59
|
#
|
42
60
|
# @return [ true, false ] If connected.
|
43
61
|
#
|
44
|
-
# @
|
62
|
+
# @deprecated Use #connectable? instead
|
45
63
|
def connected?
|
46
64
|
!!@socket && @socket.alive?
|
47
65
|
end
|
@@ -68,10 +86,10 @@ module Mongo
|
|
68
86
|
|
69
87
|
def ensure_connected
|
70
88
|
ensure_same_process!
|
71
|
-
connect!
|
89
|
+
connect!
|
72
90
|
begin
|
73
91
|
yield socket
|
74
|
-
rescue
|
92
|
+
rescue Exception => e
|
75
93
|
disconnect!
|
76
94
|
raise e
|
77
95
|
end
|
@@ -23,6 +23,21 @@ module Mongo
|
|
23
23
|
include Monitoring::Publishable
|
24
24
|
extend Forwardable
|
25
25
|
|
26
|
+
# The ping command.
|
27
|
+
#
|
28
|
+
# @since 2.1.0
|
29
|
+
PING = { :ping => 1 }.freeze
|
30
|
+
|
31
|
+
# Ping message.
|
32
|
+
#
|
33
|
+
# @since 2.1.0
|
34
|
+
PING_MESSAGE = Protocol::Query.new(Database::ADMIN, Database::COMMAND, PING, :limit => -1)
|
35
|
+
|
36
|
+
# The ping message as raw bytes.
|
37
|
+
#
|
38
|
+
# @since 2.1.0
|
39
|
+
PING_BYTES = PING_MESSAGE.serialize.freeze
|
40
|
+
|
26
41
|
# @return [ Mongo::Auth::CR, Mongo::Auth::X509, Mongo::Auth:LDAP, Mongo::Auth::SCRAM ]
|
27
42
|
# authenticator The authentication strategy.
|
28
43
|
attr_reader :authenticator
|
@@ -60,7 +75,7 @@ module Mongo
|
|
60
75
|
def connect!
|
61
76
|
unless socket
|
62
77
|
@socket = address.socket(timeout, ssl_options)
|
63
|
-
|
78
|
+
socket.connect!
|
64
79
|
if authenticator
|
65
80
|
authenticator.login(self)
|
66
81
|
@authenticated = true
|
@@ -133,12 +148,31 @@ module Mongo
|
|
133
148
|
@monitoring = server.monitoring
|
134
149
|
@options = options.freeze
|
135
150
|
@server = server
|
136
|
-
@ssl_options = options.reject { |k, v| !k.to_s.start_with?(
|
151
|
+
@ssl_options = options.reject { |k, v| !k.to_s.start_with?(SSL) }
|
137
152
|
@socket = nil
|
138
153
|
@pid = Process.pid
|
139
154
|
setup_authentication!
|
140
155
|
end
|
141
156
|
|
157
|
+
# Ping the connection to see if the server is responding to commands.
|
158
|
+
# This is non-blocking on the server side.
|
159
|
+
#
|
160
|
+
# @example Ping the connection.
|
161
|
+
# connection.ping
|
162
|
+
#
|
163
|
+
# @note This uses a pre-serialized ping message for optimization.
|
164
|
+
#
|
165
|
+
# @return [ true, false ] If the server is accepting connections.
|
166
|
+
#
|
167
|
+
# @since 2.1.0
|
168
|
+
def ping
|
169
|
+
ensure_connected do |socket|
|
170
|
+
socket.write(PING_BYTES)
|
171
|
+
reply = Protocol::Reply.deserialize(socket)
|
172
|
+
reply.documents[0][Operation::Result::OK] == 1
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
142
176
|
private
|
143
177
|
|
144
178
|
def deliver(messages)
|
@@ -149,12 +183,12 @@ module Mongo
|
|
149
183
|
def setup_authentication!
|
150
184
|
if options[:user]
|
151
185
|
default_mechanism = @server.features.scram_sha_1_enabled? ? :scram : :mongodb_cr
|
152
|
-
user = Auth::User.new(
|
186
|
+
user = Auth::User.new(Options::Redacted.new(:auth_mech => default_mechanism).merge(options))
|
153
187
|
@authenticator = Auth.get(user)
|
154
188
|
end
|
155
189
|
end
|
156
190
|
|
157
|
-
def write(messages, buffer = '')
|
191
|
+
def write(messages, buffer = ''.force_encoding(BSON::BINARY))
|
158
192
|
start_size = 0
|
159
193
|
messages.each do |message|
|
160
194
|
message.serialize(buffer, max_bson_object_size)
|