mongo 2.0.6 → 2.1.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +5 -2
- data/lib/mongo/address/ipv4.rb +6 -1
- data/lib/mongo/address/unix.rb +2 -2
- data/lib/mongo/address.rb +18 -10
- data/lib/mongo/auth/cr/conversation.rb +1 -1
- data/lib/mongo/auth/ldap/conversation.rb +7 -3
- data/lib/mongo/auth/scram/conversation.rb +9 -3
- data/lib/mongo/auth/user/view.rb +23 -2
- data/lib/mongo/auth/x509/conversation.rb +1 -1
- data/lib/mongo/bulk_write/combineable.rb +51 -0
- data/lib/mongo/bulk_write/ordered_combiner.rb +55 -0
- data/lib/mongo/bulk_write/result.rb +191 -0
- data/lib/mongo/bulk_write/result_combiner.rb +117 -0
- data/lib/mongo/bulk_write/transformable.rb +132 -0
- data/lib/mongo/bulk_write/unordered_combiner.rb +52 -0
- data/lib/mongo/bulk_write/validatable.rb +62 -0
- data/lib/mongo/bulk_write.rb +159 -23
- data/lib/mongo/client.rb +52 -16
- data/lib/mongo/cluster/topology/replica_set.rb +27 -9
- data/lib/mongo/cluster/topology/sharded.rb +1 -1
- data/lib/mongo/cluster/topology/unknown.rb +5 -2
- data/lib/mongo/cluster.rb +42 -7
- data/lib/mongo/collection/view/aggregation.rb +48 -9
- data/lib/mongo/collection/view/immutable.rb +6 -6
- data/lib/mongo/collection/view/iterable.rb +18 -4
- data/lib/mongo/collection/view/map_reduce.rb +58 -17
- data/lib/mongo/collection/view/readable.rb +173 -42
- data/lib/mongo/collection/view/writable.rb +37 -23
- data/lib/mongo/collection/view.rb +2 -2
- data/lib/mongo/collection.rb +370 -33
- data/lib/mongo/cursor.rb +15 -3
- data/lib/mongo/database/view.rb +5 -4
- data/lib/mongo/database.rb +14 -4
- data/lib/mongo/dbref.rb +113 -0
- data/lib/mongo/error/closed_stream.rb +34 -0
- data/lib/mongo/error/extra_file_chunk.rb +34 -0
- data/lib/mongo/error/{invalid_uri_option.rb → file_not_found.rb} +11 -12
- data/lib/mongo/error/invalid_file.rb +2 -2
- data/lib/mongo/error/invalid_file_revision.rb +37 -0
- data/lib/mongo/error/invalid_uri.rb +5 -4
- data/lib/mongo/error/missing_file_chunk.rb +38 -0
- data/lib/mongo/error/operation_failure.rb +1 -1
- data/lib/mongo/error/parser.rb +1 -1
- data/lib/mongo/error/unchangeable_collection_option.rb +38 -0
- data/lib/mongo/error/unexpected_chunk_length.rb +39 -0
- data/lib/mongo/error.rb +13 -2
- data/lib/mongo/event/description_changed.rb +1 -1
- data/lib/mongo/grid/file/chunk.rb +6 -6
- data/lib/mongo/grid/file/{metadata.rb → info.rb} +41 -39
- data/lib/mongo/grid/file.rb +13 -10
- data/lib/mongo/grid/fs_bucket.rb +448 -0
- data/lib/mongo/grid/stream/read.rb +208 -0
- data/lib/mongo/grid/stream/write.rb +187 -0
- data/lib/mongo/grid/stream.rb +64 -0
- data/lib/mongo/grid.rb +2 -1
- data/lib/mongo/index/view.rb +3 -3
- data/lib/mongo/index.rb +5 -0
- data/lib/mongo/loggable.rb +34 -57
- data/lib/mongo/logger.rb +16 -78
- data/lib/mongo/monitoring/command_log_subscriber.rb +112 -0
- data/lib/mongo/monitoring/event/command_failed.rb +96 -0
- data/lib/mongo/monitoring/event/command_started.rb +89 -0
- data/lib/mongo/monitoring/event/command_succeeded.rb +118 -0
- data/lib/mongo/monitoring/event/secure.rb +58 -0
- data/lib/mongo/monitoring/event.rb +18 -0
- data/lib/mongo/monitoring/publishable.rb +106 -0
- data/lib/mongo/monitoring.rb +195 -0
- data/lib/mongo/operation/{aggregate.rb → commands/aggregate.rb} +3 -41
- data/lib/mongo/operation/commands/collections_info/result.rb +39 -0
- data/lib/mongo/operation/commands/collections_info.rb +68 -0
- data/lib/mongo/operation/{command.rb → commands/command.rb} +2 -18
- data/lib/mongo/operation/commands/indexes.rb +70 -0
- data/lib/mongo/operation/commands/list_collections/result.rb +112 -0
- data/lib/mongo/operation/commands/list_collections.rb +54 -0
- data/lib/mongo/operation/commands/list_indexes/result.rb +116 -0
- data/lib/mongo/operation/commands/list_indexes.rb +56 -0
- data/lib/mongo/operation/{map_reduce → commands/map_reduce}/result.rb +1 -1
- data/lib/mongo/operation/{map_reduce.rb → commands/map_reduce.rb} +3 -41
- data/lib/mongo/operation/commands/parallel_scan/result.rb +72 -0
- data/lib/mongo/operation/commands/parallel_scan.rb +56 -0
- data/lib/mongo/operation/commands/user_query.rb +69 -0
- data/lib/mongo/{bulk_write/ordered_bulk_write.rb → operation/commands/users_info/result.rb} +18 -30
- data/lib/mongo/operation/commands/users_info.rb +53 -0
- data/lib/mongo/operation/commands.rb +24 -0
- data/lib/mongo/operation/executable.rb +4 -68
- data/lib/mongo/operation/kill_cursors.rb +3 -3
- data/lib/mongo/operation/read/get_more.rb +2 -22
- data/lib/mongo/{bulk_write/unordered_bulk_write.rb → operation/read/query/result.rb} +20 -26
- data/lib/mongo/operation/read/query.rb +4 -21
- data/lib/mongo/operation/read.rb +0 -4
- data/lib/mongo/operation/{read_preferrable.rb → read_preference.rb} +3 -2
- data/lib/mongo/operation/result.rb +13 -1
- data/lib/mongo/operation/specifiable.rb +42 -0
- data/lib/mongo/operation/write/bulk/bulkable.rb +82 -0
- data/lib/mongo/operation/write/bulk/delete/result.rb +74 -0
- data/lib/mongo/operation/write/bulk/delete.rb +71 -0
- data/lib/mongo/operation/write/bulk/insert/result.rb +129 -0
- data/lib/mongo/operation/write/bulk/insert.rb +96 -0
- data/lib/mongo/operation/write/bulk/legacy_mergable.rb +87 -0
- data/lib/mongo/operation/write/bulk/mergable.rb +71 -0
- data/lib/mongo/operation/write/bulk/update/result.rb +174 -0
- data/lib/mongo/operation/write/bulk/update.rb +81 -0
- data/lib/mongo/operation/write/bulk.rb +6 -3
- data/lib/mongo/operation/write/command/create_index.rb +0 -1
- data/lib/mongo/operation/write/command/create_user.rb +0 -1
- data/lib/mongo/operation/write/command/delete.rb +0 -1
- data/lib/mongo/operation/write/command/drop_index.rb +0 -1
- data/lib/mongo/operation/write/command/insert.rb +0 -1
- data/lib/mongo/operation/write/command/remove_user.rb +0 -1
- data/lib/mongo/operation/write/command/update.rb +0 -1
- data/lib/mongo/operation/write/command/update_user.rb +0 -1
- data/lib/mongo/operation/write/command/writable.rb +13 -18
- data/lib/mongo/operation/write/create_index.rb +4 -27
- data/lib/mongo/operation/write/create_user.rb +4 -30
- data/lib/mongo/operation/write/delete.rb +6 -29
- data/lib/mongo/operation/write/drop_index.rb +3 -3
- data/lib/mongo/operation/write/gle.rb +48 -0
- data/lib/mongo/operation/write/idable.rb +5 -0
- data/lib/mongo/operation/write/insert.rb +2 -24
- data/lib/mongo/operation/write/remove_user.rb +4 -27
- data/lib/mongo/operation/write/update.rb +13 -36
- data/lib/mongo/operation/write/update_user.rb +4 -30
- data/lib/mongo/operation/write/write_command_enabled.rb +53 -0
- data/lib/mongo/operation/write.rb +2 -0
- data/lib/mongo/operation.rb +32 -4
- data/lib/mongo/options/mapper.rb +4 -2
- data/lib/mongo/options/redacted.rb +156 -0
- data/lib/mongo/options.rb +1 -0
- data/lib/mongo/protocol/delete.rb +75 -15
- data/lib/mongo/protocol/get_more.rb +65 -13
- data/lib/mongo/protocol/insert.rb +85 -13
- data/lib/mongo/protocol/kill_cursors.rb +59 -14
- data/lib/mongo/protocol/message.rb +12 -12
- data/lib/mongo/protocol/query.rb +163 -37
- data/lib/mongo/protocol/reply.rb +103 -0
- data/lib/mongo/protocol/serializers.rb +1 -1
- data/lib/mongo/protocol/update.rb +82 -14
- data/lib/mongo/retryable.rb +83 -0
- data/lib/mongo/server/connectable.rb +21 -25
- data/lib/mongo/server/connection.rb +75 -4
- data/lib/mongo/server/connection_pool/queue.rb +15 -0
- data/lib/mongo/server/connection_pool.rb +12 -0
- data/lib/mongo/server/description/features.rb +2 -1
- data/lib/mongo/server/description.rb +52 -1
- data/lib/mongo/server/monitor/connection.rb +26 -2
- data/lib/mongo/server/monitor.rb +19 -3
- data/lib/mongo/server.rb +39 -5
- data/lib/mongo/server_selector/selectable.rb +40 -31
- data/lib/mongo/server_selector.rb +19 -10
- data/lib/mongo/socket/ssl.rb +28 -16
- data/lib/mongo/socket/tcp.rb +3 -3
- data/lib/mongo/socket/unix.rb +5 -8
- data/lib/mongo/socket.rb +11 -4
- data/lib/mongo/uri.rb +248 -137
- data/lib/mongo/version.rb +1 -1
- data/lib/mongo.rb +5 -3
- data/spec/mongo/address/unix_spec.rb +1 -1
- data/spec/mongo/address_spec.rb +25 -0
- data/spec/mongo/auth/cr_spec.rb +9 -1
- data/spec/mongo/auth/ldap/conversation_spec.rb +43 -0
- data/spec/mongo/auth/ldap_spec.rb +9 -1
- data/spec/mongo/auth/scram_spec.rb +9 -1
- data/spec/mongo/auth/user/view_spec.rb +26 -1
- data/spec/mongo/auth/x509_spec.rb +9 -1
- data/spec/mongo/bulk_write/ordered_combiner_spec.rb +271 -0
- data/spec/mongo/bulk_write/unordered_combiner_spec.rb +239 -0
- data/spec/mongo/bulk_write_spec.rb +428 -0
- data/spec/mongo/client_spec.rb +167 -17
- data/spec/mongo/cluster/topology/replica_set_spec.rb +18 -9
- data/spec/mongo/cluster/topology/sharded_spec.rb +11 -3
- data/spec/mongo/cluster/topology/single_spec.rb +12 -4
- data/spec/mongo/cluster_spec.rb +55 -10
- data/spec/mongo/collection/view/aggregation_spec.rb +188 -1
- data/spec/mongo/collection/view/explainable_spec.rb +1 -1
- data/spec/mongo/collection/view/immutable_spec.rb +103 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +99 -4
- data/spec/mongo/collection/view/readable_spec.rb +238 -6
- data/spec/mongo/collection/view/writable_spec.rb +4 -4
- data/spec/mongo/collection/view_spec.rb +459 -71
- data/spec/mongo/collection_spec.rb +1291 -9
- data/spec/mongo/command_monitoring_spec.rb +51 -0
- data/spec/mongo/connection_string_spec.rb +115 -0
- data/spec/mongo/crud_spec.rb +2 -2
- data/spec/mongo/cursor_spec.rb +3 -3
- data/spec/mongo/database_spec.rb +47 -11
- data/spec/mongo/dbref_spec.rb +149 -0
- data/spec/mongo/grid/file/chunk_spec.rb +5 -5
- data/spec/mongo/grid/file/{metadata_spec.rb → info_spec.rb} +29 -17
- data/spec/mongo/grid/file_spec.rb +8 -8
- data/spec/mongo/grid/fs_bucket_spec.rb +1020 -0
- data/spec/mongo/grid/stream/read_spec.rb +275 -0
- data/spec/mongo/grid/stream/write_spec.rb +440 -0
- data/spec/mongo/grid/stream_spec.rb +48 -0
- data/spec/mongo/gridfs_spec.rb +50 -0
- data/spec/mongo/logger_spec.rb +0 -40
- data/spec/mongo/monitoring/command_log_subscriber_spec.rb +76 -0
- data/spec/mongo/monitoring/event/command_started_spec.rb +26 -0
- data/spec/mongo/monitoring/event/command_succeeded_spec.rb +26 -0
- data/spec/mongo/monitoring/event/secure_spec.rb +57 -0
- data/spec/mongo/monitoring_spec.rb +168 -0
- data/spec/mongo/operation/commands/aggregate_spec.rb +69 -0
- data/spec/mongo/operation/{read → commands}/collections_info_spec.rb +1 -1
- data/spec/mongo/operation/{command_spec.rb → commands/command_spec.rb} +0 -18
- data/spec/mongo/operation/{read → commands}/indexes_spec.rb +1 -1
- data/spec/mongo/operation/{map_reduce_spec.rb → commands/map_reduce_spec.rb} +1 -19
- data/spec/mongo/operation/kill_cursors_spec.rb +1 -17
- data/spec/mongo/operation/read/get_more_spec.rb +0 -16
- data/spec/mongo/operation/read/query_spec.rb +19 -16
- data/spec/mongo/operation/{read_preferrable_spec.rb → read_preference_spec.rb} +11 -11
- data/spec/mongo/operation/write/bulk/{bulk_delete_spec.rb → delete_spec.rb} +18 -29
- data/spec/mongo/operation/write/bulk/{bulk_insert_spec.rb → insert_spec.rb} +3 -14
- data/spec/mongo/operation/write/bulk/{bulk_update_spec.rb → update_spec.rb} +8 -19
- data/spec/mongo/operation/write/command/delete_spec.rb +0 -16
- data/spec/mongo/operation/write/command/insert_spec.rb +0 -16
- data/spec/mongo/operation/write/command/update_spec.rb +0 -16
- data/spec/mongo/operation/write/delete_spec.rb +4 -4
- data/spec/mongo/operation/write/insert_spec.rb +2 -13
- data/spec/mongo/operation/write/update_spec.rb +7 -7
- data/spec/mongo/options/redacted_spec.rb +350 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +5 -3
- data/spec/mongo/protocol/query_spec.rb +15 -30
- data/spec/mongo/retryable_spec.rb +147 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +16 -0
- data/spec/mongo/server/connection_pool_spec.rb +50 -6
- data/spec/mongo/server/connection_spec.rb +49 -4
- data/spec/mongo/server/description_spec.rb +49 -3
- data/spec/mongo/server/monitor_spec.rb +51 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +32 -59
- data/spec/mongo/server_selection_rtt_spec.rb +37 -57
- data/spec/mongo/server_selection_spec.rb +19 -9
- data/spec/mongo/server_selector/nearest_spec.rb +35 -27
- data/spec/mongo/server_selector/primary_preferred_spec.rb +32 -30
- data/spec/mongo/server_selector/primary_spec.rb +21 -14
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +28 -26
- data/spec/mongo/server_selector/secondary_spec.rb +24 -22
- data/spec/mongo/server_selector_spec.rb +87 -24
- data/spec/mongo/server_spec.rb +94 -8
- data/spec/mongo/socket/ssl_spec.rb +123 -13
- data/spec/mongo/socket/unix_spec.rb +52 -0
- data/spec/mongo/uri_spec.rb +295 -67
- data/spec/spec_helper.rb +40 -24
- data/spec/support/authorization.rb +23 -9
- data/spec/support/certificates/client.pem +4 -4
- data/spec/support/command_monitoring/bulkWrite.yml +73 -0
- data/spec/support/command_monitoring/command.yml +42 -0
- data/spec/support/command_monitoring/deleteMany.yml +55 -0
- data/spec/support/command_monitoring/deleteOne.yml +55 -0
- data/spec/support/command_monitoring/find.yml +219 -0
- data/spec/support/command_monitoring/insertMany.yml +81 -0
- data/spec/support/command_monitoring/insertOne.yml +51 -0
- data/spec/support/command_monitoring/updateMany.yml +67 -0
- data/spec/support/command_monitoring/updateOne.yml +95 -0
- data/spec/support/command_monitoring.rb +365 -0
- data/spec/support/connection_string.rb +228 -0
- data/spec/support/connection_string_tests/invalid-uris.yml +193 -0
- data/spec/support/connection_string_tests/valid-auth.yml +256 -0
- data/spec/support/connection_string_tests/valid-host_identifiers.yml +121 -0
- data/spec/support/connection_string_tests/valid-options.yml +30 -0
- data/spec/support/connection_string_tests/valid-unix_socket-absolute.yml +197 -0
- data/spec/support/connection_string_tests/valid-unix_socket-relative.yml +213 -0
- data/spec/support/connection_string_tests/valid-warnings.yml +55 -0
- data/spec/support/crud/read.rb +22 -19
- data/spec/support/crud/write.rb +58 -27
- data/spec/support/crud.rb +10 -2
- data/spec/support/gridfs.rb +637 -0
- data/spec/support/gridfs_tests/delete.yml +157 -0
- data/spec/support/gridfs_tests/download.yml +210 -0
- data/spec/support/gridfs_tests/download_by_name.yml +113 -0
- data/spec/support/gridfs_tests/upload.yml +158 -0
- data/spec/support/matchers.rb +1 -1
- data/spec/support/sdam/rs/equal_electionids.yml +44 -0
- data/spec/support/sdam/rs/new_primary_new_electionid.yml +95 -0
- data/spec/support/sdam/rs/null_election_id.yml +144 -0
- data/spec/support/sdam/rs/primary_disconnect_electionid.yml +124 -0
- data/spec/support/sdam/rs/primary_mismatched_me.yml +37 -0
- data/spec/support/sdam/rs/primary_to_no_primary_mismatched_me.yml +75 -0
- data/spec/support/sdam/rs/secondary_mismatched_me.yml +37 -0
- data/spec/support/sdam/sharded/mongos_disconnect.yml +104 -0
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +1 -1
- data/spec/support/sdam/single/direct_connection_slave.yml +1 -1
- data/spec/support/sdam/single/direct_connection_standalone.yml +1 -1
- data/spec/support/sdam/single/not_ok_response.yml +0 -1
- data/spec/support/server_discovery_and_monitoring.rb +22 -3
- data/spec/support/server_selection.rb +3 -1
- data/spec/support/shared/bulk_write.rb +218 -22
- data/spec/support/shared/server_selector.rb +80 -14
- data.tar.gz.sig +0 -0
- metadata +188 -59
- metadata.gz.sig +0 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +0 -196
- data/lib/mongo/bulk_write/deletable.rb +0 -56
- data/lib/mongo/bulk_write/insertable.rb +0 -48
- data/lib/mongo/bulk_write/replacable.rb +0 -57
- data/lib/mongo/bulk_write/updatable.rb +0 -68
- data/lib/mongo/grid/fs.rb +0 -149
- data/lib/mongo/operation/list_collections/result.rb +0 -114
- data/lib/mongo/operation/list_indexes/result.rb +0 -118
- data/lib/mongo/operation/read/collections_info.rb +0 -68
- data/lib/mongo/operation/read/indexes.rb +0 -69
- data/lib/mongo/operation/read/list_collections.rb +0 -76
- data/lib/mongo/operation/read/list_indexes.rb +0 -78
- data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +0 -75
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +0 -145
- data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +0 -130
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +0 -132
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +0 -67
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +0 -162
- data/lib/mongo/operation/write/bulk/bulk_update.rb +0 -154
- data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +0 -83
- data/spec/mongo/bulk/bulk_write_spec.rb +0 -262
- data/spec/mongo/grid/fs_spec.rb +0 -160
- data/spec/mongo/loggable_spec.rb +0 -63
- data/spec/mongo/operation/aggregate_spec.rb +0 -127
- /data/lib/mongo/operation/{aggregate → commands/aggregate}/result.rb +0 -0
@@ -2,20 +2,36 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Mongo::Server::ConnectionPool do
|
4
4
|
|
5
|
+
let(:options) do
|
6
|
+
TEST_OPTIONS.merge(max_pool_size: 2)
|
7
|
+
end
|
8
|
+
|
5
9
|
let(:address) do
|
6
10
|
Mongo::Address.new('127.0.0.1:27017')
|
7
11
|
end
|
8
12
|
|
13
|
+
let(:monitoring) do
|
14
|
+
Mongo::Monitoring.new
|
15
|
+
end
|
16
|
+
|
17
|
+
let(:listeners) do
|
18
|
+
Mongo::Event::Listeners.new
|
19
|
+
end
|
20
|
+
|
9
21
|
describe '#checkin' do
|
10
22
|
|
11
23
|
let(:server) do
|
12
|
-
Mongo::Server.new(address, double('cluster'),
|
24
|
+
Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
|
13
25
|
end
|
14
26
|
|
15
27
|
let!(:pool) do
|
16
28
|
described_class.get(server)
|
17
29
|
end
|
18
30
|
|
31
|
+
after do
|
32
|
+
server.disconnect!
|
33
|
+
end
|
34
|
+
|
19
35
|
context 'when a connection is checked out on the thread' do
|
20
36
|
|
21
37
|
let!(:connection) do
|
@@ -39,7 +55,7 @@ describe Mongo::Server::ConnectionPool do
|
|
39
55
|
describe '#checkout' do
|
40
56
|
|
41
57
|
let(:server) do
|
42
|
-
Mongo::Server.new(address, double('cluster'),
|
58
|
+
Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
|
43
59
|
end
|
44
60
|
|
45
61
|
let!(:pool) do
|
@@ -71,7 +87,7 @@ describe Mongo::Server::ConnectionPool do
|
|
71
87
|
context 'when a connection is checked out on a different thread' do
|
72
88
|
|
73
89
|
let!(:connection) do
|
74
|
-
Thread.new { pool.checkout }.
|
90
|
+
Thread.new { pool.checkout }.join
|
75
91
|
end
|
76
92
|
|
77
93
|
it 'returns a new connection' do
|
@@ -84,16 +100,40 @@ describe Mongo::Server::ConnectionPool do
|
|
84
100
|
end
|
85
101
|
end
|
86
102
|
|
103
|
+
describe '#disconnect!' do
|
104
|
+
|
105
|
+
let(:server) do
|
106
|
+
Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
|
107
|
+
end
|
108
|
+
|
109
|
+
let!(:pool) do
|
110
|
+
described_class.get(server)
|
111
|
+
end
|
112
|
+
|
113
|
+
after do
|
114
|
+
server.disconnect!
|
115
|
+
end
|
116
|
+
|
117
|
+
it 'disconnects the queue' do
|
118
|
+
expect(pool.send(:queue)).to receive(:disconnect!).twice.and_call_original
|
119
|
+
pool.disconnect!
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
87
123
|
describe '.get' do
|
88
124
|
|
89
125
|
let(:server) do
|
90
|
-
Mongo::Server.new(address, double('cluster'),
|
126
|
+
Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
|
91
127
|
end
|
92
128
|
|
93
129
|
let!(:pool) do
|
94
130
|
described_class.get(server)
|
95
131
|
end
|
96
132
|
|
133
|
+
after do
|
134
|
+
server.disconnect!
|
135
|
+
end
|
136
|
+
|
97
137
|
it 'returns the pool for the server' do
|
98
138
|
expect(pool).to eql(described_class.get(server))
|
99
139
|
end
|
@@ -102,13 +142,17 @@ describe Mongo::Server::ConnectionPool do
|
|
102
142
|
describe '#inspect' do
|
103
143
|
|
104
144
|
let(:server) do
|
105
|
-
Mongo::Server.new(address, double('cluster'),
|
145
|
+
Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
|
106
146
|
end
|
107
147
|
|
108
148
|
let!(:pool) do
|
109
149
|
described_class.get(server)
|
110
150
|
end
|
111
151
|
|
152
|
+
after do
|
153
|
+
server.disconnect!
|
154
|
+
end
|
155
|
+
|
112
156
|
it 'includes the object id' do
|
113
157
|
expect(pool.inspect).to include(pool.object_id.to_s)
|
114
158
|
end
|
@@ -121,7 +165,7 @@ describe Mongo::Server::ConnectionPool do
|
|
121
165
|
describe '#with_connection' do
|
122
166
|
|
123
167
|
let(:server) do
|
124
|
-
Mongo::Server.new(address, double('cluster'),
|
168
|
+
Mongo::Server.new(address, double('cluster'), monitoring, listeners, options)
|
125
169
|
end
|
126
170
|
|
127
171
|
let!(:pool) do
|
@@ -6,8 +6,53 @@ describe Mongo::Server::Connection do
|
|
6
6
|
Mongo::Address.new(DEFAULT_ADDRESS)
|
7
7
|
end
|
8
8
|
|
9
|
+
let(:monitoring) do
|
10
|
+
Mongo::Monitoring.new
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:listeners) do
|
14
|
+
Mongo::Event::Listeners.new
|
15
|
+
end
|
16
|
+
|
9
17
|
let(:server) do
|
10
|
-
Mongo::Server.new(address, double('cluster'),
|
18
|
+
Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
|
19
|
+
end
|
20
|
+
|
21
|
+
after do
|
22
|
+
server.disconnect!
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#connectable?' do
|
26
|
+
|
27
|
+
# context 'when the connection is connectable' do
|
28
|
+
|
29
|
+
# let(:connection) do
|
30
|
+
# described_class.new(server)
|
31
|
+
# end
|
32
|
+
|
33
|
+
# it 'returns true' do
|
34
|
+
# expect(connection).to be_connectable
|
35
|
+
# end
|
36
|
+
# end
|
37
|
+
|
38
|
+
context 'when the connection is not connectable' do
|
39
|
+
|
40
|
+
let(:bad_address) do
|
41
|
+
Mongo::Address.new('127.0.0.1:666')
|
42
|
+
end
|
43
|
+
|
44
|
+
let(:bad_server) do
|
45
|
+
Mongo::Server.new(bad_address, double('cluster'), monitoring, listeners, TEST_OPTIONS)
|
46
|
+
end
|
47
|
+
|
48
|
+
let(:connection) do
|
49
|
+
described_class.new(bad_server)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'returns false' do
|
53
|
+
expect(connection).to_not be_connectable
|
54
|
+
end
|
55
|
+
end
|
11
56
|
end
|
12
57
|
|
13
58
|
describe '#connect!' do
|
@@ -164,7 +209,7 @@ describe Mongo::Server::Connection do
|
|
164
209
|
end
|
165
210
|
|
166
211
|
after do
|
167
|
-
authorized_collection.
|
212
|
+
authorized_collection.delete_many
|
168
213
|
end
|
169
214
|
|
170
215
|
it 'it dispatchs the message to the socket' do
|
@@ -187,7 +232,7 @@ describe Mongo::Server::Connection do
|
|
187
232
|
end
|
188
233
|
|
189
234
|
after do
|
190
|
-
authorized_collection.
|
235
|
+
authorized_collection.delete_many
|
191
236
|
end
|
192
237
|
|
193
238
|
it 'it dispatchs the message to the socket' do
|
@@ -225,7 +270,7 @@ describe Mongo::Server::Connection do
|
|
225
270
|
end
|
226
271
|
|
227
272
|
after do
|
228
|
-
authorized_collection.
|
273
|
+
authorized_collection.delete_many
|
229
274
|
end
|
230
275
|
|
231
276
|
it 'disconnects the connection' do
|
@@ -31,6 +31,10 @@ describe Mongo::Server::Description do
|
|
31
31
|
Mongo::Address.new('127.0.0.1:27017')
|
32
32
|
end
|
33
33
|
|
34
|
+
let(:monitoring) do
|
35
|
+
Mongo::Monitoring.new
|
36
|
+
end
|
37
|
+
|
34
38
|
describe '#arbiter?' do
|
35
39
|
|
36
40
|
context 'when the server is an arbiter' do
|
@@ -583,7 +587,7 @@ describe Mongo::Server::Description do
|
|
583
587
|
end
|
584
588
|
|
585
589
|
let(:server) do
|
586
|
-
Mongo::Server.new(address, double('cluster'), listeners)
|
590
|
+
Mongo::Server.new(address, double('cluster'), monitoring, listeners)
|
587
591
|
end
|
588
592
|
|
589
593
|
let(:description) do
|
@@ -604,7 +608,7 @@ describe Mongo::Server::Description do
|
|
604
608
|
end
|
605
609
|
|
606
610
|
let(:server) do
|
607
|
-
Mongo::Server.new(other_address, double('cluster'), listeners)
|
611
|
+
Mongo::Server.new(other_address, double('cluster'), monitoring, listeners)
|
608
612
|
end
|
609
613
|
|
610
614
|
it 'returns false' do
|
@@ -613,6 +617,48 @@ describe Mongo::Server::Description do
|
|
613
617
|
end
|
614
618
|
end
|
615
619
|
|
620
|
+
describe '#me_mismatch?' do
|
621
|
+
|
622
|
+
let(:description) do
|
623
|
+
described_class.new(address, config)
|
624
|
+
end
|
625
|
+
|
626
|
+
context 'when the server address matches the me field' do
|
627
|
+
|
628
|
+
let(:config) do
|
629
|
+
replica.merge('me' => address.to_s)
|
630
|
+
end
|
631
|
+
|
632
|
+
it 'returns false' do
|
633
|
+
expect(description.me_mismatch?).to be(false)
|
634
|
+
end
|
635
|
+
end
|
636
|
+
|
637
|
+
context 'when the server address does not match the me field' do
|
638
|
+
|
639
|
+
let(:config) do
|
640
|
+
replica.merge('me' => 'localhost:27020')
|
641
|
+
end
|
642
|
+
|
643
|
+
it 'returns true' do
|
644
|
+
expect(description.me_mismatch?).to be(true)
|
645
|
+
end
|
646
|
+
end
|
647
|
+
|
648
|
+
context 'when there is no me field' do
|
649
|
+
|
650
|
+
let(:config) do
|
651
|
+
replica.tap do |r|
|
652
|
+
r.delete('me')
|
653
|
+
end
|
654
|
+
end
|
655
|
+
|
656
|
+
it 'returns false' do
|
657
|
+
expect(description.me_mismatch?).to be(false)
|
658
|
+
end
|
659
|
+
end
|
660
|
+
end
|
661
|
+
|
616
662
|
describe '#lists_server?' do
|
617
663
|
|
618
664
|
let(:description) do
|
@@ -628,7 +674,7 @@ describe Mongo::Server::Description do
|
|
628
674
|
end
|
629
675
|
|
630
676
|
let(:server) do
|
631
|
-
Mongo::Server.new(server_address, double('cluster'), listeners)
|
677
|
+
Mongo::Server.new(server_address, double('cluster'), monitoring, listeners)
|
632
678
|
end
|
633
679
|
|
634
680
|
context 'when the server is included in the description hosts list' do
|
@@ -141,4 +141,55 @@ describe Mongo::Server::Monitor do
|
|
141
141
|
expect(monitor.description).to_not be_nil
|
142
142
|
end
|
143
143
|
end
|
144
|
+
|
145
|
+
describe '#restart!' do
|
146
|
+
|
147
|
+
let(:monitor) do
|
148
|
+
described_class.new(address, listeners, TEST_OPTIONS)
|
149
|
+
end
|
150
|
+
|
151
|
+
let!(:thread) do
|
152
|
+
monitor.run!
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'when the monitor is already running' do
|
156
|
+
|
157
|
+
it 'does not create a new thread' do
|
158
|
+
expect(monitor.restart!).to be(thread)
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
context 'when the monitor is not already running' do
|
163
|
+
|
164
|
+
before do
|
165
|
+
monitor.stop!
|
166
|
+
sleep(1)
|
167
|
+
end
|
168
|
+
|
169
|
+
it 'creates a new thread' do
|
170
|
+
expect(monitor.restart!).not_to be(thread)
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
describe '#stop' do
|
176
|
+
|
177
|
+
let(:monitor) do
|
178
|
+
described_class.new(address, listeners, TEST_OPTIONS)
|
179
|
+
end
|
180
|
+
|
181
|
+
let!(:thread) do
|
182
|
+
monitor.run!
|
183
|
+
end
|
184
|
+
|
185
|
+
before do
|
186
|
+
expect(monitor.connection).to receive(:disconnect!).and_call_original
|
187
|
+
monitor.stop!
|
188
|
+
sleep(1)
|
189
|
+
end
|
190
|
+
|
191
|
+
it 'kills the monitor thread' do
|
192
|
+
expect(thread.stop?).to be(true)
|
193
|
+
end
|
194
|
+
end
|
144
195
|
end
|
@@ -11,39 +11,26 @@ describe 'Server Discovery and Monitoring' do
|
|
11
11
|
|
12
12
|
before(:all) do
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
14
|
+
module Mongo
|
15
|
+
# We monkey-patch the server here, so the monitors do not run and no
|
16
|
+
# real TCP connection is attempted. Thus we can control the server
|
17
|
+
# descriptions per-phase.
|
18
|
+
#
|
19
|
+
# @since 2.0.0
|
20
|
+
class Server
|
21
|
+
|
22
|
+
alias :original_initialize :initialize
|
23
|
+
def initialize(address, cluster, monitoring, event_listeners, options = {})
|
24
|
+
@address = address
|
25
|
+
@cluster = cluster
|
26
|
+
@monitoring = monitoring
|
27
|
+
@options = options.freeze
|
28
|
+
@monitor = Monitor.new(address, event_listeners, options)
|
29
|
+
end
|
27
30
|
|
28
|
-
|
29
|
-
|
30
|
-
# descriptions per-phase.
|
31
|
-
#
|
32
|
-
# @since 2.0.0
|
33
|
-
class Mongo::Server
|
34
|
-
|
35
|
-
# The constructor keeps the same API, but does not instantiate a
|
36
|
-
# monitor and run it.
|
37
|
-
def initialize(address, cluster, event_listeners, options = {})
|
38
|
-
@address = address
|
39
|
-
@cluster = cluster
|
40
|
-
@options = options.freeze
|
41
|
-
@monitor = Monitor.new(address, event_listeners, options)
|
31
|
+
alias :original_disconnect! :disconnect!
|
32
|
+
def disconnect!; true; end
|
42
33
|
end
|
43
|
-
|
44
|
-
# Disconnect simply needs to return true since we have no monitor and
|
45
|
-
# no connection.
|
46
|
-
def disconnect!; true; end
|
47
34
|
end
|
48
35
|
|
49
36
|
# Client is set as an instance variable inside the scope of the spec to
|
@@ -53,36 +40,17 @@ describe 'Server Discovery and Monitoring' do
|
|
53
40
|
end
|
54
41
|
|
55
42
|
after(:all) do
|
43
|
+
@client.close
|
56
44
|
|
57
45
|
# Return the server implementation to its original for the other
|
58
46
|
# tests in the suite.
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
@address = address
|
64
|
-
@cluster = cluster
|
65
|
-
@options = options.freeze
|
66
|
-
@monitor = Monitor.new(address, event_listeners, options)
|
67
|
-
@monitor.scan!
|
68
|
-
@monitor.run!
|
69
|
-
end
|
70
|
-
|
71
|
-
# Returns disconnect! to its original implementation.
|
72
|
-
def disconnect!
|
73
|
-
context.with_connection do |connection|
|
74
|
-
connection.disconnect!
|
75
|
-
end
|
76
|
-
@monitor.stop! and true
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
class Mongo::Address
|
81
|
-
private
|
47
|
+
module Mongo
|
48
|
+
class Server
|
49
|
+
alias :initialize :original_initialize
|
50
|
+
remove_method(:original_initialize)
|
82
51
|
|
83
|
-
|
84
|
-
|
85
|
-
::Socket.getaddrinfo(host, nil, fam, ::Socket::SOCK_STREAM).first[4]
|
52
|
+
alias :disconnect! :original_disconnect!
|
53
|
+
remove_method(:original_disconnect!)
|
86
54
|
end
|
87
55
|
end
|
88
56
|
end
|
@@ -96,8 +64,13 @@ describe 'Server Discovery and Monitoring' do
|
|
96
64
|
# For each response in the phase, we need to change that server's
|
97
65
|
# description.
|
98
66
|
server = find_server(@client, response.address)
|
99
|
-
server = Mongo::Server.new(
|
100
|
-
|
67
|
+
server = Mongo::Server.new(
|
68
|
+
Mongo::Address.new(response.address),
|
69
|
+
@client.cluster,
|
70
|
+
@client.instance_variable_get(:@monitoring),
|
71
|
+
@client.cluster.send(:event_listeners),
|
72
|
+
@client.cluster.options
|
73
|
+
) unless server
|
101
74
|
monitor = server.instance_variable_get(:@monitor)
|
102
75
|
description = monitor.inspector.run(server.description, response.ismaster, 0.5)
|
103
76
|
monitor.instance_variable_set(:@description, description)
|
@@ -8,80 +8,60 @@ describe 'Server Selection moving average round trip time calculation' do
|
|
8
8
|
|
9
9
|
spec = Mongo::ServerSelection::RTT::Spec.new(file)
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
module Mongo
|
14
|
-
class Server
|
15
|
-
|
16
|
-
# We monkey-patch the monitor here, so the last average rtt can be controlled.
|
17
|
-
# We keep the API of Monitor#initialize but add in an extra option and set the last rtt.
|
18
|
-
#
|
19
|
-
# @since 2.0.0
|
20
|
-
class Monitor
|
21
|
-
|
22
|
-
def initialize(address, listeners, options = {})
|
23
|
-
@description = Mongo::Server::Description.new(address, {})
|
24
|
-
@inspector = Mongo::Server::Description::Inspector.new(listeners)
|
25
|
-
@options = options.freeze
|
26
|
-
@connection = Connection.new(address, options)
|
27
|
-
@last_round_trip_time = options[:avg_rtt_ms]
|
28
|
-
@mutex = Mutex.new
|
29
|
-
end
|
11
|
+
context(spec.description) do
|
30
12
|
|
31
|
-
|
13
|
+
before(:all) do
|
32
14
|
|
33
|
-
|
15
|
+
module Mongo
|
16
|
+
class Server
|
17
|
+
|
18
|
+
# We monkey-patch the monitor here, so the last average rtt can be controlled.
|
19
|
+
# We keep the API of Monitor#initialize but add in an extra option and set the last rtt.
|
34
20
|
#
|
35
21
|
# @since 2.0.0
|
36
|
-
|
37
|
-
|
38
|
-
|
22
|
+
class Monitor
|
23
|
+
|
24
|
+
alias :original_initialize :initialize
|
25
|
+
def initialize(address, listeners, options = {})
|
26
|
+
@description = Mongo::Server::Description.new(address, {})
|
27
|
+
@inspector = Mongo::Server::Description::Inspector.new(listeners)
|
28
|
+
@options = options.freeze
|
29
|
+
@connection = Connection.new(address, options)
|
30
|
+
@last_round_trip_time = options[:avg_rtt_ms]
|
31
|
+
@mutex = Mutex.new
|
32
|
+
end
|
33
|
+
|
34
|
+
# We monkey patch this method to use an instance variable instead of calculating time elapsed.
|
35
|
+
#
|
36
|
+
# @since 2.0.0
|
37
|
+
alias :original_average_round_trip_time :average_round_trip_time
|
38
|
+
def average_round_trip_time(start)
|
39
|
+
new_rtt = @new_rtt_ms
|
40
|
+
RTT_WEIGHT_FACTOR * new_rtt + (1 - RTT_WEIGHT_FACTOR) * (@last_round_trip_time || new_rtt)
|
41
|
+
end
|
39
42
|
end
|
40
43
|
end
|
41
44
|
end
|
42
45
|
end
|
43
|
-
end
|
44
46
|
|
45
|
-
|
47
|
+
after(:all) do
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
+
module Mongo
|
50
|
+
class Server
|
49
51
|
|
50
|
-
|
51
|
-
|
52
|
-
|
52
|
+
# Return the monitor implementation to its original for the other
|
53
|
+
# tests in the suite.
|
54
|
+
class Monitor
|
53
55
|
|
54
|
-
|
55
|
-
|
56
|
-
# @example Create the server monitor.
|
57
|
-
# Mongo::Server::Monitor.new(address, listeners)
|
58
|
-
#
|
59
|
-
# @param [ Address ] address The address to monitor.
|
60
|
-
# @param [ Event::Listeners ] listeners The event listeners.
|
61
|
-
# @param [ Hash ] options The options.
|
62
|
-
#
|
63
|
-
# @since 2.0.0
|
64
|
-
def initialize(address, listeners, options = {})
|
65
|
-
@description = Description.new(address, {})
|
66
|
-
@inspector = Description::Inspector.new(listeners)
|
67
|
-
@options = options.freeze
|
68
|
-
@connection = Connection.new(address, options)
|
69
|
-
@last_round_trip_time = nil
|
70
|
-
@mutex = Mutex.new
|
71
|
-
end
|
72
|
-
|
73
|
-
private
|
56
|
+
alias :initialize :original_initialize
|
57
|
+
remove_method(:original_initialize)
|
74
58
|
|
75
|
-
|
76
|
-
|
77
|
-
RTT_WEIGHT_FACTOR * new_rtt + (1 - RTT_WEIGHT_FACTOR) * (@last_round_trip_time || new_rtt)
|
59
|
+
alias :average_round_trip_time :original_average_round_trip_time
|
60
|
+
remove_method(:original_average_round_trip_time)
|
78
61
|
end
|
79
62
|
end
|
80
63
|
end
|
81
64
|
end
|
82
|
-
end
|
83
|
-
|
84
|
-
context(spec.description) do
|
85
65
|
|
86
66
|
let(:address) do
|
87
67
|
Mongo::Address.new('127.0.0.1:27017')
|
@@ -14,6 +14,14 @@ describe 'Server Selection' do
|
|
14
14
|
spec.type.new({})
|
15
15
|
end
|
16
16
|
|
17
|
+
let(:monitoring) do
|
18
|
+
Mongo::Monitoring.new
|
19
|
+
end
|
20
|
+
|
21
|
+
let(:listeners) do
|
22
|
+
Mongo::Event::Listeners.new
|
23
|
+
end
|
24
|
+
|
17
25
|
let(:cluster) do
|
18
26
|
double('cluster').tap do |c|
|
19
27
|
allow(c).to receive(:topology).and_return(topology)
|
@@ -26,11 +34,12 @@ describe 'Server Selection' do
|
|
26
34
|
let(:candidate_servers) do
|
27
35
|
spec.candidate_servers.collect do |server|
|
28
36
|
address = Mongo::Address.new(server['address'])
|
29
|
-
Mongo::Server.new(address, double('cluster'),
|
37
|
+
Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS).tap do |s|
|
30
38
|
allow(s).to receive(:average_round_trip_time).and_return(server['avg_rtt_ms'])
|
31
39
|
allow(s).to receive(:tags).and_return(server['tags'])
|
32
40
|
allow(s).to receive(:secondary?).and_return(server['type'] == 'RSSecondary')
|
33
41
|
allow(s).to receive(:primary?).and_return(server['type'] == 'RSPrimary')
|
42
|
+
allow(s).to receive(:connectable?).and_return(true)
|
34
43
|
end
|
35
44
|
end
|
36
45
|
end
|
@@ -38,17 +47,18 @@ describe 'Server Selection' do
|
|
38
47
|
let(:in_latency_window) do
|
39
48
|
spec.in_latency_window.collect do |server|
|
40
49
|
address = Mongo::Address.new(server['address'])
|
41
|
-
Mongo::Server.new(address, double('cluster'),
|
50
|
+
Mongo::Server.new(address, double('cluster'), monitoring, listeners, TEST_OPTIONS).tap do |s|
|
42
51
|
allow(s).to receive(:average_round_trip_time).and_return(server['avg_rtt_ms'])
|
43
52
|
allow(s).to receive(:tags).and_return(server['tags'])
|
53
|
+
allow(s).to receive(:connectable?).and_return(true)
|
44
54
|
end
|
45
55
|
end
|
46
56
|
end
|
47
57
|
|
48
58
|
let(:server_selector) do
|
49
|
-
Mongo::ServerSelector.get(
|
50
|
-
|
51
|
-
|
59
|
+
Mongo::ServerSelector.get(:mode => spec.read_preference['mode'],
|
60
|
+
:tag_sets => spec.read_preference['tag_sets'],
|
61
|
+
:server_selection_timeout => 1)
|
52
62
|
end
|
53
63
|
|
54
64
|
before do
|
@@ -57,18 +67,18 @@ describe 'Server Selection' do
|
|
57
67
|
end
|
58
68
|
|
59
69
|
context 'Valid read preference and matching server available', if: spec.server_available? do
|
60
|
-
|
70
|
+
|
61
71
|
it 'Finds all suitable servers in the latency window', if: spec.replica_set? do
|
62
|
-
expect(server_selector.send(:select, cluster.servers)).to eq(in_latency_window)
|
72
|
+
expect(server_selector.send(:select, cluster.servers)).to eq(in_latency_window)
|
63
73
|
end
|
64
|
-
|
74
|
+
|
65
75
|
it 'Finds the most suitable server in the latency window' do
|
66
76
|
expect(in_latency_window).to include(server_selector.select_server(cluster))
|
67
77
|
end
|
68
78
|
end
|
69
79
|
|
70
80
|
context 'No matching server available', if: !spec.server_available? do
|
71
|
-
|
81
|
+
|
72
82
|
it 'Raises exception' do
|
73
83
|
expect do
|
74
84
|
server_selector.select_server(cluster)
|