mongo 2.5.0.beta → 2.5.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.
Files changed (172) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/lib/mongo/address.rb +1 -1
  5. data/lib/mongo/address/unix.rb +1 -1
  6. data/lib/mongo/auth/user.rb +0 -5
  7. data/lib/mongo/auth/user/view.rb +4 -4
  8. data/lib/mongo/bulk_write.rb +60 -32
  9. data/lib/mongo/client.rb +44 -8
  10. data/lib/mongo/cluster.rb +14 -12
  11. data/lib/mongo/cluster/periodic_executor.rb +106 -0
  12. data/lib/mongo/cluster/{cursor_reaper.rb → reapers/cursor_reaper.rb} +5 -37
  13. data/lib/mongo/cluster/reapers/socket_reaper.rb +59 -0
  14. data/lib/mongo/collection.rb +9 -6
  15. data/lib/mongo/collection/view.rb +2 -2
  16. data/lib/mongo/collection/view/builder/aggregation.rb +2 -1
  17. data/lib/mongo/collection/view/builder/find_command.rb +1 -1
  18. data/lib/mongo/collection/view/change_stream.rb +14 -1
  19. data/lib/mongo/collection/view/map_reduce.rb +30 -13
  20. data/lib/mongo/collection/view/readable.rb +5 -5
  21. data/lib/mongo/collection/view/writable.rb +98 -51
  22. data/lib/mongo/error.rb +3 -0
  23. data/lib/mongo/error/invalid_txt_record.rb +27 -0
  24. data/lib/mongo/error/invalid_uri.rb +7 -6
  25. data/lib/mongo/error/mismatched_domain.rb +27 -0
  26. data/lib/mongo/error/no_srv_records.rb +26 -0
  27. data/lib/mongo/error/unsupported_features.rb +0 -18
  28. data/lib/mongo/index/view.rb +2 -2
  29. data/lib/mongo/operation.rb +1 -0
  30. data/lib/mongo/operation/causally_consistent.rb +33 -0
  31. data/lib/mongo/operation/commands.rb +2 -1
  32. data/lib/mongo/operation/commands/aggregate.rb +2 -7
  33. data/lib/mongo/operation/commands/count.rb +27 -0
  34. data/lib/mongo/operation/commands/distinct.rb +27 -0
  35. data/lib/mongo/operation/commands/find.rb +3 -1
  36. data/lib/mongo/operation/commands/map_reduce.rb +1 -0
  37. data/lib/mongo/operation/commands/parallel_scan.rb +1 -0
  38. data/lib/mongo/operation/specifiable.rb +12 -0
  39. data/lib/mongo/operation/uses_command_op_msg.rb +36 -5
  40. data/lib/mongo/operation/write.rb +0 -5
  41. data/lib/mongo/operation/write/bulk/bulkable.rb +4 -8
  42. data/lib/mongo/operation/write/bulk/mergable.rb +2 -0
  43. data/lib/mongo/operation/write/command/create_index.rb +19 -0
  44. data/lib/mongo/operation/write/command/create_user.rb +19 -0
  45. data/lib/mongo/operation/write/command/delete.rb +1 -2
  46. data/lib/mongo/operation/write/command/drop_index.rb +19 -0
  47. data/lib/mongo/operation/write/command/insert.rb +1 -2
  48. data/lib/mongo/operation/write/command/remove_user.rb +19 -0
  49. data/lib/mongo/operation/write/command/update.rb +1 -2
  50. data/lib/mongo/operation/write/command/update_user.rb +19 -0
  51. data/lib/mongo/operation/write/write_command_enabled.rb +1 -3
  52. data/lib/mongo/protocol/compressed.rb +2 -1
  53. data/lib/mongo/protocol/serializers.rb +6 -6
  54. data/lib/mongo/retryable.rb +48 -5
  55. data/lib/mongo/server.rb +15 -0
  56. data/lib/mongo/server/connection.rb +21 -1
  57. data/lib/mongo/server/connection_pool.rb +3 -0
  58. data/lib/mongo/server/connection_pool/queue.rb +50 -5
  59. data/lib/mongo/server/description.rb +11 -3
  60. data/lib/mongo/server/description/features.rb +26 -7
  61. data/lib/mongo/session.rb +133 -6
  62. data/lib/mongo/session/server_session.rb +30 -0
  63. data/lib/mongo/session/session_pool.rb +20 -20
  64. data/lib/mongo/uri.rb +88 -44
  65. data/lib/mongo/uri/srv_protocol.rb +158 -0
  66. data/lib/mongo/version.rb +1 -1
  67. data/lib/mongo/write_concern/normalizable.rb +12 -0
  68. data/mongo.gemspec +1 -2
  69. data/spec/mongo/address_spec.rb +12 -0
  70. data/spec/mongo/auth/user/view_spec.rb +1 -5
  71. data/spec/mongo/bulk_write_spec.rb +232 -401
  72. data/spec/mongo/change_stream_examples_spec.rb +150 -0
  73. data/spec/mongo/client_spec.rb +142 -2
  74. data/spec/mongo/cluster/cursor_reaper_spec.rb +0 -70
  75. data/spec/mongo/cluster/socket_reaper_spec.rb +32 -0
  76. data/spec/mongo/cluster_spec.rb +11 -7
  77. data/spec/mongo/collection/view/aggregation_spec.rb +46 -1
  78. data/spec/mongo/collection/view/builder/find_command_spec.rb +15 -0
  79. data/spec/mongo/collection/view/change_stream_spec.rb +79 -12
  80. data/spec/mongo/collection/view/map_reduce_spec.rb +120 -4
  81. data/spec/mongo/collection/view/readable_spec.rb +23 -5
  82. data/spec/mongo/collection_spec.rb +292 -102
  83. data/spec/mongo/command_monitoring_spec.rb +26 -32
  84. data/spec/mongo/crud_spec.rb +1 -1
  85. data/spec/mongo/cursor_spec.rb +2 -3
  86. data/spec/mongo/database_spec.rb +30 -14
  87. data/spec/mongo/dns_seedlist_discovery_spec.rb +94 -0
  88. data/spec/mongo/grid/fs_bucket_spec.rb +1 -1
  89. data/spec/mongo/grid/stream/write_spec.rb +1 -1
  90. data/spec/mongo/index/view_spec.rb +8 -46
  91. data/spec/mongo/operation/write/bulk/delete_spec.rb +2 -2
  92. data/spec/mongo/operation/write/bulk/insert_spec.rb +2 -10
  93. data/spec/mongo/operation/write/{create_index_spec.rb → command/create_index_spec.rb} +2 -6
  94. data/spec/mongo/operation/write/command/delete_spec.rb +35 -7
  95. data/spec/mongo/operation/write/{drop_index_spec.rb → command/drop_index_spec.rb} +1 -1
  96. data/spec/mongo/operation/write/command/insert_spec.rb +37 -6
  97. data/spec/mongo/operation/write/{remove_user_spec.rb → command/remove_user_spec.rb} +2 -6
  98. data/spec/mongo/operation/write/command/update_spec.rb +34 -7
  99. data/spec/mongo/operation/write/{update_user_spec.rb → command/update_user_spec.rb} +1 -1
  100. data/spec/mongo/operation/write/create_user_spec.rb +1 -1
  101. data/spec/mongo/operation/write/delete_spec.rb +1 -1
  102. data/spec/mongo/operation/write/insert_spec.rb +2 -10
  103. data/spec/mongo/operation/write/update_spec.rb +3 -15
  104. data/spec/mongo/retryable_spec.rb +1 -1
  105. data/spec/mongo/retryable_writes_spec.rb +815 -0
  106. data/spec/mongo/server/connection_pool/queue_spec.rb +35 -2
  107. data/spec/mongo/server/connection_pool_spec.rb +234 -1
  108. data/spec/mongo/server/connection_spec.rb +10 -6
  109. data/spec/mongo/server/description/features_spec.rb +51 -37
  110. data/spec/mongo/server/description_spec.rb +6 -3
  111. data/spec/mongo/server_spec.rb +87 -0
  112. data/spec/mongo/session/server_session_spec.rb +43 -0
  113. data/spec/mongo/session/session_pool_spec.rb +63 -27
  114. data/spec/mongo/session_spec.rb +247 -0
  115. data/spec/mongo/shell_examples_spec.rb +2 -2
  116. data/spec/mongo/uri/srv_protocol_spec.rb +933 -0
  117. data/spec/mongo/uri_spec.rb +42 -3
  118. data/spec/mongo/write_concern/acknowledged_spec.rb +11 -0
  119. data/spec/mongo/write_concern/unacknowledged_spec.rb +11 -0
  120. data/spec/spec_helper.rb +11 -25
  121. data/spec/support/authorization.rb +2 -1
  122. data/spec/support/connection_string.rb +8 -4
  123. data/spec/support/crud.rb +38 -24
  124. data/spec/support/crud/write.rb +30 -3
  125. data/spec/support/crud_tests/read/aggregate-out.yml +21 -0
  126. data/spec/support/crud_tests/write/bulkWrite-arrayFilters.yml +44 -0
  127. data/spec/support/crud_tests/write/findOneAndUpdate-arrayFilters.yml +1 -1
  128. data/spec/support/crud_tests/write/insertMany.yml +1 -3
  129. data/spec/support/crud_tests/write/replaceOne.yml +1 -1
  130. data/spec/support/crud_tests/write/updateMany-arrayFilters.yml +1 -1
  131. data/spec/support/crud_tests/write/updateOne-arrayFilters.yml +1 -1
  132. data/spec/support/dns_seedlist_discovery_tests/longer-parent-in-return.yml +11 -0
  133. data/spec/support/dns_seedlist_discovery_tests/misformatted-option.yml +5 -0
  134. data/spec/support/dns_seedlist_discovery_tests/no-results.yml +5 -0
  135. data/spec/support/dns_seedlist_discovery_tests/not-enough-parts.yml +5 -0
  136. data/spec/support/dns_seedlist_discovery_tests/one-result-default-port.yml +10 -0
  137. data/spec/support/dns_seedlist_discovery_tests/one-txt-record-multiple-strings.yml +10 -0
  138. data/spec/support/dns_seedlist_discovery_tests/one-txt-record.yml +11 -0
  139. data/spec/support/dns_seedlist_discovery_tests/parent-part-mismatch1.yml +5 -0
  140. data/spec/support/dns_seedlist_discovery_tests/parent-part-mismatch2.yml +5 -0
  141. data/spec/support/dns_seedlist_discovery_tests/parent-part-mismatch3.yml +5 -0
  142. data/spec/support/dns_seedlist_discovery_tests/parent-part-mismatch4.yml +5 -0
  143. data/spec/support/dns_seedlist_discovery_tests/parent-part-mismatch5.yml +5 -0
  144. data/spec/support/dns_seedlist_discovery_tests/returned-parent-too-short.yml +5 -0
  145. data/spec/support/dns_seedlist_discovery_tests/returned-parent-wrong.yml +5 -0
  146. data/spec/support/dns_seedlist_discovery_tests/two-results-default-port.yml +11 -0
  147. data/spec/support/dns_seedlist_discovery_tests/two-results-nonstandard-port.yml +11 -0
  148. data/spec/support/dns_seedlist_discovery_tests/two-txt-records.yml +5 -0
  149. data/spec/support/dns_seedlist_discovery_tests/txt-record-not-allowed-option.yml +5 -0
  150. data/spec/support/dns_seedlist_discovery_tests/txt-record-with-overridden-ssl-option.yml +11 -0
  151. data/spec/support/dns_seedlist_discovery_tests/txt-record-with-overridden-uri-option.yml +11 -0
  152. data/spec/support/dns_seedlist_discovery_tests/txt-record-with-unallowed-option.yml +5 -0
  153. data/spec/support/dns_seedlist_discovery_tests/uri-with-port.yml +5 -0
  154. data/spec/support/dns_seedlist_discovery_tests/uri-with-two-hosts.yml +5 -0
  155. data/spec/support/retryable_writes_tests/bulkWrite.yml +305 -0
  156. data/spec/support/retryable_writes_tests/deleteOne.yml +51 -0
  157. data/spec/support/retryable_writes_tests/findOneAndDelete.yml +52 -0
  158. data/spec/support/retryable_writes_tests/findOneAndReplace.yml +57 -0
  159. data/spec/support/retryable_writes_tests/findOneAndUpdate.yml +56 -0
  160. data/spec/support/retryable_writes_tests/insertMany.yml +72 -0
  161. data/spec/support/retryable_writes_tests/insertOne.yml +55 -0
  162. data/spec/support/retryable_writes_tests/replaceOne.yml +60 -0
  163. data/spec/support/retryable_writes_tests/updateOne.yml +120 -0
  164. data/spec/support/shared/session.rb +525 -24
  165. metadata +437 -350
  166. metadata.gz.sig +0 -0
  167. data/lib/mongo/operation/commands/user_query.rb +0 -72
  168. data/lib/mongo/operation/write/create_index.rb +0 -67
  169. data/lib/mongo/operation/write/create_user.rb +0 -50
  170. data/lib/mongo/operation/write/drop_index.rb +0 -63
  171. data/lib/mongo/operation/write/remove_user.rb +0 -48
  172. data/lib/mongo/operation/write/update_user.rb +0 -50
data/lib/mongo/error.rb CHANGED
@@ -90,14 +90,17 @@ require 'mongo/error/invalid_replacement_document'
90
90
  require 'mongo/error/invalid_server_preference'
91
91
  require 'mongo/error/invalid_session'
92
92
  require 'mongo/error/invalid_signature'
93
+ require 'mongo/error/invalid_txt_record'
93
94
  require 'mongo/error/invalid_update_document'
94
95
  require 'mongo/error/invalid_uri'
95
96
  require 'mongo/error/invalid_write_concern'
96
97
  require 'mongo/error/max_bson_size'
97
98
  require 'mongo/error/max_message_size'
99
+ require 'mongo/error/mismatched_domain'
98
100
  require 'mongo/error/multi_index_drop'
99
101
  require 'mongo/error/need_primary_server'
100
102
  require 'mongo/error/no_server_available'
103
+ require 'mongo/error/no_srv_records'
101
104
  require 'mongo/error/socket_error'
102
105
  require 'mongo/error/socket_timeout_error'
103
106
  require 'mongo/error/unchangeable_collection_option'
@@ -0,0 +1,27 @@
1
+ # Copyright (C) 2017 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
+ class Error
17
+
18
+ # This exception is raised when the URI Parser's query returns too many
19
+ # TXT records or the record specifies invalid options.
20
+ #
21
+ # @example Instantiate the exception.
22
+ # Mongo::Error::InvalidTXTRecord.new(message)
23
+ #
24
+ # @since 2.5.0
25
+ class InvalidTXTRecord < Error; end
26
+ end
27
+ end
@@ -24,14 +24,15 @@ module Mongo
24
24
  # Instantiate the new exception.
25
25
  #
26
26
  # @example Instantiate the exception.
27
- # Mongo::Error::InvalidURI.new(uri)
27
+ # Mongo::Error::InvalidURI.new(uri, details, format)
28
28
  #
29
29
  # @since 2.0.0
30
- def initialize(uri, details)
31
- super("Bad URI: #{uri}\n" +
32
- "#{details}\n" +
33
- "MongoDB URI must be in the following format: #{Mongo::URI::FORMAT}\n" +
34
- "Please see the following URL for more information: #{Mongo::URI::HELP}\n")
30
+ def initialize(uri, details, format = nil)
31
+ message = "Bad URI: #{uri}\n" +
32
+ "#{details}\n"
33
+ message += "MongoDB URI must be in the following format: #{format}\n" if format
34
+ message += "Please see the following URL for more information: #{Mongo::URI::HELP}\n"
35
+ super(message)
35
36
  end
36
37
  end
37
38
  end
@@ -0,0 +1,27 @@
1
+ # Copyright (C) 2017 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
+ class Error
17
+
18
+ # This exception is raised when the URI Parser's DNS query returns SRV record(s)
19
+ # whose parent domain does not match the hostname used for the query.
20
+ #
21
+ # @example Instantiate the exception.
22
+ # Mongo::Error::MismatchedDomain.new(message)
23
+ #
24
+ # @since 2.5.0
25
+ class MismatchedDomain < Error; end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ # Copyright (C) 2017 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
+ class Error
17
+
18
+ # This exception is raised when the URI Parser's DNS query returns no SRV records.
19
+ #
20
+ # @example Instantiate the exception.
21
+ # Mongo::Error::NoSRVRecords.new(message)
22
+ #
23
+ # @since 2.5.0
24
+ class NoSRVRecords < Error; end
25
+ end
26
+ end
@@ -20,24 +20,6 @@ module Mongo
20
20
  #
21
21
  # @since 2.0.0
22
22
  class UnsupportedFeatures < Error
23
-
24
- # Initialize the exception.
25
- #
26
- # @example Initialize the exception.
27
- # Unsupported.new(0..3)
28
- #
29
- # @param [ Range ] server_wire_versions The server's supported wire
30
- # versions.
31
- #
32
- # @since 2.0.0
33
- def initialize(server_wire_versions)
34
- super(
35
- "This version of the driver, #{Mongo::VERSION}, only supports wire " +
36
- "protocol versions #{Server::Description::Features::DRIVER_WIRE_VERSIONS} " +
37
- "and the server supports wire versions #{server_wire_versions}. " +
38
- "Please upgrade the driver to be able to support this server version."
39
- )
40
- end
41
23
  end
42
24
  end
43
25
  end
@@ -157,7 +157,7 @@ module Mongo
157
157
  session: session
158
158
  }
159
159
  spec[:write_concern] = write_concern if server.features.collation_enabled?
160
- Operation::Write::CreateIndex.new(spec).execute(server)
160
+ Operation::Write::Command::CreateIndex.new(spec).execute(server)
161
161
  end
162
162
  end
163
163
 
@@ -232,7 +232,7 @@ module Mongo
232
232
  }
233
233
  server = next_primary
234
234
  spec[:write_concern] = write_concern if server.features.collation_enabled?
235
- Operation::Write::DropIndex.new(spec).execute(server)
235
+ Operation::Write::Command::DropIndex.new(spec).execute(server)
236
236
  end
237
237
  end
238
238
 
@@ -18,6 +18,7 @@ require 'mongo/operation/specifiable'
18
18
  require 'mongo/operation/limited'
19
19
  require 'mongo/operation/object_id_generator'
20
20
  require 'mongo/operation/uses_command_op_msg'
21
+ require 'mongo/operation/causally_consistent'
21
22
  require 'mongo/operation/read_preference'
22
23
  require 'mongo/operation/takes_write_concern'
23
24
  require 'mongo/operation/read'
@@ -0,0 +1,33 @@
1
+ # Copyright (C) 2017 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
+ module Operation
17
+
18
+ # Encapsulates behaviour for adding a causal consistency doc to the command.
19
+ #
20
+ # @since 2.5.0
21
+ module CausallyConsistent
22
+
23
+ private
24
+
25
+ def apply_causal_consistency!(selector, server)
26
+ if !server.standalone?
27
+ full_read_concern_doc = session.send(:causal_consistency_doc, selector[:readConcern])
28
+ selector[:readConcern] = full_read_concern_doc if full_read_concern_doc
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -14,6 +14,8 @@
14
14
 
15
15
  require 'mongo/operation/commands/command'
16
16
  require 'mongo/operation/commands/find'
17
+ require 'mongo/operation/commands/count'
18
+ require 'mongo/operation/commands/distinct'
17
19
  require 'mongo/operation/commands/explain'
18
20
  require 'mongo/operation/commands/get_more'
19
21
  require 'mongo/operation/commands/parallel_scan'
@@ -26,5 +28,4 @@ require 'mongo/operation/commands/drop_database'
26
28
  require 'mongo/operation/commands/indexes'
27
29
  require 'mongo/operation/commands/list_collections'
28
30
  require 'mongo/operation/commands/list_indexes'
29
- require 'mongo/operation/commands/user_query'
30
31
  require 'mongo/operation/commands/users_info'
@@ -41,17 +41,12 @@ module Mongo
41
41
  # @since 2.0.0
42
42
  class Aggregate < Command
43
43
  include TakesWriteConcern
44
+ include CausallyConsistent
44
45
 
45
46
  private
46
47
 
47
- def filter_cursor_from_selector(sel, server)
48
- return sel if server.features.write_command_enabled?
49
- sel.reject{ |option, value| option.to_s == 'cursor' }
50
- end
51
-
52
48
  def message(server)
53
- sel = filter_cursor_from_selector(selector, server)
54
- sel = update_selector_for_write_concern(sel, server)
49
+ sel = update_selector_for_write_concern(selector, server)
55
50
  if server.features.op_msg_enabled?
56
51
  command_op_msg(server, sel, options)
57
52
  else
@@ -0,0 +1,27 @@
1
+ # Copyright (C) 2017 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
+ module Operation
17
+ module Commands
18
+
19
+ # Encapsulates behaviour for executing a count command.
20
+ #
21
+ # @since 2.5.0
22
+ class Count < Command
23
+ include CausallyConsistent
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,27 @@
1
+ # Copyright (C) 2017 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
+ module Operation
17
+ module Commands
18
+
19
+ # Encapsulates behaviour for executing a distinct command.
20
+ #
21
+ # @since 2.5.0
22
+ class Distinct < Command
23
+ include CausallyConsistent
24
+ end
25
+ end
26
+ end
27
+ end
@@ -19,7 +19,9 @@ module Mongo
19
19
  # Encapsulates behaviour for executing a find command.
20
20
  #
21
21
  # @since 2.2.0
22
- class Find < Command; end
22
+ class Find < Command
23
+ include CausallyConsistent
24
+ end
23
25
  end
24
26
  end
25
27
  end
@@ -43,6 +43,7 @@ module Mongo
43
43
  # @since 2.0.0
44
44
  class MapReduce < Command
45
45
  include TakesWriteConcern
46
+ include CausallyConsistent
46
47
 
47
48
  private
48
49
 
@@ -36,6 +36,7 @@ module Mongo
36
36
  #
37
37
  # @since 2.0.0
38
38
  class ParallelScan < Command
39
+ include CausallyConsistent
39
40
 
40
41
  private
41
42
 
@@ -514,6 +514,18 @@ module Mongo
514
514
  def session
515
515
  @spec[:session]
516
516
  end
517
+
518
+ # The transaction number for the operation.
519
+ #
520
+ # @example Get the transaction number.
521
+ # specifiable.txn_num
522
+ #
523
+ # @return [ Integer ] The transaction number.
524
+ #
525
+ # @since 2.5.0
526
+ def txn_num
527
+ @spec[:txn_num]
528
+ end
517
529
  end
518
530
  end
519
531
  end
@@ -22,23 +22,54 @@ module Mongo
22
22
 
23
23
  private
24
24
 
25
+ ZERO_TIMESTAMP = BSON::Timestamp.new(0,0)
26
+
25
27
  READ_PREFERENCE = '$readPreference'.freeze
26
28
 
27
- def add_cluster_time!(selector, server)
28
- if cluster_time = server.mongos? && server.cluster_time
29
- selector[CLUSTER_TIME] = cluster_time
29
+ def apply_causal_consistency!(selector, server); end
30
+
31
+ def apply_cluster_time!(selector, server)
32
+ if !server.standalone?
33
+ cluster_time = [ server.cluster_time, (session && session.cluster_time) ].max_by do |doc|
34
+ (doc && doc[Cluster::CLUSTER_TIME]) || ZERO_TIMESTAMP
35
+ end
36
+
37
+ if cluster_time && (cluster_time[Cluster::CLUSTER_TIME] > ZERO_TIMESTAMP)
38
+ selector[CLUSTER_TIME] = cluster_time
39
+ end
30
40
  end
31
41
  end
32
42
 
43
+ def apply_session_id!(selector)
44
+ session.add_id!(selector) if session && !unacknowledged_write?
45
+ end
46
+
33
47
  def unacknowledged_write?
34
48
  write_concern && write_concern.get_last_error.nil?
35
49
  end
36
50
 
51
+ def update_selector_for_session!(selector, server)
52
+ # the driver MUST ignore any implicit session if at the point it is sending a command
53
+ # to a specific server it turns out that that particular server doesn't support sessions after all
54
+ if server.features.sessions_enabled?
55
+ apply_cluster_time!(selector, server)
56
+ selector[:txnNumber] = BSON::Int64.new(txn_num) if txn_num
57
+ if session
58
+ apply_session_id!(selector)
59
+ apply_causal_consistency!(selector, server)
60
+ end
61
+ elsif session && !session.send(:implicit_session?)
62
+ apply_cluster_time!(selector, server)
63
+ apply_session_id!(selector)
64
+ apply_causal_consistency!(selector, server)
65
+ selector[:txnNumber] = BSON::Int64.new(txn_num) if txn_num
66
+ end
67
+ end
68
+
37
69
  def command_op_msg(server, selector, options)
38
- add_cluster_time!(selector, server)
70
+ update_selector_for_session!(selector, server)
39
71
  selector[Protocol::Msg::DATABASE_IDENTIFIER] = db_name
40
72
  selector[READ_PREFERENCE] = read.to_doc if read
41
- session.add_id!(selector) if session
42
73
  flags = unacknowledged_write? ? [:more_to_come] : [:none]
43
74
  Protocol::Msg.new(flags, options, selector)
44
75
  end
@@ -19,9 +19,4 @@ require 'mongo/operation/write/bulk'
19
19
  require 'mongo/operation/write/delete'
20
20
  require 'mongo/operation/write/insert'
21
21
  require 'mongo/operation/write/update'
22
- require 'mongo/operation/write/create_index'
23
- require 'mongo/operation/write/drop_index'
24
- require 'mongo/operation/write/create_user'
25
- require 'mongo/operation/write/update_user'
26
- require 'mongo/operation/write/remove_user'
27
22
  require 'mongo/operation/write/command'
@@ -35,14 +35,10 @@ module Mongo
35
35
  #
36
36
  # @since 2.0.0
37
37
  def execute(server)
38
- if server.features.write_command_enabled?
39
- result = execute_write_command(server)
40
- server.update_cluster_time(result)
41
- session.process(result) if session
42
- result
43
- else
44
- execute_message(server)
45
- end
38
+ result = execute_write_command(server)
39
+ server.update_cluster_time(result)
40
+ session.process(result) if session
41
+ result
46
42
  end
47
43
 
48
44
  private