mongo 2.5.0.beta → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
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