mongo 2.0.6 → 2.1.0.beta

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 (119) 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.rb +2 -0
  5. data/lib/mongo/bulk_write.rb +1 -0
  6. data/lib/mongo/bulk_write/bulk_writable.rb +87 -31
  7. data/lib/mongo/bulk_write/deletable.rb +8 -7
  8. data/lib/mongo/bulk_write/insertable.rb +4 -3
  9. data/lib/mongo/bulk_write/ordered_bulk_write.rb +6 -6
  10. data/lib/mongo/bulk_write/replacable.rb +4 -3
  11. data/lib/mongo/bulk_write/result.rb +138 -0
  12. data/lib/mongo/bulk_write/unordered_bulk_write.rb +5 -8
  13. data/lib/mongo/bulk_write/updatable.rb +8 -7
  14. data/lib/mongo/client.rb +36 -4
  15. data/lib/mongo/cluster.rb +39 -4
  16. data/lib/mongo/cluster/topology/replica_set.rb +20 -4
  17. data/lib/mongo/cluster/topology/sharded.rb +1 -1
  18. data/lib/mongo/collection.rb +282 -29
  19. data/lib/mongo/collection/view/aggregation.rb +32 -4
  20. data/lib/mongo/collection/view/iterable.rb +2 -1
  21. data/lib/mongo/collection/view/map_reduce.rb +3 -1
  22. data/lib/mongo/collection/view/readable.rb +89 -14
  23. data/lib/mongo/collection/view/writable.rb +11 -5
  24. data/lib/mongo/cursor.rb +11 -3
  25. data/lib/mongo/dbref.rb +113 -0
  26. data/lib/mongo/error.rb +6 -2
  27. data/lib/mongo/error/parser.rb +1 -1
  28. data/lib/mongo/event/description_changed.rb +1 -1
  29. data/lib/mongo/grid/file.rb +1 -1
  30. data/lib/mongo/grid/fs.rb +2 -5
  31. data/lib/mongo/monitoring.rb +199 -0
  32. data/lib/mongo/monitoring/command_log_subscriber.rb +88 -0
  33. data/lib/mongo/monitoring/event.rb +17 -0
  34. data/lib/mongo/monitoring/event/command_failed.rb +96 -0
  35. data/lib/mongo/monitoring/event/command_started.rb +88 -0
  36. data/lib/mongo/monitoring/event/command_succeeded.rb +96 -0
  37. data/lib/mongo/monitoring/publishable.rb +96 -0
  38. data/lib/mongo/operation.rb +1 -0
  39. data/lib/mongo/operation/executable.rb +1 -1
  40. data/lib/mongo/operation/parallel_scan.rb +76 -0
  41. data/lib/mongo/operation/parallel_scan/result.rb +72 -0
  42. data/lib/mongo/operation/specifiable.rb +18 -0
  43. data/lib/mongo/operation/write/bulk/bulk_delete.rb +1 -1
  44. data/lib/mongo/operation/write/bulk/bulk_insert.rb +1 -1
  45. data/lib/mongo/operation/write/bulk/bulk_mergable.rb +2 -2
  46. data/lib/mongo/operation/write/bulk/bulk_update.rb +1 -1
  47. data/lib/mongo/operation/write/bulk/bulk_update/result.rb +13 -1
  48. data/lib/mongo/protocol/delete.rb +8 -13
  49. data/lib/mongo/protocol/get_more.rb +13 -13
  50. data/lib/mongo/protocol/insert.rb +8 -13
  51. data/lib/mongo/protocol/kill_cursors.rb +7 -11
  52. data/lib/mongo/protocol/query.rb +58 -20
  53. data/lib/mongo/protocol/reply.rb +12 -0
  54. data/lib/mongo/protocol/update.rb +13 -14
  55. data/lib/mongo/server.rb +23 -2
  56. data/lib/mongo/server/connectable.rb +0 -22
  57. data/lib/mongo/server/connection.rb +29 -0
  58. data/lib/mongo/server/description.rb +23 -1
  59. data/lib/mongo/server/monitor.rb +17 -1
  60. data/lib/mongo/server/monitor/connection.rb +24 -0
  61. data/lib/mongo/socket/ssl.rb +28 -16
  62. data/lib/mongo/socket/tcp.rb +1 -1
  63. data/lib/mongo/socket/unix.rb +1 -1
  64. data/lib/mongo/uri.rb +12 -5
  65. data/lib/mongo/version.rb +1 -1
  66. data/spec/mongo/auth/cr_spec.rb +9 -1
  67. data/spec/mongo/auth/ldap_spec.rb +9 -1
  68. data/spec/mongo/auth/scram_spec.rb +9 -1
  69. data/spec/mongo/auth/x509_spec.rb +9 -1
  70. data/spec/mongo/{bulk/bulk_write_spec.rb → bulk_write_spec.rb} +15 -15
  71. data/spec/mongo/client_spec.rb +42 -0
  72. data/spec/mongo/cluster/topology/replica_set_spec.rb +16 -9
  73. data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
  74. data/spec/mongo/cluster/topology/single_spec.rb +12 -4
  75. data/spec/mongo/cluster_spec.rb +55 -10
  76. data/spec/mongo/collection/view/aggregation_spec.rb +123 -1
  77. data/spec/mongo/collection/view/explainable_spec.rb +1 -1
  78. data/spec/mongo/collection/view/map_reduce_spec.rb +1 -1
  79. data/spec/mongo/collection/view/readable_spec.rb +251 -6
  80. data/spec/mongo/collection/view/writable_spec.rb +4 -4
  81. data/spec/mongo/collection/view_spec.rb +233 -71
  82. data/spec/mongo/collection_spec.rb +905 -9
  83. data/spec/mongo/crud_spec.rb +2 -2
  84. data/spec/mongo/cursor_spec.rb +3 -3
  85. data/spec/mongo/dbref_spec.rb +149 -0
  86. data/spec/mongo/monitoring_spec.rb +168 -0
  87. data/spec/mongo/operation/map_reduce_spec.rb +1 -1
  88. data/spec/mongo/operation/write/bulk/bulk_delete_spec.rb +1 -1
  89. data/spec/mongo/operation/write/bulk/bulk_insert_spec.rb +2 -2
  90. data/spec/mongo/operation/write/bulk/bulk_update_spec.rb +1 -1
  91. data/spec/mongo/operation/write/delete_spec.rb +1 -1
  92. data/spec/mongo/operation/write/insert_spec.rb +2 -2
  93. data/spec/mongo/operation/write/update_spec.rb +1 -1
  94. data/spec/mongo/protocol/query_spec.rb +0 -29
  95. data/spec/mongo/server/connection_pool_spec.rb +18 -6
  96. data/spec/mongo/server/connection_spec.rb +12 -4
  97. data/spec/mongo/server/description_spec.rb +7 -3
  98. data/spec/mongo/server/monitor_spec.rb +30 -0
  99. data/spec/mongo/server_discovery_and_monitoring_spec.rb +11 -4
  100. data/spec/mongo/server_selection_spec.rb +14 -6
  101. data/spec/mongo/server_spec.rb +27 -8
  102. data/spec/mongo/socket/ssl_spec.rb +94 -8
  103. data/spec/mongo/uri_spec.rb +25 -9
  104. data/spec/spec_helper.rb +29 -20
  105. data/spec/support/authorization.rb +19 -4
  106. data/spec/support/certificates/client.pem +4 -4
  107. data/spec/support/crud/read.rb +9 -10
  108. data/spec/support/crud/write.rb +24 -20
  109. data/spec/support/sdam/rs/equal_electionids.yml +45 -0
  110. data/spec/support/sdam/rs/new_primary_new_electionid.yml +98 -0
  111. data/spec/support/sdam/rs/null_election_id.yml +144 -0
  112. data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
  113. data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
  114. data/spec/support/server_discovery_and_monitoring.rb +19 -2
  115. data/spec/support/shared/bulk_write.rb +26 -22
  116. data/spec/support/shared/server_selector.rb +2 -1
  117. metadata +31 -7
  118. metadata.gz.sig +0 -0
  119. data/lib/mongo/error/invalid_uri_option.rb +0 -38
@@ -0,0 +1,88 @@
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
+ class Monitoring
17
+ module Event
18
+
19
+ # Event that is fired when a command operation starts.
20
+ #
21
+ # @since 2.1.0
22
+ class CommandStarted
23
+
24
+ # @return [ Server::Address ] address The server address.
25
+ attr_reader :address
26
+
27
+ # @return [ BSON::Document ] command The command arguments.
28
+ attr_reader :command
29
+
30
+ # @return [ String ] command_name The name of the command.
31
+ attr_reader :command_name
32
+
33
+ # @return [ String ] database_name The name of the database_name.
34
+ attr_reader :database_name
35
+
36
+ # @return [ Integer ] operation_id The operation id.
37
+ attr_reader :operation_id
38
+
39
+ # @return [ Integer ] request_id The request id.
40
+ attr_reader :request_id
41
+
42
+ # Create the new event.
43
+ #
44
+ # @example Create the event.
45
+ #
46
+ # @param [ String ] command_name The name of the command.
47
+ # @param [ String ] database_name The database_name name.
48
+ # @param [ Server::Address ] address The server address.
49
+ # @param [ Integer ] request_id The request id.
50
+ # @param [ Integer ] operation_id The operation id.
51
+ # @param [ BSON::Document ] command The command arguments.
52
+ #
53
+ # @since 2.1.0
54
+ def initialize(command_name, database_name, address, request_id, operation_id, command)
55
+ @command_name = command_name
56
+ @database_name = database_name
57
+ @address = address
58
+ @request_id = request_id
59
+ @operation_id = operation_id
60
+ @command = command
61
+ end
62
+
63
+ # Create the event from a wire protocol message payload.
64
+ #
65
+ # @example Create the event.
66
+ # CommandStarted.generate(address, 1, payload)
67
+ #
68
+ # @param [ Server::Address ] address The server address.
69
+ # @param [ Integer ] operation_id The operation id.
70
+ # @param [ Hash ] payload The message payload.
71
+ #
72
+ # @return [ CommandStarted ] The event.
73
+ #
74
+ # @since 2.1.0
75
+ def self.generate(address, operation_id, payload)
76
+ new(
77
+ payload[:command_name],
78
+ payload[:database_name],
79
+ address,
80
+ payload[:request_id],
81
+ operation_id,
82
+ payload[:command]
83
+ )
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,96 @@
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
+ class Monitoring
17
+ module Event
18
+
19
+ # Event that is fired when a command operation succeeds.
20
+ #
21
+ # @since 2.1.0
22
+ class CommandSucceeded
23
+
24
+ # @return [ Server::Address ] address The server address.
25
+ attr_reader :address
26
+
27
+ # @return [ String ] command_name The name of the command.
28
+ attr_reader :command_name
29
+
30
+ # @return [ BSON::Document ] reply The command reply.
31
+ attr_reader :reply
32
+
33
+ # @return [ String ] database_name The name of the database.
34
+ attr_reader :database_name
35
+
36
+ # @return [ Float ] duration The duration of the event.
37
+ attr_reader :duration
38
+
39
+ # @return [ Integer ] operation_id The operation id.
40
+ attr_reader :operation_id
41
+
42
+ # @return [ Integer ] request_id The request id.
43
+ attr_reader :request_id
44
+
45
+ # Create the new event.
46
+ #
47
+ # @example Create the event.
48
+ #
49
+ # @param [ String ] command_name The name of the command.
50
+ # @param [ String ] database_name The database name.
51
+ # @param [ Server::Address ] address The server address.
52
+ # @param [ Integer ] request_id The request id.
53
+ # @param [ Integer ] operation_id The operation id.
54
+ # @param [ BSON::Document ] reply The command reply.
55
+ # @param [ Float ] duration The duration the command took in seconds.
56
+ #
57
+ # @since 2.1.0
58
+ def initialize(command_name, database_name, address, request_id, operation_id, reply, duration)
59
+ @command_name = command_name
60
+ @database_name = database_name
61
+ @address = address
62
+ @request_id = request_id
63
+ @operation_id = operation_id
64
+ @reply = reply
65
+ @duration = duration
66
+ end
67
+
68
+ # Create the event from a wire protocol message payload.
69
+ #
70
+ # @example Create the event.
71
+ # CommandSucceeded.generate(address, 1, command_payload, reply_payload, 0.5)
72
+ #
73
+ # @param [ Server::Address ] address The server address.
74
+ # @param [ Integer ] operation_id The operation id.
75
+ # @param [ Hash ] command_payload The command message payload.
76
+ # @param [ Hash ] reply_payload The reply message payload.
77
+ # @param [ Float ] duration The duration of the command in seconds.
78
+ #
79
+ # @return [ CommandCompleted ] The event.
80
+ #
81
+ # @since 2.1.0
82
+ def self.generate(address, operation_id, command_payload, reply_payload, duration)
83
+ new(
84
+ command_payload[:command_name],
85
+ command_payload[:database_name],
86
+ address,
87
+ command_payload[:request_id],
88
+ operation_id,
89
+ reply_payload ? reply_payload[:reply] : nil,
90
+ duration
91
+ )
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,96 @@
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
+ class Monitoring
17
+
18
+ # Defines behaviour for an object that can publish monitoring events.
19
+ #
20
+ # @since 2.1.0
21
+ module Publishable
22
+
23
+ # @return [ Monitoring ] monitoring The monitoring.
24
+ attr_reader :monitoring
25
+
26
+ # Publish a command event to the global monitoring.
27
+ #
28
+ # @example Publish a command event.
29
+ # publish_command do |messages|
30
+ # # ...
31
+ # end
32
+ #
33
+ # @param [ Array<Message> ] messages The messages.
34
+ #
35
+ # @return [ Object ] The result of the yield.
36
+ #
37
+ # @since 2.1.0
38
+ def publish_command(messages, operation_id = Monitoring.next_operation_id)
39
+ start = Time.now
40
+ payload = messages.first.payload
41
+ command_started(address, operation_id, payload)
42
+ begin
43
+ result = yield(messages)
44
+ command_completed(result, address, operation_id, payload, start)
45
+ result
46
+ rescue Exception => e
47
+ command_failed(address, operation_id, payload, e.message, start)
48
+ raise e
49
+ end
50
+ end
51
+
52
+ private
53
+
54
+ def command_started(address, operation_id, payload)
55
+ monitoring.started(
56
+ Monitoring::COMMAND,
57
+ Event::CommandStarted.generate(address, operation_id, payload)
58
+ )
59
+ end
60
+
61
+ def command_completed(result, address, operation_id, payload, start)
62
+ document = result ? (result.documents || []).first : nil
63
+ parser = Error::Parser.new(document)
64
+ if parser.message.empty?
65
+ command_succeeded(result, address, operation_id, payload, start)
66
+ else
67
+ command_failed(address, operation_id, payload, parser.message, start)
68
+ end
69
+ end
70
+
71
+ def command_succeeded(result, address, operation_id, payload, start)
72
+ monitoring.succeeded(
73
+ Monitoring::COMMAND,
74
+ Event::CommandSucceeded.generate(
75
+ address,
76
+ operation_id,
77
+ payload,
78
+ result ? result.payload : nil,
79
+ duration(start)
80
+ )
81
+ )
82
+ end
83
+
84
+ def command_failed(address, operation_id, payload, message, start)
85
+ monitoring.failed(
86
+ Monitoring::COMMAND,
87
+ Event::CommandFailed.generate(address, operation_id, payload, message, duration(start))
88
+ )
89
+ end
90
+
91
+ def duration(start)
92
+ Time.now - start
93
+ end
94
+ end
95
+ end
96
+ end
@@ -23,3 +23,4 @@ require 'mongo/operation/aggregate'
23
23
  require 'mongo/operation/command'
24
24
  require 'mongo/operation/kill_cursors'
25
25
  require 'mongo/operation/map_reduce'
26
+ require 'mongo/operation/parallel_scan'
@@ -32,7 +32,7 @@ module Mongo
32
32
  # @since 2.0.0
33
33
  def execute(context)
34
34
  context.with_connection do |connection|
35
- connection.dispatch([ message ])
35
+ connection.dispatch([ message ], operation_id)
36
36
  end
37
37
  end
38
38
 
@@ -0,0 +1,76 @@
1
+ # Copyright (C) 2009-2014 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
+ require 'mongo/operation/parallel_scan/result'
16
+
17
+ module Mongo
18
+ module Operation
19
+
20
+ # A MongoDB parallel scan operation.
21
+ #
22
+ # @example Create the parallel scan operation.
23
+ # ParallelScan.new({
24
+ # :db_name => 'test_db',
25
+ # :coll_name = > 'test_collection',
26
+ # :cursor_count => 5
27
+ # })
28
+ #
29
+ # Initialization:
30
+ # param [ Hash ] spec The specifications for the operation.
31
+ #
32
+ # option spec :db_name [ String ] The name of the database on which
33
+ # the operation should be executed.
34
+ # option spec :coll_name [ String ] The collection to scan.
35
+ # option spec :cursor_count [ Integer ] The number of cursors to use.
36
+ # option spec :options [ Hash ] Options for the command.
37
+ #
38
+ # @since 2.0.0
39
+ class ParallelScan
40
+ include Executable
41
+ include Specifiable
42
+ include Limited
43
+ include ReadPreferrable
44
+
45
+ # Execute the parallel scan operation.
46
+ #
47
+ # @example Execute the operation.
48
+ # operation.execute(context)
49
+ #
50
+ # @param [ Mongo::Server::Context ] context The context for this operation.
51
+ #
52
+ # @return [ Result ] The operation response, if there is one.
53
+ #
54
+ # @since 2.0.0
55
+ def execute(context)
56
+ execute_message(context)
57
+ end
58
+
59
+ private
60
+
61
+ def execute_message(context)
62
+ context.with_connection do |connection|
63
+ Result.new(connection.dispatch([ message(context) ])).validate!
64
+ end
65
+ end
66
+
67
+ def selector
68
+ { :parallelCollectionScan => coll_name, :numCursors => cursor_count }
69
+ end
70
+
71
+ def query_coll
72
+ Database::COMMAND
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,72 @@
1
+
2
+ # Copyright (C) 2009-2014 MongoDB, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ module Mongo
17
+ module Operation
18
+ class ParallelScan
19
+
20
+ # Defines custom behaviour of results in a parallel scan.
21
+ #
22
+ # @since 2.0.0
23
+ class Result < Operation::Result
24
+
25
+ # Get the name of the cursor field.
26
+ #
27
+ # @since 2.0.0
28
+ CURSOR = 'cursor'.freeze
29
+
30
+ # The name of the cursors field in the result.
31
+ #
32
+ # @since 2.0.0
33
+ CURSORS = 'cursors'.freeze
34
+
35
+ # Get the name of the id field.
36
+ #
37
+ # @since 2.0.0
38
+ ID = 'id'.freeze
39
+
40
+ # Get all the cursor ids from the result.
41
+ #
42
+ # @example Get the cursor ids.
43
+ # result.cursor_ids
44
+ #
45
+ # @return [ Array<Integer> ] The cursor ids.
46
+ #
47
+ # @since 2.0.0
48
+ def cursor_ids
49
+ documents.map{ |doc| doc[CURSOR][ID] }
50
+ end
51
+
52
+ # Get the documents from parallel scan.
53
+ #
54
+ # @example Get the documents.
55
+ # result.documents
56
+ #
57
+ # @return [ Array<BSON::Document> ] The documents.
58
+ #
59
+ # @since 2.0.0
60
+ def documents
61
+ reply.documents[0][CURSORS]
62
+ end
63
+
64
+ private
65
+
66
+ def first
67
+ @first ||= reply.documents[0] || {}
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end