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.
Files changed (170) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +1 -5
  4. data/Rakefile +15 -9
  5. data/lib/mongo.rb +4 -2
  6. data/lib/mongo/auth/aws/request.rb +4 -2
  7. data/lib/mongo/bulk_write.rb +1 -0
  8. data/lib/mongo/client.rb +143 -21
  9. data/lib/mongo/cluster.rb +53 -17
  10. data/lib/mongo/cluster/sdam_flow.rb +13 -10
  11. data/lib/mongo/cluster/topology/replica_set_no_primary.rb +3 -2
  12. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  13. data/lib/mongo/cluster/topology/single.rb +1 -1
  14. data/lib/mongo/collection.rb +17 -13
  15. data/lib/mongo/collection/view/readable.rb +3 -1
  16. data/lib/mongo/collection/view/writable.rb +41 -5
  17. data/lib/mongo/database.rb +31 -4
  18. data/lib/mongo/database/view.rb +19 -4
  19. data/lib/mongo/distinguishing_semaphore.rb +55 -0
  20. data/lib/mongo/error.rb +1 -0
  21. data/lib/mongo/error/invalid_session.rb +2 -1
  22. data/lib/mongo/error/operation_failure.rb +6 -0
  23. data/lib/mongo/error/sessions_not_supported.rb +35 -0
  24. data/lib/mongo/event/base.rb +6 -0
  25. data/lib/mongo/grid/file.rb +5 -0
  26. data/lib/mongo/grid/file/chunk.rb +2 -0
  27. data/lib/mongo/grid/fs_bucket.rb +15 -13
  28. data/lib/mongo/grid/stream/write.rb +9 -3
  29. data/lib/mongo/monitoring.rb +38 -0
  30. data/lib/mongo/monitoring/command_log_subscriber.rb +10 -2
  31. data/lib/mongo/monitoring/event/command_failed.rb +11 -0
  32. data/lib/mongo/monitoring/event/command_started.rb +37 -2
  33. data/lib/mongo/monitoring/event/command_succeeded.rb +11 -0
  34. data/lib/mongo/monitoring/event/server_closed.rb +1 -1
  35. data/lib/mongo/monitoring/event/server_description_changed.rb +27 -4
  36. data/lib/mongo/monitoring/event/server_heartbeat_failed.rb +9 -2
  37. data/lib/mongo/monitoring/event/server_heartbeat_started.rb +9 -2
  38. data/lib/mongo/monitoring/event/server_heartbeat_succeeded.rb +9 -2
  39. data/lib/mongo/monitoring/event/server_opening.rb +1 -1
  40. data/lib/mongo/monitoring/event/topology_changed.rb +1 -1
  41. data/lib/mongo/monitoring/event/topology_closed.rb +1 -1
  42. data/lib/mongo/monitoring/event/topology_opening.rb +1 -1
  43. data/lib/mongo/monitoring/publishable.rb +6 -3
  44. data/lib/mongo/monitoring/server_description_changed_log_subscriber.rb +9 -1
  45. data/lib/mongo/monitoring/topology_changed_log_subscriber.rb +1 -1
  46. data/lib/mongo/protocol/message.rb +36 -8
  47. data/lib/mongo/protocol/msg.rb +14 -0
  48. data/lib/mongo/protocol/serializers.rb +5 -2
  49. data/lib/mongo/server.rb +10 -3
  50. data/lib/mongo/server/connection.rb +4 -4
  51. data/lib/mongo/server/connection_base.rb +3 -1
  52. data/lib/mongo/server/description.rb +5 -0
  53. data/lib/mongo/server/monitor.rb +76 -44
  54. data/lib/mongo/server/monitor/connection.rb +55 -7
  55. data/lib/mongo/server/pending_connection.rb +14 -4
  56. data/lib/mongo/server/push_monitor.rb +173 -0
  57. data/{spec/runners/transactions/context.rb → lib/mongo/server/push_monitor/connection.rb} +9 -14
  58. data/lib/mongo/server_selector.rb +0 -1
  59. data/lib/mongo/server_selector/base.rb +579 -1
  60. data/lib/mongo/server_selector/nearest.rb +1 -6
  61. data/lib/mongo/server_selector/primary.rb +1 -6
  62. data/lib/mongo/server_selector/primary_preferred.rb +7 -10
  63. data/lib/mongo/server_selector/secondary.rb +1 -6
  64. data/lib/mongo/server_selector/secondary_preferred.rb +1 -7
  65. data/lib/mongo/session.rb +2 -0
  66. data/lib/mongo/socket.rb +20 -8
  67. data/lib/mongo/socket/ssl.rb +1 -1
  68. data/lib/mongo/socket/tcp.rb +1 -1
  69. data/lib/mongo/topology_version.rb +9 -0
  70. data/lib/mongo/utils.rb +62 -0
  71. data/lib/mongo/version.rb +1 -1
  72. data/spec/README.aws-auth.md +2 -2
  73. data/spec/integration/awaited_ismaster_spec.rb +28 -0
  74. data/spec/integration/change_stream_examples_spec.rb +6 -2
  75. data/spec/integration/check_clean_slate_spec.rb +16 -0
  76. data/spec/integration/client_construction_spec.rb +1 -0
  77. data/spec/integration/connect_single_rs_name_spec.rb +5 -2
  78. data/spec/integration/connection_spec.rb +7 -4
  79. data/spec/integration/crud_spec.rb +4 -4
  80. data/spec/integration/docs_examples_spec.rb +6 -0
  81. data/spec/integration/grid_fs_bucket_spec.rb +48 -0
  82. data/spec/integration/heartbeat_events_spec.rb +4 -23
  83. data/spec/integration/read_concern_spec.rb +1 -1
  84. data/spec/integration/retryable_errors_spec.rb +1 -1
  85. data/spec/integration/retryable_writes/shared/performs_legacy_retries.rb +2 -2
  86. data/spec/integration/retryable_writes/shared/performs_modern_retries.rb +3 -3
  87. data/spec/integration/retryable_writes/shared/performs_no_retries.rb +2 -2
  88. data/spec/integration/sdam_error_handling_spec.rb +37 -15
  89. data/spec/integration/sdam_events_spec.rb +77 -6
  90. data/spec/integration/sdam_prose_spec.rb +64 -0
  91. data/spec/integration/server_monitor_spec.rb +25 -1
  92. data/spec/integration/size_limit_spec.rb +7 -3
  93. data/spec/integration/size_limit_spec.rb~12e1e9c4f... RUBY-2242 Fix zlib compression (#2021) +98 -0
  94. data/spec/integration/ssl_uri_options_spec.rb +2 -2
  95. data/spec/integration/zlib_compression_spec.rb +25 -0
  96. data/spec/lite_spec_helper.rb +12 -5
  97. data/spec/mongo/auth/aws/request_spec.rb +76 -0
  98. data/spec/mongo/auth/scram_spec.rb +1 -1
  99. data/spec/mongo/client_construction_spec.rb +207 -0
  100. data/spec/mongo/client_spec.rb +38 -3
  101. data/spec/mongo/cluster/topology/replica_set_spec.rb +52 -9
  102. data/spec/mongo/cluster/topology/single_spec.rb +4 -2
  103. data/spec/mongo/cluster_spec.rb +34 -35
  104. data/spec/mongo/collection/view/change_stream_resume_spec.rb +6 -6
  105. data/spec/mongo/collection_spec.rb +500 -0
  106. data/spec/mongo/database_spec.rb +245 -8
  107. data/spec/mongo/distinguishing_semaphore_spec.rb +63 -0
  108. data/spec/mongo/error/operation_failure_spec.rb +40 -0
  109. data/spec/mongo/index/view_spec.rb +2 -2
  110. data/spec/mongo/monitoring/event/server_description_changed_spec.rb +1 -4
  111. data/spec/mongo/protocol/msg_spec.rb +10 -0
  112. data/spec/mongo/semaphore_spec.rb +51 -0
  113. data/spec/mongo/server/connection_auth_spec.rb +2 -2
  114. data/spec/mongo/server_selector/nearest_spec.rb +23 -23
  115. data/spec/mongo/server_selector/primary_preferred_spec.rb +26 -26
  116. data/spec/mongo/server_selector/primary_spec.rb +9 -9
  117. data/spec/mongo/server_selector/secondary_preferred_spec.rb +22 -22
  118. data/spec/mongo/server_selector/secondary_spec.rb +18 -18
  119. data/spec/mongo/server_selector_spec.rb +4 -4
  120. data/spec/mongo/session_spec.rb +35 -0
  121. data/spec/runners/change_streams/test.rb +2 -2
  122. data/spec/runners/cmap.rb +1 -1
  123. data/spec/runners/command_monitoring.rb +3 -34
  124. data/spec/runners/crud/context.rb +9 -5
  125. data/spec/runners/crud/operation.rb +59 -27
  126. data/spec/runners/crud/spec.rb +0 -8
  127. data/spec/runners/crud/test.rb +1 -1
  128. data/spec/runners/sdam.rb +2 -2
  129. data/spec/runners/server_selection.rb +242 -28
  130. data/spec/runners/transactions.rb +12 -12
  131. data/spec/runners/transactions/operation.rb +151 -25
  132. data/spec/runners/transactions/test.rb +60 -16
  133. data/spec/spec_tests/command_monitoring_spec.rb +22 -12
  134. data/spec/spec_tests/crud_spec.rb +1 -1
  135. data/spec/spec_tests/data/change_streams/change-streams-errors.yml +4 -8
  136. data/spec/spec_tests/data/change_streams/change-streams-resume-whitelist.yml +66 -0
  137. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/MaxStalenessTooSmall.yml +15 -0
  138. data/spec/spec_tests/data/max_staleness/ReplicaSetNoPrimary/NoKnownServers.yml +4 -3
  139. data/spec/spec_tests/data/max_staleness/Unknown/SmallMaxStaleness.yml +1 -0
  140. data/spec/spec_tests/data/sdam_integration/cancel-server-check.yml +96 -0
  141. data/spec/spec_tests/data/sdam_integration/connectTimeoutMS.yml +88 -0
  142. data/spec/spec_tests/data/sdam_integration/find-network-error.yml +83 -0
  143. data/spec/spec_tests/data/sdam_integration/find-shutdown-error.yml +116 -0
  144. data/spec/spec_tests/data/sdam_integration/insert-network-error.yml +86 -0
  145. data/spec/spec_tests/data/sdam_integration/insert-shutdown-error.yml +115 -0
  146. data/spec/spec_tests/data/sdam_integration/isMaster-command-error.yml +168 -0
  147. data/spec/spec_tests/data/sdam_integration/isMaster-network-error.yml +162 -0
  148. data/spec/spec_tests/data/sdam_integration/isMaster-timeout.yml +229 -0
  149. data/spec/spec_tests/data/sdam_integration/rediscover-quickly-after-step-down.yml +87 -0
  150. data/spec/spec_tests/max_staleness_spec.rb +4 -142
  151. data/spec/spec_tests/retryable_reads_spec.rb +2 -2
  152. data/spec/spec_tests/sdam_integration_spec.rb +13 -0
  153. data/spec/spec_tests/sdam_monitoring_spec.rb +1 -2
  154. data/spec/spec_tests/server_selection_spec.rb +4 -116
  155. data/spec/stress/cleanup_spec.rb +17 -2
  156. data/spec/stress/connection_pool_stress_spec.rb +10 -8
  157. data/spec/support/child_process_helper.rb +78 -0
  158. data/spec/support/client_registry.rb +1 -0
  159. data/spec/support/cluster_config.rb +4 -0
  160. data/spec/support/event_subscriber.rb +123 -33
  161. data/spec/support/keyword_struct.rb +26 -0
  162. data/spec/support/shared/server_selector.rb +13 -1
  163. data/spec/support/spec_config.rb +38 -13
  164. data/spec/support/spec_organizer.rb +129 -0
  165. data/spec/support/spec_setup.rb +1 -1
  166. data/spec/support/utils.rb +46 -0
  167. metadata +992 -942
  168. metadata.gz.sig +0 -0
  169. data/lib/mongo/server_selector/selectable.rb +0 -560
  170. data/spec/runners/sdam_monitoring.rb +0 -89
@@ -20,7 +20,6 @@ module Mongo
20
20
  #
21
21
  # @since 2.0.0
22
22
  class Nearest < Base
23
- include Selectable
24
23
 
25
24
  # Name of the this read preference in the server's format.
26
25
  #
@@ -92,14 +91,10 @@ module Mongo
92
91
  # Select the near servers taking into account any defined tag sets and
93
92
  # local threshold between the nearest server and other servers.
94
93
  #
95
- # @example Select nearest servers given a list of candidates.
96
- # preference = Mongo::ServerSelector::Nearest.new
97
- # preference.select_server(cluster)
98
- #
99
94
  # @return [ Array ] The nearest servers from the list of candidates.
100
95
  #
101
96
  # @since 2.0.0
102
- def select(candidates)
97
+ def select_in_replica_set(candidates)
103
98
  matching_servers = filter_stale_servers(candidates, primary(candidates).first)
104
99
  matching_servers = match_tag_sets(matching_servers) unless tag_sets.empty?
105
100
  near_servers(matching_servers)
@@ -21,7 +21,6 @@ module Mongo
21
21
  #
22
22
  # @since 2.0.0
23
23
  class Primary < Base
24
- include Selectable
25
24
 
26
25
  # Name of the this read preference in the server's format.
27
26
  #
@@ -94,14 +93,10 @@ module Mongo
94
93
 
95
94
  # Select the primary server from a list of candidates.
96
95
  #
97
- # @example Select the primary server given a list of candidates.
98
- # preference = Mongo::ServerSelector::Primary.new
99
- # preference.select([candidate_1, candidate_2])
100
- #
101
96
  # @return [ Array ] The primary server from the list of candidates.
102
97
  #
103
98
  # @since 2.0.0
104
- def select(candidates)
99
+ def select_in_replica_set(candidates)
105
100
  primary(candidates)
106
101
  end
107
102
 
@@ -21,7 +21,6 @@ module Mongo
21
21
  #
22
22
  # @since 2.0.0
23
23
  class PrimaryPreferred < Base
24
- include Selectable
25
24
 
26
25
  # Name of the this read preference in the server's format.
27
26
  #
@@ -93,19 +92,17 @@ module Mongo
93
92
  # Select servers taking into account any defined tag sets and
94
93
  # local threshold, with the primary preferred.
95
94
  #
96
- # @example Select servers given a list of candidates,
97
- # with the primary preferred.
98
- # preference = Mongo::ServerSelector::PrimaryPreferred.new
99
- # preference.select([candidate_1, candidate_2])
100
- #
101
95
  # @return [ Array ] A list of servers matching tag sets and acceptable
102
96
  # latency with the primary preferred.
103
97
  #
104
98
  # @since 2.0.0
105
- def select(candidates)
106
- primary = primary(candidates)
107
- secondaries = near_servers(secondaries(candidates))
108
- primary.first ? primary : secondaries
99
+ def select_in_replica_set(candidates)
100
+ primaries = primary(candidates)
101
+ if primaries.first
102
+ primaries
103
+ else
104
+ near_servers(secondaries(candidates))
105
+ end
109
106
  end
110
107
 
111
108
  def max_staleness_allowed?
@@ -21,7 +21,6 @@ module Mongo
21
21
  #
22
22
  # @since 2.0.0
23
23
  class Secondary < Base
24
- include Selectable
25
24
 
26
25
  # Name of the this read preference in the server's format.
27
26
  #
@@ -93,14 +92,10 @@ module Mongo
93
92
  # Select the secondary servers taking into account any defined tag sets and
94
93
  # local threshold between the nearest secondary and other secondaries.
95
94
  #
96
- # @example Select secondary servers given a list of candidates.
97
- # preference = Mongo::ServerSelector::Secondary.new
98
- # preference.select([candidate_1, candidate_2])
99
- #
100
95
  # @return [ Array ] The secondary servers from the list of candidates.
101
96
  #
102
97
  # @since 2.0.0
103
- def select(candidates)
98
+ def select_in_replica_set(candidates)
104
99
  near_servers(secondaries(candidates))
105
100
  end
106
101
 
@@ -21,7 +21,6 @@ module Mongo
21
21
  #
22
22
  # @since 2.0.0
23
23
  class SecondaryPreferred < Base
24
- include Selectable
25
24
 
26
25
  # Name of the this read preference in the server's format.
27
26
  #
@@ -101,16 +100,11 @@ module Mongo
101
100
  # Select servers taking into account any defined tag sets and
102
101
  # local threshold, with secondaries.
103
102
  #
104
- # @example Select servers given a list of candidates,
105
- # with secondaries preferred.
106
- # preference = Mongo::ServerSelector::SecondaryPreferred.new
107
- # preference.select([candidate_1, candidate_2])
108
- #
109
103
  # @return [ Array ] A list of servers matching tag sets and acceptable
110
104
  # latency with secondaries preferred.
111
105
  #
112
106
  # @since 2.0.0
113
- def select(candidates)
107
+ def select_in_replica_set(candidates)
114
108
  near_servers(secondaries(candidates)) + primary(candidates)
115
109
  end
116
110
 
@@ -227,7 +227,9 @@ module Mongo
227
227
  # Error message describing that sessions are not supported by the server version.
228
228
  #
229
229
  # @since 2.5.0
230
+ # @deprecated
230
231
  SESSIONS_NOT_SUPPORTED = 'Sessions are not supported by the connected servers.'.freeze
232
+ # Note: SESSIONS_NOT_SUPPORTED is used by Mongoid - do not remove from driver.
231
233
 
232
234
  # The state of a session in which the last operation was not related to
233
235
  # any transaction or no operations have yet occurred.
@@ -21,6 +21,7 @@ module Mongo
21
21
  # Provides additional data around sockets for the driver's use.
22
22
  #
23
23
  # @since 2.0.0
24
+ # @api private
24
25
  class Socket
25
26
  include ::Socket::Constants
26
27
 
@@ -105,9 +106,14 @@ module Mongo
105
106
  def summary
106
107
  fileno = @socket&.fileno rescue '<no socket>' || '<no socket>'
107
108
  if monitor?
108
- "#{connection_address}:m #{fileno}"
109
+ indicator = if options[:push]
110
+ 'pm'
111
+ else
112
+ 'm'
113
+ end
114
+ "#{connection_address};#{indicator};fd=#{fileno}"
109
115
  else
110
- "#{connection_address}:c:#{connection_generation} #{fileno}"
116
+ "#{connection_address};c:#{connection_generation};fd=#{fileno}"
111
117
  end
112
118
  end
113
119
 
@@ -173,20 +179,21 @@ module Mongo
173
179
  # socket.read(4096)
174
180
  #
175
181
  # @param [ Integer ] length The number of bytes to read.
182
+ # @param [ Numeric ] timeout The timeout to use for each chunk read.
176
183
  #
177
184
  # @raise [ Mongo::SocketError ] If not all data is returned.
178
185
  #
179
186
  # @return [ Object ] The data from the socket.
180
187
  #
181
188
  # @since 2.0.0
182
- def read(length)
189
+ def read(length, timeout: nil)
183
190
  map_exceptions do
184
- data = read_from_socket(length)
191
+ data = read_from_socket(length, timeout: timeout)
185
192
  unless (data.length > 0 || length == 0)
186
193
  raise IOError, "Expected to read > 0 bytes but read 0 bytes"
187
194
  end
188
195
  while data.length < length
189
- chunk = read_from_socket(length - data.length)
196
+ chunk = read_from_socket(length - data.length, timeout: timeout)
190
197
  unless (chunk.length > 0 || length == 0)
191
198
  raise IOError, "Expected to read > 0 bytes but read 0 bytes"
192
199
  end
@@ -243,14 +250,19 @@ module Mongo
243
250
 
244
251
  private
245
252
 
246
- def read_from_socket(length)
253
+ def read_from_socket(length, timeout: nil)
247
254
  # Just in case
248
255
  if length == 0
249
256
  return ''.force_encoding('BINARY')
250
257
  end
251
258
 
252
- if _timeout = self.timeout
253
- deadline = Time.now + _timeout
259
+ _timeout = timeout || self.timeout
260
+ if _timeout
261
+ if _timeout > 0
262
+ deadline = Time.now + _timeout
263
+ elsif _timeout < 0
264
+ raise Errno::ETIMEDOUT, "Negative timeout #{_timeout} given to socket"
265
+ end
254
266
  end
255
267
 
256
268
  # We want to have a fixed and reasonably small size buffer for reads
@@ -137,7 +137,7 @@ module Mongo
137
137
  #
138
138
  # @since 2.0.0
139
139
  def connect!
140
- Timeout.timeout(options[:connect_timeout], Error::SocketTimeoutError) do
140
+ Timeout.timeout(options[:connect_timeout], Error::SocketTimeoutError, "The socket took over #{options[:connect_timeout]} seconds to connect") do
141
141
  map_exceptions do
142
142
  @tcp_socket.connect(::Socket.pack_sockaddr_in(port, host))
143
143
  end
@@ -74,7 +74,7 @@ module Mongo
74
74
  #
75
75
  # @since 2.0.0
76
76
  def connect!
77
- Timeout.timeout(options[:connect_timeout], Error::SocketTimeoutError) do
77
+ Timeout.timeout(options[:connect_timeout], Error::SocketTimeoutError, "The socket took over #{options[:connect_timeout]} seconds to connect") do
78
78
  socket.setsockopt(IPPROTO_TCP, TCP_NODELAY, 1)
79
79
  map_exceptions do
80
80
  socket.connect(::Socket.pack_sockaddr_in(port, host))
@@ -76,5 +76,14 @@ module Mongo
76
76
  counter >= other.counter
77
77
  end
78
78
  end
79
+
80
+ # Converts the object to a document suitable for being sent to the server.
81
+ #
82
+ # @return [ BSON::Document ] The document.
83
+ #
84
+ # @api private
85
+ def to_doc
86
+ BSON::Document.new(self).merge(counter: BSON::Int64.new(counter))
87
+ end
79
88
  end
80
89
  end
@@ -0,0 +1,62 @@
1
+ # Copyright (C) 2020 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
+ # @api private
18
+ module Utils
19
+
20
+ class LocalLogger
21
+ include Loggable
22
+
23
+ def initialize(**opts)
24
+ @options = opts
25
+ end
26
+
27
+ attr_reader :options
28
+ end
29
+
30
+ # @option opts [ true | false | nil | Integer ] :bg_error_backtrace
31
+ # Experimental. Set to true to log complete backtraces for errors in
32
+ # background threads. Set to false or nil to not log backtraces. Provide
33
+ # a positive integer to log up to that many backtrace lines.
34
+ # @option opts [ Logger ] :logger A custom logger to use.
35
+ # @option opts [ String ] :log_prefix A custom log prefix to use when
36
+ # logging.
37
+ module_function def warn_monitor_exception(msg, exc, **opts)
38
+ bt_excerpt = excerpt_backtrace(exc, **opts)
39
+ logger = LocalLogger.new(**opts)
40
+ logger.log_warn("#{msg}: #{exc.class}: #{exc}#{bt_excerpt}")
41
+ end
42
+
43
+ # @option opts [ true | false | nil | Integer ] :bg_error_backtrace
44
+ # Experimental. Set to true to log complete backtraces for errors in
45
+ # background threads. Set to false or nil to not log backtraces. Provide
46
+ # a positive integer to log up to that many backtrace lines.
47
+ module_function def excerpt_backtrace(exc, **opts)
48
+ case lines = opts[:bg_error_backtrace]
49
+ when Integer
50
+ ":\n#{exc.backtrace[0..lines].join("\n")}"
51
+ when false, nil
52
+ nil
53
+ else
54
+ ":\n#{exc.backtrace.join("\n")}"
55
+ end
56
+ end
57
+
58
+ module_function def shallow_symbolize_keys(hash)
59
+ Hash[hash.map { |k, v| [k.to_sym, v] }]
60
+ end
61
+ end
62
+ end
@@ -17,5 +17,5 @@ module Mongo
17
17
  # The current version of the driver.
18
18
  #
19
19
  # @since 2.0.0
20
- VERSION = '2.13.0.beta1'
20
+ VERSION = '2.13.0.rc1'.freeze
21
21
  end
@@ -233,7 +233,7 @@ To provision the instance for running the driver's test suite via Docker, run:
233
233
  To run the AWS auth tests using the EC2 instance role credentials, run:
234
234
 
235
235
  ./.evergreen/test-docker-remote ubuntu@$ip \
236
- MONGODB_VERSION=4.3 AUTH=aws-ec2 \
236
+ MONGODB_VERSION=4.4 AUTH=aws-ec2 \
237
237
  -s .evergreen/run-tests-aws-auth.sh \
238
238
  -a .env.private
239
239
 
@@ -299,7 +299,7 @@ If the public IP address is in the `IP` shell variable, provision the task:
299
299
 
300
300
  To run the credentials retrieval test on the ECS task, execute:
301
301
 
302
- ./.evergreen/test-remote root@$IP env AUTH=aws-ecs RVM_RUBY=ruby-2.7 MONGODB_VERSION=4.3 TEST_CMD='rspec spec/integration/aws*spec.rb' .evergreen/run-tests.sh
302
+ ./.evergreen/test-remote root@$IP env AUTH=aws-ecs RVM_RUBY=ruby-2.7 MONGODB_VERSION=4.4 TEST_CMD='rspec spec/integration/aws*spec.rb' .evergreen/run-tests.sh
303
303
 
304
304
  To run the test again without rebuilding the remote environment, execute:
305
305
 
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'awaited ismaster' do
4
+ min_server_fcv '4.4'
5
+
6
+ # If we send the consecutive ismasters to different mongoses,
7
+ # they have different process ids, and so the awaited one would return
8
+ # immediately.
9
+ require_no_multi_shard
10
+
11
+ let(:client) { authorized_client }
12
+
13
+ it 'waits' do
14
+ # Perform a regular ismaster to get topology version
15
+ resp = client.database.command(ismaster: 1)
16
+ doc = resp.replies.first.documents.first
17
+ tv = Mongo::TopologyVersion.new(doc['topologyVersion'])
18
+ tv.should be_a(BSON::Document)
19
+
20
+ elapsed_time = Benchmark.realtime do
21
+ resp = client.database.command(ismaster: 1,
22
+ topologyVersion: tv.to_doc, maxAwaitTimeMS: 500)
23
+ end
24
+ doc = resp.replies.first.documents.first
25
+
26
+ elapsed_time.should > 0.5
27
+ end
28
+ end
@@ -174,8 +174,10 @@ describe 'change streams examples in Ruby' do
174
174
 
175
175
  # Start Changestream Example 4
176
176
 
177
- pipeline = [ {'$match' => { '$or' => [{ 'fullDocument.username' => 'alice' },
178
- { 'operationType' => 'delete' }] } }]
177
+ pipeline = [
178
+ { "$match" => { 'fullDocument.username' => 'alice' } },
179
+ { "$addFields" => { 'newField' => 'this is an added field!' } }
180
+ ];
179
181
  cursor = inventory.watch(pipeline).to_enum
180
182
  cursor.next
181
183
 
@@ -191,6 +193,8 @@ describe 'change streams examples in Ruby' do
191
193
  expect(change['fullDocument']).not_to be_nil
192
194
  expect(change['fullDocument']['_id']).not_to be_nil
193
195
  expect(change['fullDocument']['username']).to eq('alice')
196
+ expect(change['newField']).not_to be_nil
197
+ expect(change['newField']).to eq('this is an added field!')
194
198
  expect(change['ns']).not_to be_nil
195
199
  expect(change['ns']['db']).to eq(SpecConfig.instance.test_db)
196
200
  expect(change['ns']['coll']).to eq(inventory.name)
@@ -0,0 +1,16 @@
1
+ require 'lite_spec_helper'
2
+
3
+ # This test can be used to manually verify that there are no leaked
4
+ # background threads - execute it after executing another test (in the same
5
+ # rspec run) that is suspected to leak background threads, such as by
6
+ # running:
7
+ #
8
+ # rspec your_spec.rb spec/integration/check_clean_slate_spec.rb
9
+
10
+ describe 'Check clean slate' do
11
+ clean_slate_for_all_if_possible
12
+
13
+ it 'checks' do
14
+ # Nothing
15
+ end
16
+ end
@@ -10,6 +10,7 @@ describe 'Client construction' do
10
10
  ).merge(SpecConfig.instance.credentials_or_external_user(
11
11
  user: SpecConfig.instance.test_user.name,
12
12
  password: SpecConfig.instance.test_user.password,
13
+ auth_source: 'admin',
13
14
  ))
14
15
  end
15
16
 
@@ -18,7 +18,9 @@ describe 'Direct connection with RS name' do
18
18
  new_local_client(
19
19
  [SpecConfig.instance.addresses.first],
20
20
  SpecConfig.instance.test_options.merge(
21
- replica_set: replica_set_name, connect: :direct))
21
+ replica_set: replica_set_name, connect: :direct,
22
+ server_selection_timeout: 3.32,
23
+ ))
22
24
  end
23
25
 
24
26
  context 'in replica set' do
@@ -31,7 +33,8 @@ describe 'Direct connection with RS name' do
31
33
 
32
34
  it 'creates a working client' do
33
35
  expect do
34
- client.database.command(ismaster: 1)
36
+ res = client.database.command(ismaster: 1)
37
+ p res
35
38
  end.not_to raise_error
36
39
  end
37
40
  end
@@ -1,5 +1,4 @@
1
1
  require 'spec_helper'
2
- require 'runners/sdam_monitoring'
3
2
 
4
3
  describe 'Connections' do
5
4
  clean_slate
@@ -26,6 +25,9 @@ describe 'Connections' do
26
25
  # RSpec::Expectations::ExpectationNotMetError: expected Mongo::Error::SocketError, got #<NameError: undefined method `write' for class `Mongo::Socket'>
27
26
  fails_on_jruby
28
27
 
28
+ # 4.4 has two monitors and thus our socket mocks get hit twice
29
+ max_server_version '4.2'
30
+
29
31
  let(:exception) { Mongo::Error::SocketError }
30
32
 
31
33
  let(:error) do
@@ -44,7 +46,8 @@ describe 'Connections' do
44
46
  end
45
47
 
46
48
  context 'with sdam event subscription' do
47
- let(:subscriber) { Mongo::SDAMMonitoring::TestSubscriber.new }
49
+
50
+ let(:subscriber) { EventSubscriber.new }
48
51
  let(:client) do
49
52
  ClientRegistry.instance.global_client('authorized').with(app_name: 'connection_integration').tap do |client|
50
53
  client.subscribe(Mongo::Monitoring::SERVER_OPENING, subscriber)
@@ -56,12 +59,12 @@ describe 'Connections' do
56
59
  end
57
60
 
58
61
  it 'publishes server description changed event' do
59
- expect(subscriber.events).to be_empty
62
+ expect(subscriber.succeeded_events).to be_empty
60
63
 
61
64
  wait_for_all_servers(client.cluster)
62
65
 
63
66
  connection
64
- subscriber.events.clear
67
+ subscriber.succeeded_events.clear
65
68
  error
66
69
 
67
70
  event = subscriber.first_event('server_description_changed_event')