mongo 1.12.5 → 2.0.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 +0 -0
- data/CONTRIBUTING.md +64 -0
- data/LICENSE +1 -1
- data/README.md +21 -126
- data/Rakefile +39 -21
- data/bin/mongo_console +6 -38
- data/lib/mongo/address/ipv4.rb +85 -0
- data/lib/mongo/address/ipv6.rb +85 -0
- data/lib/mongo/address/unix.rb +76 -0
- data/lib/mongo/address.rb +111 -0
- data/lib/mongo/auth/cr/conversation.rb +119 -0
- data/lib/mongo/auth/cr.rb +44 -0
- data/lib/mongo/auth/executable.rb +52 -0
- data/lib/mongo/auth/ldap/conversation.rb +92 -0
- data/lib/mongo/auth/ldap.rb +48 -0
- data/lib/mongo/auth/roles.rb +104 -0
- data/lib/mongo/auth/scram/conversation.rb +450 -0
- data/lib/mongo/auth/scram.rb +53 -0
- data/lib/mongo/auth/user/view.rb +102 -0
- data/lib/mongo/auth/user.rb +159 -0
- data/lib/mongo/auth/x509/conversation.rb +92 -0
- data/lib/mongo/auth/x509.rb +48 -0
- data/lib/mongo/auth.rb +108 -0
- data/lib/mongo/bulk_write/bulk_writable.rb +191 -0
- data/lib/mongo/bulk_write/deletable.rb +60 -0
- data/lib/mongo/bulk_write/insertable.rb +52 -0
- data/lib/mongo/bulk_write/ordered_bulk_write.rb +48 -0
- data/lib/mongo/bulk_write/replacable.rb +57 -0
- data/lib/mongo/bulk_write/unordered_bulk_write.rb +46 -0
- data/lib/mongo/bulk_write/updatable.rb +68 -0
- data/lib/mongo/bulk_write.rb +52 -0
- data/lib/mongo/client.rb +246 -0
- data/lib/mongo/cluster/topology/replica_set.rb +160 -0
- data/lib/mongo/cluster/topology/sharded.rb +132 -0
- data/lib/mongo/cluster/topology/standalone.rb +132 -0
- data/lib/mongo/cluster/topology/unknown.rb +155 -0
- data/lib/mongo/cluster/topology.rb +60 -0
- data/lib/mongo/cluster.rb +203 -0
- data/lib/mongo/collection/view/aggregation.rb +108 -0
- data/lib/mongo/collection/view/explainable.rb +49 -0
- data/lib/mongo/collection/view/immutable.rb +43 -0
- data/lib/mongo/collection/view/iterable.rb +48 -0
- data/lib/mongo/collection/view/map_reduce.rb +191 -0
- data/lib/mongo/collection/view/readable.rb +363 -0
- data/lib/mongo/collection/view/writable.rb +185 -0
- data/lib/mongo/collection/view.rb +169 -0
- data/lib/mongo/collection.rb +130 -1101
- data/lib/mongo/cursor.rb +78 -681
- data/lib/mongo/database/view.rb +101 -0
- data/lib/mongo/database.rb +224 -0
- data/lib/mongo/error/bulk_write_error.rb +41 -0
- data/lib/mongo/error/invalid_bulk_operation.rb +36 -0
- data/lib/mongo/error/invalid_bulk_operation_type.rb +36 -0
- data/lib/mongo/error/invalid_collection_name.rb +39 -0
- data/lib/mongo/error/invalid_database_name.rb +39 -0
- data/{test/replica_set/ssl_test.rb → lib/mongo/error/invalid_document.rb} +21 -14
- data/lib/mongo/error/invalid_file.rb +38 -0
- data/lib/mongo/error/invalid_nonce.rb +46 -0
- data/lib/mongo/error/invalid_replacement_document.rb +39 -0
- data/lib/mongo/error/invalid_signature.rb +47 -0
- data/{test/functional/ssl_test.rb → lib/mongo/error/invalid_update_document.rb} +22 -12
- data/lib/mongo/error/max_bson_size.rb +40 -0
- data/lib/mongo/error/max_message_size.rb +42 -0
- data/{test/functional/db_connection_test.rb → lib/mongo/error/multi_index_drop.rb} +17 -8
- data/lib/mongo/{utils.rb → error/need_primary_server.rb} +10 -6
- data/lib/mongo/{connection.rb → error/operation_failure.rb} +10 -6
- data/lib/mongo/error/parser.rb +77 -0
- data/lib/mongo/{connection/socket.rb → error/socket_error.rb} +10 -5
- data/lib/mongo/error/socket_timeout_error.rb +23 -0
- data/lib/mongo/error/unsupported_features.rb +43 -0
- data/lib/mongo/error.rb +82 -0
- data/lib/mongo/event/listeners.rb +63 -0
- data/lib/mongo/event/primary_elected.rb +53 -0
- data/lib/mongo/event/publisher.rb +42 -0
- data/lib/mongo/event/server_added.rb +53 -0
- data/lib/mongo/event/server_removed.rb +53 -0
- data/lib/mongo/event/subscriber.rb +41 -0
- data/lib/mongo/event.rb +40 -0
- data/lib/mongo/grid/file/chunk.rb +184 -0
- data/lib/mongo/grid/file/metadata.rb +229 -0
- data/lib/mongo/grid/file.rb +106 -0
- data/lib/mongo/grid/fs.rb +149 -0
- data/lib/mongo/{gridfs.rb → grid.rb} +3 -5
- data/lib/mongo/index/view.rb +261 -0
- data/lib/mongo/index.rb +64 -0
- data/lib/mongo/loggable.rb +126 -0
- data/lib/mongo/logger.rb +132 -0
- data/lib/mongo/operation/aggregate/result.rb +88 -0
- data/lib/mongo/operation/aggregate.rb +100 -0
- data/lib/mongo/operation/command.rb +62 -0
- data/lib/mongo/operation/executable.rb +105 -0
- data/lib/mongo/operation/kill_cursors.rb +39 -0
- data/lib/mongo/operation/limited.rb +37 -0
- data/lib/mongo/operation/list_collections/result.rb +114 -0
- data/lib/mongo/operation/list_indexes/result.rb +118 -0
- data/lib/mongo/operation/map_reduce/result.rb +122 -0
- data/lib/mongo/operation/map_reduce.rb +96 -0
- data/lib/mongo/operation/read/collections_info.rb +67 -0
- data/lib/mongo/operation/read/get_more.rb +71 -0
- data/lib/mongo/operation/read/indexes.rb +68 -0
- data/lib/mongo/operation/read/list_collections.rb +75 -0
- data/lib/mongo/operation/read/list_indexes.rb +77 -0
- data/lib/mongo/operation/read/query.rb +71 -0
- data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
- data/lib/mongo/operation/read_preferrable.rb +34 -0
- data/lib/mongo/operation/result.rb +259 -0
- data/lib/mongo/operation/specifiable.rb +397 -0
- data/lib/mongo/operation/write/bulk/bulk_delete/result.rb +75 -0
- data/lib/mongo/operation/write/bulk/bulk_delete.rb +144 -0
- data/lib/mongo/operation/write/bulk/bulk_insert/result.rb +68 -0
- data/lib/mongo/operation/write/bulk/bulk_insert.rb +129 -0
- data/lib/mongo/operation/write/bulk/bulk_mergable.rb +67 -0
- data/lib/mongo/operation/write/bulk/bulk_update/result.rb +162 -0
- data/lib/mongo/operation/write/bulk/bulk_update.rb +153 -0
- data/lib/mongo/operation/write/bulk/legacy_bulk_mergable.rb +83 -0
- data/lib/mongo/operation/write/bulk.rb +17 -0
- data/lib/mongo/operation/write/command/create_index.rb +50 -0
- data/lib/mongo/operation/write/command/create_user.rb +43 -0
- data/lib/mongo/operation/write/command/delete.rb +56 -0
- data/lib/mongo/operation/write/command/drop_index.rb +51 -0
- data/lib/mongo/operation/write/command/insert.rb +55 -0
- data/lib/mongo/operation/write/command/remove_user.rb +42 -0
- data/lib/mongo/operation/write/command/update.rb +60 -0
- data/lib/mongo/operation/write/command/writable.rb +61 -0
- data/lib/mongo/operation/write/command.rb +22 -0
- data/lib/mongo/operation/write/create_index.rb +89 -0
- data/lib/mongo/operation/write/create_user.rb +75 -0
- data/lib/mongo/operation/write/delete/result.rb +40 -0
- data/lib/mongo/operation/write/delete.rb +93 -0
- data/lib/mongo/operation/write/drop_index.rb +62 -0
- data/lib/mongo/{utils/thread_local_variable_manager.rb → operation/write/insert/result.rb} +15 -8
- data/lib/mongo/operation/write/insert.rb +90 -0
- data/lib/mongo/operation/write/remove_user.rb +70 -0
- data/lib/mongo/operation/write/update/result.rb +160 -0
- data/lib/mongo/operation/write/update.rb +103 -0
- data/lib/mongo/{connection/socket/socket_util.rb → operation/write.rb} +10 -24
- data/lib/mongo/operation.rb +25 -0
- data/lib/mongo/options/mapper.rb +78 -0
- data/lib/mongo/options.rb +15 -0
- data/lib/mongo/protocol/bit_vector.rb +61 -0
- data/lib/mongo/protocol/delete.rb +94 -0
- data/lib/mongo/protocol/get_more.rb +99 -0
- data/lib/mongo/protocol/insert.rb +99 -0
- data/lib/mongo/protocol/kill_cursors.rb +74 -0
- data/lib/mongo/protocol/message.rb +252 -0
- data/lib/mongo/protocol/query.rb +147 -0
- data/lib/mongo/protocol/reply.rb +72 -0
- data/lib/mongo/protocol/serializers.rb +180 -0
- data/lib/mongo/protocol/update.rb +111 -0
- data/lib/mongo/protocol.rb +15 -0
- data/lib/mongo/server/connectable.rb +110 -0
- data/lib/mongo/server/connection.rb +134 -0
- data/lib/mongo/server/connection_pool/queue.rb +182 -0
- data/lib/mongo/server/connection_pool.rb +141 -0
- data/lib/mongo/server/context.rb +66 -0
- data/lib/mongo/server/description/features.rb +85 -0
- data/lib/mongo/server/description/inspector/primary_elected.rb +58 -0
- data/lib/mongo/server/description/inspector/server_added.rb +59 -0
- data/lib/mongo/server/description/inspector/server_removed.rb +59 -0
- data/lib/mongo/server/description/inspector.rb +79 -0
- data/lib/mongo/server/description.rb +450 -0
- data/lib/mongo/server/monitor/connection.rb +89 -0
- data/lib/mongo/server/monitor.rb +176 -0
- data/lib/mongo/server.rb +163 -0
- data/lib/mongo/server_selector/nearest.rb +94 -0
- data/lib/mongo/server_selector/primary.rb +88 -0
- data/lib/mongo/server_selector/primary_preferred.rb +94 -0
- data/lib/mongo/server_selector/secondary.rb +91 -0
- data/lib/mongo/server_selector/secondary_preferred.rb +96 -0
- data/lib/mongo/server_selector/selectable.rb +209 -0
- data/lib/mongo/server_selector.rb +81 -0
- data/lib/mongo/socket/ssl.rb +130 -0
- data/lib/mongo/socket/tcp.rb +69 -0
- data/lib/mongo/socket/unix.rb +64 -0
- data/lib/mongo/socket.rb +179 -0
- data/lib/mongo/uri.rb +504 -0
- data/lib/mongo/version.rb +21 -0
- data/lib/mongo/write_concern/acknowledged.rb +52 -0
- data/lib/mongo/write_concern/normalizable.rb +51 -0
- data/lib/mongo/write_concern/unacknowledged.rb +55 -0
- data/lib/mongo/write_concern.rb +99 -0
- data/lib/mongo.rb +24 -82
- data/mongo.gemspec +17 -14
- data/spec/certificates/ca.pem +17 -0
- data/spec/certificates/client.pem +101 -0
- data/spec/certificates/crl.pem +10 -0
- data/spec/certificates/crl_client_revoked.pem +12 -0
- data/spec/certificates/password_protected.pem +51 -0
- data/spec/certificates/server.pem +34 -0
- data/spec/mongo/address/ipv4_spec.rb +74 -0
- data/spec/mongo/address/ipv6_spec.rb +74 -0
- data/spec/mongo/address/unix_spec.rb +30 -0
- data/spec/mongo/address_spec.rb +206 -0
- data/spec/mongo/auth/cr_spec.rb +59 -0
- data/spec/mongo/auth/ldap_spec.rb +40 -0
- data/spec/mongo/auth/scram/conversation_spec.rb +197 -0
- data/spec/mongo/auth/scram_spec.rb +55 -0
- data/spec/mongo/auth/user/view_spec.rb +76 -0
- data/spec/mongo/auth/user_spec.rb +190 -0
- data/spec/mongo/auth/x509_spec.rb +40 -0
- data/spec/mongo/auth_spec.rb +65 -0
- data/spec/mongo/bulk/bulk_write_spec.rb +262 -0
- data/spec/mongo/client_spec.rb +564 -0
- data/spec/mongo/cluster/topology/replica_set_spec.rb +101 -0
- data/spec/mongo/cluster/topology/sharded_spec.rb +74 -0
- data/spec/mongo/cluster/topology/standalone_spec.rb +79 -0
- data/spec/mongo/cluster/topology_spec.rb +65 -0
- data/spec/mongo/cluster_spec.rb +129 -0
- data/spec/mongo/collection/view/aggregation_spec.rb +148 -0
- data/spec/mongo/collection/view/explainable_spec.rb +32 -0
- data/spec/mongo/collection/view/map_reduce_spec.rb +242 -0
- data/spec/mongo/collection/view/readable_spec.rb +603 -0
- data/spec/mongo/collection/view/writable_spec.rb +679 -0
- data/spec/mongo/collection/view_spec.rb +530 -0
- data/spec/mongo/collection_spec.rb +362 -0
- data/spec/mongo/crud_spec.rb +42 -0
- data/spec/mongo/cursor_spec.rb +295 -0
- data/spec/mongo/database_spec.rb +302 -0
- data/spec/mongo/error/parser_spec.rb +119 -0
- data/spec/mongo/event/publisher_spec.rb +50 -0
- data/spec/mongo/event/subscriber_spec.rb +34 -0
- data/spec/mongo/grid/file/chunk_spec.rb +226 -0
- data/spec/mongo/grid/file/metadata_spec.rb +92 -0
- data/spec/mongo/grid/file_spec.rb +172 -0
- data/spec/mongo/grid/fs_spec.rb +129 -0
- data/spec/mongo/index/view_spec.rb +330 -0
- data/spec/mongo/loggable_spec.rb +62 -0
- data/spec/mongo/logger_spec.rb +97 -0
- data/spec/mongo/operation/aggregate/result_spec.rb +80 -0
- data/spec/mongo/operation/aggregate_spec.rb +127 -0
- data/spec/mongo/operation/command_spec.rb +98 -0
- data/spec/mongo/operation/kill_cursors_spec.rb +66 -0
- data/spec/mongo/operation/limited_spec.rb +50 -0
- data/spec/mongo/operation/map_reduce_spec.rb +143 -0
- data/spec/mongo/operation/read/collections_info_spec.rb +40 -0
- data/spec/mongo/operation/read/get_more_spec.rb +81 -0
- data/spec/mongo/operation/read/indexes_spec.rb +31 -0
- data/spec/mongo/operation/read/query_spec.rb +84 -0
- data/spec/mongo/operation/result_spec.rb +275 -0
- data/spec/mongo/operation/specifiable_spec.rb +53 -0
- data/spec/mongo/operation/write/bulk_delete_spec.rb +235 -0
- data/spec/mongo/operation/write/bulk_insert_spec.rb +235 -0
- data/spec/mongo/operation/write/bulk_update_spec.rb +236 -0
- data/spec/mongo/operation/write/command/delete_spec.rb +103 -0
- data/spec/mongo/operation/write/command/insert_spec.rb +103 -0
- data/spec/mongo/operation/write/command/update_spec.rb +109 -0
- data/spec/mongo/operation/write/create_index_spec.rb +63 -0
- data/spec/mongo/operation/write/create_user_spec.rb +44 -0
- data/spec/mongo/operation/write/delete_spec.rb +186 -0
- data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
- data/spec/mongo/operation/write/insert_spec.rb +244 -0
- data/spec/mongo/operation/write/remove_user_spec.rb +46 -0
- data/spec/mongo/operation/write/response_spec.rb +85 -0
- data/spec/mongo/operation/write/update_spec.rb +228 -0
- data/spec/mongo/protocol/delete_spec.rb +167 -0
- data/spec/mongo/protocol/get_more_spec.rb +146 -0
- data/spec/mongo/protocol/insert_spec.rb +161 -0
- data/spec/mongo/protocol/kill_cursors_spec.rb +101 -0
- data/spec/mongo/protocol/query_spec.rb +285 -0
- data/spec/mongo/protocol/reply_spec.rb +157 -0
- data/spec/mongo/protocol/update_spec.rb +186 -0
- data/spec/mongo/server/connection_pool/queue_spec.rb +170 -0
- data/spec/mongo/server/connection_pool_spec.rb +120 -0
- data/spec/mongo/server/connection_spec.rb +312 -0
- data/spec/mongo/server/description/features_spec.rb +138 -0
- data/spec/mongo/server/description/inspector/primary_elected_spec.rb +94 -0
- data/spec/mongo/server/description/inspector/server_added_spec.rb +92 -0
- data/spec/mongo/server/description/inspector/server_removed_spec.rb +95 -0
- data/spec/mongo/server/description_spec.rb +510 -0
- data/spec/mongo/server/monitor_spec.rb +144 -0
- data/spec/mongo/server_discovery_and_monitoring_spec.rb +103 -0
- data/spec/mongo/server_selection_rtt_spec.rb +104 -0
- data/spec/mongo/server_selection_spec.rb +89 -0
- data/spec/mongo/server_selector/nearest_spec.rb +250 -0
- data/spec/mongo/server_selector/primary_preferred_spec.rb +290 -0
- data/spec/mongo/server_selector/primary_spec.rb +114 -0
- data/spec/mongo/server_selector/secondary_preferred_spec.rb +252 -0
- data/spec/mongo/server_selector/secondary_spec.rb +196 -0
- data/spec/mongo/server_selector_spec.rb +101 -0
- data/spec/mongo/server_spec.rb +131 -0
- data/spec/mongo/uri_spec.rb +517 -0
- data/spec/mongo/write_concern/acknowledged_spec.rb +44 -0
- data/spec/mongo/write_concern/unacknowledged_spec.rb +15 -0
- data/spec/spec_helper.rb +133 -0
- data/spec/support/authorization.rb +247 -0
- data/spec/support/crud/read.rb +144 -0
- data/spec/support/crud/write.rb +214 -0
- data/spec/support/crud.rb +203 -0
- data/spec/support/crud_tests/read/aggregate.yml +43 -0
- data/spec/support/crud_tests/read/count.yml +37 -0
- data/spec/support/crud_tests/read/distinct.yml +33 -0
- data/spec/support/crud_tests/read/find.yml +50 -0
- data/spec/support/crud_tests/write/deleteMany.yml +36 -0
- data/spec/support/crud_tests/write/deleteOne.yml +49 -0
- data/spec/support/crud_tests/write/findOneAndDelete.yml +54 -0
- data/spec/support/crud_tests/write/findOneAndReplace.yml +153 -0
- data/spec/support/crud_tests/write/findOneAndUpdate.yml +161 -0
- data/spec/support/crud_tests/write/insertMany.yml +24 -0
- data/spec/support/crud_tests/write/insertOne.yml +19 -0
- data/spec/support/crud_tests/write/replaceOne.yml +96 -0
- data/spec/support/crud_tests/write/updateMany.yml +83 -0
- data/spec/support/crud_tests/write/updateOne.yml +80 -0
- data/spec/support/helpers.rb +140 -0
- data/spec/support/matchers.rb +37 -0
- data/spec/support/sdam/rs/discover_arbiters.yml +41 -0
- data/spec/support/sdam/rs/discover_passives.yml +41 -0
- data/spec/support/sdam/rs/discover_primary.yml +40 -0
- data/spec/support/sdam/rs/discover_secondary.yml +41 -0
- data/spec/support/sdam/rs/discovery.yml +195 -0
- data/spec/support/sdam/rs/ghost_discovered.yml +39 -0
- data/spec/support/sdam/rs/hosts_differ_from_seeds.yml +34 -0
- data/spec/support/sdam/rs/member_reconfig.yml +68 -0
- data/spec/support/sdam/rs/member_standalone.yml +60 -0
- data/spec/support/sdam/rs/new_primary.yml +74 -0
- data/spec/support/sdam/rs/new_primary_wrong_set_name.yml +71 -0
- data/spec/support/sdam/rs/non_rs_member.yml +31 -0
- data/spec/support/sdam/rs/normalize_case.yml +49 -0
- data/spec/support/sdam/rs/primary_becomes_standalone.yml +52 -0
- data/spec/support/sdam/rs/primary_changes_set_name.yml +57 -0
- data/spec/support/sdam/rs/primary_disconnect.yml +56 -0
- data/spec/support/sdam/rs/primary_wrong_set_name.yml +27 -0
- data/spec/support/sdam/rs/response_from_removed.yml +63 -0
- data/spec/support/sdam/rs/rsother_discovered.yml +41 -0
- data/spec/support/sdam/rs/sec_not_auth.yml +49 -0
- data/spec/support/sdam/rs/secondary_wrong_set_name.yml +28 -0
- data/spec/support/sdam/rs/secondary_wrong_set_name_with_primary.yml +69 -0
- data/spec/support/sdam/rs/unexpected_mongos.yml +26 -0
- data/spec/support/sdam/rs/wrong_set_name.yml +35 -0
- data/spec/support/sdam/sharded/multiple_mongoses.yml +46 -0
- data/spec/support/sdam/sharded/non_mongos_removed.yml +41 -0
- data/spec/support/sdam/sharded/normalize_uri_case.yml +32 -0
- data/spec/support/sdam/single/direct_connection_external_ip.yml +34 -0
- data/spec/support/sdam/single/direct_connection_mongos.yml +33 -0
- data/spec/support/sdam/single/direct_connection_rsarbiter.yml +35 -0
- data/spec/support/sdam/single/direct_connection_rsprimary.yml +34 -0
- data/spec/support/sdam/single/direct_connection_rssecondary.yml +35 -0
- data/spec/support/sdam/single/direct_connection_slave.yml +32 -0
- data/spec/support/sdam/single/direct_connection_standalone.yml +32 -0
- data/spec/support/sdam/single/not_ok_response.yml +39 -0
- data/spec/support/sdam/single/standalone_removed.yml +32 -0
- data/spec/support/sdam/single/unavailable_seed.yml +28 -0
- data/spec/support/server_discovery_and_monitoring.rb +167 -0
- data/spec/support/server_selection/rtt/first_value.yml +4 -0
- data/spec/support/server_selection/rtt/first_value_zero.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_1.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_2.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_3.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_4.yml +4 -0
- data/spec/support/server_selection/rtt/value_test_5.yml +4 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +21 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +33 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +26 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary.yml +31 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred.yml +31 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/SecondaryPreferred_non_matching.yml +29 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Secondary_non_matching.yml +26 -0
- data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +26 -0
- data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +19 -0
- data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +11 -0
- data/spec/support/server_selection.rb +157 -0
- data/spec/support/server_selection_rtt.rb +41 -0
- data/spec/support/shared/bulk_write.rb +535 -0
- data/spec/support/shared/cursor.rb +38 -0
- data/spec/support/shared/operation.rb +77 -0
- data/spec/support/shared/protocol.rb +31 -0
- data/spec/support/shared/server_selector.rb +111 -0
- data/spec/support/shared/socket.rb +82 -0
- data/spec/support/travis.rb +14 -0
- data.tar.gz.sig +2 -3
- metadata +583 -186
- metadata.gz.sig +0 -0
- data/VERSION +0 -1
- data/lib/mongo/bulk_write_collection_view.rb +0 -387
- data/lib/mongo/collection_writer.rb +0 -364
- data/lib/mongo/connection/node.rb +0 -249
- data/lib/mongo/connection/pool.rb +0 -340
- data/lib/mongo/connection/pool_manager.rb +0 -320
- data/lib/mongo/connection/sharding_pool_manager.rb +0 -67
- data/lib/mongo/connection/socket/ssl_socket.rb +0 -95
- data/lib/mongo/connection/socket/tcp_socket.rb +0 -87
- data/lib/mongo/connection/socket/unix_socket.rb +0 -39
- data/lib/mongo/db.rb +0 -808
- data/lib/mongo/exception.rb +0 -145
- data/lib/mongo/functional/authentication.rb +0 -455
- data/lib/mongo/functional/logging.rb +0 -85
- data/lib/mongo/functional/read_preference.rb +0 -183
- data/lib/mongo/functional/scram.rb +0 -556
- data/lib/mongo/functional/uri_parser.rb +0 -409
- data/lib/mongo/functional/write_concern.rb +0 -66
- data/lib/mongo/gridfs/grid.rb +0 -112
- data/lib/mongo/gridfs/grid_ext.rb +0 -53
- data/lib/mongo/gridfs/grid_file_system.rb +0 -163
- data/lib/mongo/gridfs/grid_io.rb +0 -484
- data/lib/mongo/legacy.rb +0 -140
- data/lib/mongo/mongo_client.rb +0 -697
- data/lib/mongo/mongo_replica_set_client.rb +0 -535
- data/lib/mongo/mongo_sharded_client.rb +0 -159
- data/lib/mongo/networking.rb +0 -372
- data/lib/mongo/utils/conversions.rb +0 -110
- data/lib/mongo/utils/core_ext.rb +0 -70
- data/lib/mongo/utils/server_version.rb +0 -69
- data/lib/mongo/utils/support.rb +0 -80
- data/test/functional/authentication_test.rb +0 -39
- data/test/functional/bulk_api_stress_test.rb +0 -133
- data/test/functional/bulk_write_collection_view_test.rb +0 -1198
- data/test/functional/client_test.rb +0 -627
- data/test/functional/collection_test.rb +0 -2175
- data/test/functional/collection_writer_test.rb +0 -83
- data/test/functional/conversions_test.rb +0 -163
- data/test/functional/cursor_fail_test.rb +0 -57
- data/test/functional/cursor_message_test.rb +0 -56
- data/test/functional/cursor_test.rb +0 -683
- data/test/functional/db_api_test.rb +0 -835
- data/test/functional/db_test.rb +0 -348
- data/test/functional/grid_file_system_test.rb +0 -285
- data/test/functional/grid_io_test.rb +0 -252
- data/test/functional/grid_test.rb +0 -273
- data/test/functional/pool_test.rb +0 -136
- data/test/functional/safe_test.rb +0 -98
- data/test/functional/support_test.rb +0 -62
- data/test/functional/timeout_test.rb +0 -60
- data/test/functional/uri_test.rb +0 -446
- data/test/functional/write_concern_test.rb +0 -118
- data/test/helpers/general.rb +0 -50
- data/test/helpers/test_unit.rb +0 -476
- data/test/replica_set/authentication_test.rb +0 -37
- data/test/replica_set/basic_test.rb +0 -189
- data/test/replica_set/client_test.rb +0 -393
- data/test/replica_set/connection_test.rb +0 -138
- data/test/replica_set/count_test.rb +0 -66
- data/test/replica_set/cursor_test.rb +0 -220
- data/test/replica_set/insert_test.rb +0 -157
- data/test/replica_set/max_values_test.rb +0 -151
- data/test/replica_set/pinning_test.rb +0 -105
- data/test/replica_set/query_test.rb +0 -73
- data/test/replica_set/read_preference_test.rb +0 -219
- data/test/replica_set/refresh_test.rb +0 -211
- data/test/replica_set/replication_ack_test.rb +0 -95
- data/test/sharded_cluster/basic_test.rb +0 -203
- data/test/shared/authentication/basic_auth_shared.rb +0 -260
- data/test/shared/authentication/bulk_api_auth_shared.rb +0 -249
- data/test/shared/authentication/gssapi_shared.rb +0 -176
- data/test/shared/authentication/sasl_plain_shared.rb +0 -96
- data/test/shared/authentication/scram_shared.rb +0 -92
- data/test/shared/ssl_shared.rb +0 -235
- data/test/test_helper.rb +0 -61
- data/test/threading/basic_test.rb +0 -120
- data/test/tools/mongo_config.rb +0 -708
- data/test/tools/mongo_config_test.rb +0 -160
- data/test/unit/client_test.rb +0 -381
- data/test/unit/collection_test.rb +0 -166
- data/test/unit/connection_test.rb +0 -335
- data/test/unit/cursor_test.rb +0 -307
- data/test/unit/db_test.rb +0 -136
- data/test/unit/grid_test.rb +0 -76
- data/test/unit/mongo_sharded_client_test.rb +0 -48
- data/test/unit/node_test.rb +0 -93
- data/test/unit/pool_manager_test.rb +0 -111
- data/test/unit/read_pref_test.rb +0 -406
- data/test/unit/read_test.rb +0 -159
- data/test/unit/safe_test.rb +0 -158
- data/test/unit/sharding_pool_manager_test.rb +0 -84
- data/test/unit/write_concern_test.rb +0 -175
@@ -0,0 +1,134 @@
|
|
1
|
+
# Copyright (C) 2014-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 Server
|
17
|
+
|
18
|
+
# This class models the socket connections for servers and their behavior.
|
19
|
+
#
|
20
|
+
# @since 2.0.0
|
21
|
+
class Connection
|
22
|
+
include Connectable
|
23
|
+
extend Forwardable
|
24
|
+
|
25
|
+
# @return [ Mongo::Auth::CR, Mongo::Auth::X509, Mongo::Auth:LDAP ]
|
26
|
+
# authenticator The authentication strategy.
|
27
|
+
attr_reader :authenticator
|
28
|
+
|
29
|
+
def_delegators :@server,
|
30
|
+
:features,
|
31
|
+
:max_bson_object_size,
|
32
|
+
:max_message_size,
|
33
|
+
:mongos?
|
34
|
+
|
35
|
+
# Is this connection authenticated. Will return true if authorization
|
36
|
+
# details were provided and authentication passed.
|
37
|
+
#
|
38
|
+
# @example Is the connection authenticated?
|
39
|
+
# connection.authenticated?
|
40
|
+
#
|
41
|
+
# @return [ true, false ] If the connection is authenticated.
|
42
|
+
#
|
43
|
+
# @since 2.0.0
|
44
|
+
def authenticated?
|
45
|
+
!!@authenticated
|
46
|
+
end
|
47
|
+
|
48
|
+
# Tell the underlying socket to establish a connection to the host.
|
49
|
+
#
|
50
|
+
# @example Connect to the host.
|
51
|
+
# connection.connect!
|
52
|
+
#
|
53
|
+
# @note This method mutates the connection class by setting a socket if
|
54
|
+
# one previously did not exist.
|
55
|
+
#
|
56
|
+
# @return [ true ] If the connection succeeded.
|
57
|
+
#
|
58
|
+
# @since 2.0.0
|
59
|
+
def connect!
|
60
|
+
unless socket
|
61
|
+
@socket = address.socket(timeout, ssl_options)
|
62
|
+
@socket.connect!
|
63
|
+
if authenticator
|
64
|
+
authenticator.login(self)
|
65
|
+
@authenticated = true
|
66
|
+
end
|
67
|
+
end
|
68
|
+
true
|
69
|
+
end
|
70
|
+
|
71
|
+
# Disconnect the connection.
|
72
|
+
#
|
73
|
+
# @example Disconnect from the host.
|
74
|
+
# connection.disconnect!
|
75
|
+
#
|
76
|
+
# @note This method mutates the connection by setting the socket to nil
|
77
|
+
# if the closing succeeded.
|
78
|
+
#
|
79
|
+
# @return [ true ] If the disconnect succeeded.
|
80
|
+
#
|
81
|
+
# @since 2.0.0
|
82
|
+
def disconnect!
|
83
|
+
if socket
|
84
|
+
socket.close
|
85
|
+
@socket = nil
|
86
|
+
@authenticated = false
|
87
|
+
end
|
88
|
+
true
|
89
|
+
end
|
90
|
+
|
91
|
+
# Initialize a new socket connection from the client to the server.
|
92
|
+
#
|
93
|
+
# @example Create the connection.
|
94
|
+
# Connection.new(server)
|
95
|
+
#
|
96
|
+
# @param [ Mongo::Server ] server The server the connection is for.
|
97
|
+
# @param [ Hash ] options The connection options.
|
98
|
+
#
|
99
|
+
# @since 2.0.0
|
100
|
+
def initialize(server, options = {})
|
101
|
+
@address = server.address
|
102
|
+
@options = options.freeze
|
103
|
+
@server = server
|
104
|
+
@ssl_options = options.reject { |k, v| !k.to_s.start_with?('ssl') }
|
105
|
+
@socket = nil
|
106
|
+
@pid = Process.pid
|
107
|
+
setup_authentication!
|
108
|
+
end
|
109
|
+
|
110
|
+
private
|
111
|
+
|
112
|
+
def setup_authentication!
|
113
|
+
if options[:user]
|
114
|
+
default_mechanism = @server.features.scram_sha_1_enabled? ? :scram : :mongodb_cr
|
115
|
+
user = Auth::User.new({ :auth_mech => default_mechanism }.merge(options))
|
116
|
+
@authenticator = Auth.get(user)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
def write(messages, buffer = '')
|
121
|
+
start_size = 0
|
122
|
+
messages.each do |message|
|
123
|
+
message.serialize(buffer, max_bson_object_size)
|
124
|
+
if max_message_size &&
|
125
|
+
(buffer.size - start_size) > max_message_size
|
126
|
+
raise Error::MaxMessageSize.new(max_message_size)
|
127
|
+
start_size = buffer.size
|
128
|
+
end
|
129
|
+
end
|
130
|
+
ensure_connected{ |socket| socket.write(buffer) }
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
# Copyright (C) 2014-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 Server
|
17
|
+
class ConnectionPool
|
18
|
+
|
19
|
+
# A FIFO queue of connections to be used by the connection pool. This is
|
20
|
+
# based on mperham's connection pool, implemented with a queue instead of a
|
21
|
+
# stack.
|
22
|
+
#
|
23
|
+
# @since 2.0.0
|
24
|
+
class Queue
|
25
|
+
extend Forwardable
|
26
|
+
|
27
|
+
# Size of the queue delegates to the wrapped queue.
|
28
|
+
def_delegators :queue, :size
|
29
|
+
|
30
|
+
# The default max size for the queue.
|
31
|
+
MAX_SIZE = 5.freeze
|
32
|
+
|
33
|
+
# The default min size for the queue.
|
34
|
+
MIN_SIZE = 1.freeze
|
35
|
+
|
36
|
+
# The default timeout, in seconds, to wait for a connection.
|
37
|
+
WAIT_TIMEOUT = 1.freeze
|
38
|
+
|
39
|
+
# @return [ Array ] queue The underlying array of connections.
|
40
|
+
attr_reader :queue
|
41
|
+
|
42
|
+
# @return [ Mutex ] mutex The mutex used for synchronization.
|
43
|
+
attr_reader :mutex
|
44
|
+
|
45
|
+
# @return [ Hash ] options The options.
|
46
|
+
attr_reader :options
|
47
|
+
|
48
|
+
# @return [ ConditionVariable ] resource The resource.
|
49
|
+
attr_reader :resource
|
50
|
+
|
51
|
+
# Dequeue a connection from the queue, waiting for the provided timeout
|
52
|
+
# for an item if none is in the queue.
|
53
|
+
#
|
54
|
+
# @example Dequeue a connection.
|
55
|
+
# queue.dequeue
|
56
|
+
#
|
57
|
+
# @return [ Mongo::Pool::Connection ] The next connection.
|
58
|
+
#
|
59
|
+
# @since 2.0.0
|
60
|
+
def dequeue
|
61
|
+
mutex.synchronize do
|
62
|
+
dequeue_connection
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Enqueue a connection in the queue.
|
67
|
+
#
|
68
|
+
# @example Enqueue a connection.
|
69
|
+
# queue.enqueue(connection)
|
70
|
+
#
|
71
|
+
# @param [ Mongo::Pool::Connection ] connection The connection.
|
72
|
+
#
|
73
|
+
# @since 2.0.0
|
74
|
+
def enqueue(connection)
|
75
|
+
mutex.synchronize do
|
76
|
+
queue.push(connection)
|
77
|
+
resource.broadcast
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# Initialize the new queue. Will yield the block the number of times for
|
82
|
+
# the initial size of the queue.
|
83
|
+
#
|
84
|
+
# @example Create the queue.
|
85
|
+
# Mongo::Pool::Queue.new(max_pool_size: 5) { Connection.new }
|
86
|
+
#
|
87
|
+
# @param [ Hash ] options The options.
|
88
|
+
#
|
89
|
+
# @option options [ Integer ] :max_pool_size The maximum size.
|
90
|
+
# @option options [ Integer ] :min_pool_size The minimum size.
|
91
|
+
# @option options [ Float ] :wait_queue_timeout The time to wait, in
|
92
|
+
# seconds, for a free connection.
|
93
|
+
#
|
94
|
+
# @since 2.0.0
|
95
|
+
def initialize(options = {}, &block)
|
96
|
+
@block = block
|
97
|
+
@connections = 0
|
98
|
+
@options = options
|
99
|
+
@queue = Array.new(min_size, create_connection)
|
100
|
+
@mutex = Mutex.new
|
101
|
+
@resource = ConditionVariable.new
|
102
|
+
end
|
103
|
+
|
104
|
+
# Get a pretty printed string inspection for the queue.
|
105
|
+
#
|
106
|
+
# @example Inspect the queue.
|
107
|
+
# queue.inspect
|
108
|
+
#
|
109
|
+
# @return [ String ] The queue inspection.
|
110
|
+
#
|
111
|
+
# @since 2.0.0
|
112
|
+
def inspect
|
113
|
+
"#<Mongo::Pool::Queue:0x#{object_id} min_size=#{min_size} max_size=#{max_size} " +
|
114
|
+
"wait_timeout=#{wait_timeout} current_size=#{queue.size}>"
|
115
|
+
end
|
116
|
+
|
117
|
+
# Get the maximum size of the queue.
|
118
|
+
#
|
119
|
+
# @example Get the max size.
|
120
|
+
# queue.max_size
|
121
|
+
#
|
122
|
+
# @return [ Integer ] The maximum size of the queue.
|
123
|
+
#
|
124
|
+
# @since 2.0.0
|
125
|
+
def max_size
|
126
|
+
@max_size ||= options[:max_pool_size] || MAX_SIZE
|
127
|
+
end
|
128
|
+
|
129
|
+
# Get the minimum size of the queue.
|
130
|
+
#
|
131
|
+
# @example Get the min size.
|
132
|
+
# queue.min_size
|
133
|
+
#
|
134
|
+
# @return [ Integer ] The minimum size of the queue.
|
135
|
+
#
|
136
|
+
# @since 2.0.0
|
137
|
+
def min_size
|
138
|
+
@min_size ||= options[:min_pool_size] || MIN_SIZE
|
139
|
+
end
|
140
|
+
|
141
|
+
# The time to wait, in seconds, for a connection to become available.
|
142
|
+
#
|
143
|
+
# @example Get the wait timeout.
|
144
|
+
# queue.wait_timeout
|
145
|
+
#
|
146
|
+
# @return [ Float ] The queue wait timeout.
|
147
|
+
#
|
148
|
+
# @since 2.0.0
|
149
|
+
def wait_timeout
|
150
|
+
@wait_timeout ||= options[:wait_queue_timeout] || WAIT_TIMEOUT
|
151
|
+
end
|
152
|
+
|
153
|
+
private
|
154
|
+
|
155
|
+
def dequeue_connection
|
156
|
+
deadline = Time.now + wait_timeout
|
157
|
+
loop do
|
158
|
+
return queue.delete_at(0) unless queue.empty?
|
159
|
+
connection = create_connection
|
160
|
+
return connection if connection
|
161
|
+
wait_for_next!(deadline)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
def create_connection
|
166
|
+
if @connections < max_size
|
167
|
+
@connections += 1
|
168
|
+
@block.call
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
def wait_for_next!(deadline)
|
173
|
+
wait = deadline - Time.now
|
174
|
+
if wait <= 0
|
175
|
+
raise Timeout::Error.new("Timed out attempting to dequeue connection after #{wait_timeout} sec.")
|
176
|
+
end
|
177
|
+
resource.wait(mutex, wait)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
# Copyright (C) 2014-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
|
+
require 'mongo/server/connection_pool/queue'
|
16
|
+
|
17
|
+
module Mongo
|
18
|
+
class Server
|
19
|
+
|
20
|
+
# Represents a connection pool for server connections.
|
21
|
+
#
|
22
|
+
# @since 2.0.0
|
23
|
+
class ConnectionPool
|
24
|
+
include Loggable
|
25
|
+
|
26
|
+
# Used for synchronization of pools access.
|
27
|
+
MUTEX = Mutex.new
|
28
|
+
|
29
|
+
# @return [ Hash ] options The pool options.
|
30
|
+
attr_reader :options
|
31
|
+
|
32
|
+
# Check a connection back into the pool. Will pull the connection from a
|
33
|
+
# thread local stack that should contain it after it was checked out.
|
34
|
+
#
|
35
|
+
# @example Checkin the thread's connection to the pool.
|
36
|
+
# pool.checkin
|
37
|
+
#
|
38
|
+
# @since 2.0.0
|
39
|
+
def checkin(connection)
|
40
|
+
queue.enqueue(connection)
|
41
|
+
end
|
42
|
+
|
43
|
+
# Check a connection out from the pool. If a connection exists on the same
|
44
|
+
# thread it will get that connection, otherwise it will dequeue a
|
45
|
+
# connection from the queue and pin it to this thread.
|
46
|
+
#
|
47
|
+
# @example Check a connection out from the pool.
|
48
|
+
# pool.checkout
|
49
|
+
#
|
50
|
+
# @return [ Mongo::Pool::Connection ] The checked out connection.
|
51
|
+
#
|
52
|
+
# @since 2.0.0
|
53
|
+
def checkout
|
54
|
+
queue.dequeue
|
55
|
+
end
|
56
|
+
|
57
|
+
# Create the new connection pool.
|
58
|
+
#
|
59
|
+
# @example Create the new connection pool.
|
60
|
+
# Pool.new(timeout: 0.5) do
|
61
|
+
# Connection.new
|
62
|
+
# end
|
63
|
+
#
|
64
|
+
# @note A block must be passed to set up the connections on initialization.
|
65
|
+
#
|
66
|
+
# @param [ Hash ] options The connection pool options.
|
67
|
+
#
|
68
|
+
# @since 2.0.0
|
69
|
+
def initialize(options = {}, &block)
|
70
|
+
@options = options.freeze
|
71
|
+
@queue = Queue.new(options, &block)
|
72
|
+
end
|
73
|
+
|
74
|
+
# Get a pretty printed string inspection for the pool.
|
75
|
+
#
|
76
|
+
# @example Inspect the pool.
|
77
|
+
# pool.inspect
|
78
|
+
#
|
79
|
+
# @return [ String ] The pool inspection.
|
80
|
+
#
|
81
|
+
# @since 2.0.0
|
82
|
+
def inspect
|
83
|
+
"#<Mongo::Server::ConnectionPool:0x#{object_id} queue=#{queue.inspect}>"
|
84
|
+
end
|
85
|
+
|
86
|
+
# Yield the block to a connection, while handling checkin/checkout logic.
|
87
|
+
#
|
88
|
+
# @example Execute with a connection.
|
89
|
+
# pool.with_connection do |connection|
|
90
|
+
# connection.read
|
91
|
+
# end
|
92
|
+
#
|
93
|
+
# @return [ Object ] The result of the block.
|
94
|
+
#
|
95
|
+
# @since 2.0.0
|
96
|
+
def with_connection
|
97
|
+
begin
|
98
|
+
connection = checkout
|
99
|
+
yield(connection)
|
100
|
+
ensure
|
101
|
+
checkin(connection)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
attr_reader :queue
|
108
|
+
|
109
|
+
class << self
|
110
|
+
|
111
|
+
# Get a connection pool for the provided server.
|
112
|
+
#
|
113
|
+
# @example Get a connection pool.
|
114
|
+
# Mongo::Pool.get(server)
|
115
|
+
#
|
116
|
+
# @param [ Mongo::Server ] server The server.
|
117
|
+
#
|
118
|
+
# @return [ Mongo::Pool ] The connection pool.
|
119
|
+
#
|
120
|
+
# @since 2.0.0
|
121
|
+
def get(server)
|
122
|
+
MUTEX.synchronize do
|
123
|
+
pools[server.address] ||= create_pool(server)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
private
|
128
|
+
|
129
|
+
def create_pool(server)
|
130
|
+
ConnectionPool.new(server.options) do
|
131
|
+
Connection.new(server, server.options)
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def pools
|
136
|
+
@pools ||= {}
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
# Copyright (C) 2014-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 Server
|
17
|
+
|
18
|
+
# Represents a context in which messages are sent to the server on a
|
19
|
+
# connection.
|
20
|
+
#
|
21
|
+
# @since 2.0.0
|
22
|
+
class Context
|
23
|
+
extend Forwardable
|
24
|
+
|
25
|
+
# @return [ Mongo::Server ] server The server the context is for.
|
26
|
+
attr_reader :server
|
27
|
+
|
28
|
+
# Delegate state checks to the server.
|
29
|
+
def_delegators :@server,
|
30
|
+
:features,
|
31
|
+
:max_wire_version,
|
32
|
+
:max_write_batch_size,
|
33
|
+
:mongos?,
|
34
|
+
:primary?,
|
35
|
+
:secondary?,
|
36
|
+
:standalone?
|
37
|
+
|
38
|
+
# Instantiate a server context.
|
39
|
+
#
|
40
|
+
# @example Instantiate a server context.
|
41
|
+
# Mongo::Server::Context.new(server)
|
42
|
+
#
|
43
|
+
# @param [ Mongo::Server ] server The server the context is for.
|
44
|
+
#
|
45
|
+
# @since 2.0.0
|
46
|
+
def initialize(server)
|
47
|
+
@server = server
|
48
|
+
end
|
49
|
+
|
50
|
+
# Execute a block of code with a connection, that is checked out of the
|
51
|
+
# pool and then checked back in.
|
52
|
+
#
|
53
|
+
# @example Send a message with the connection.
|
54
|
+
# context.with_connection do |connection|
|
55
|
+
# connection.dispatch([ command ])
|
56
|
+
# end
|
57
|
+
#
|
58
|
+
# @return [ Object ] The result of the block execution.
|
59
|
+
#
|
60
|
+
# @since 2.0.0
|
61
|
+
def with_connection(&block)
|
62
|
+
server.pool.with_connection(&block)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# Copyright (C) 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
|
+
module Mongo
|
16
|
+
class Server
|
17
|
+
class Description
|
18
|
+
|
19
|
+
# Defines behaviour around what features a specific server supports.
|
20
|
+
#
|
21
|
+
# @since 2.0.0
|
22
|
+
class Features
|
23
|
+
|
24
|
+
# List of features and the wire protocol version they appear in.
|
25
|
+
#
|
26
|
+
# @since 2.0.0
|
27
|
+
MAPPINGS = {
|
28
|
+
:list_collections => 3,
|
29
|
+
:list_indexes => 3,
|
30
|
+
:scram_sha_1 => 3,
|
31
|
+
:write_command => 2
|
32
|
+
}.freeze
|
33
|
+
|
34
|
+
# The wire protocol versions that this version of the driver supports.
|
35
|
+
#
|
36
|
+
# @since 2.0.0
|
37
|
+
DRIVER_WIRE_VERSIONS = (0..3).freeze
|
38
|
+
|
39
|
+
# Create the methods for each mapping to tell if they are supported.
|
40
|
+
#
|
41
|
+
# @since 2.0.0
|
42
|
+
MAPPINGS.each do |name, version|
|
43
|
+
|
44
|
+
# Determine whether or not the feature is enabled.
|
45
|
+
#
|
46
|
+
# @example Is a feature enabled?
|
47
|
+
# features.list_collections_enabled?
|
48
|
+
#
|
49
|
+
# @return [ true, false ] If the feature is enabled.
|
50
|
+
#
|
51
|
+
# @since 2.0.0
|
52
|
+
define_method("#{name}_enabled?") do
|
53
|
+
server_wire_versions.include?(MAPPINGS[name])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# @return [ Range ] server_wire_versions The server's supported wire
|
58
|
+
# versions.
|
59
|
+
attr_reader :server_wire_versions
|
60
|
+
|
61
|
+
# Initialize the features.
|
62
|
+
#
|
63
|
+
# @example Initialize the features.
|
64
|
+
# Features.new(0..3)
|
65
|
+
#
|
66
|
+
# @param [ Range ] server_wire_versions The server supported wire
|
67
|
+
# versions.
|
68
|
+
#
|
69
|
+
# @since 2.0.0
|
70
|
+
def initialize(server_wire_versions)
|
71
|
+
@server_wire_versions = server_wire_versions
|
72
|
+
check_driver_support!
|
73
|
+
end
|
74
|
+
|
75
|
+
private
|
76
|
+
|
77
|
+
def check_driver_support!
|
78
|
+
if DRIVER_WIRE_VERSIONS.max < server_wire_versions.max
|
79
|
+
raise Error::UnsupportedFeatures.new(server_wire_versions)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,58 @@
|
|
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 Server
|
17
|
+
class Description
|
18
|
+
class Inspector
|
19
|
+
|
20
|
+
# Handles inspecting the result of an ismaster command to check if this
|
21
|
+
# server was elected primary.
|
22
|
+
#
|
23
|
+
# @since 2.0.0
|
24
|
+
class PrimaryElected
|
25
|
+
include Event::Publisher
|
26
|
+
|
27
|
+
# Instantiate the primary elected inspection.
|
28
|
+
#
|
29
|
+
# @example Instantiate the inspection.
|
30
|
+
# PrimaryElected.new(listeners)
|
31
|
+
#
|
32
|
+
# @param [ Event::Listeners ] event_listeners The event listeners.
|
33
|
+
#
|
34
|
+
# @since 2.0.0
|
35
|
+
def initialize(event_listeners)
|
36
|
+
@event_listeners = event_listeners
|
37
|
+
end
|
38
|
+
|
39
|
+
# Run the primary elected inspection.
|
40
|
+
#
|
41
|
+
# @example Run the inspection.
|
42
|
+
# PrimaryElected.run(description, {})
|
43
|
+
#
|
44
|
+
# @param [ Description ] description The server description.
|
45
|
+
# @param [ Description ] updated The updated description.
|
46
|
+
#
|
47
|
+
# @since 2.0.0
|
48
|
+
def run(description, updated)
|
49
|
+
if (!description.primary? && updated.primary?) ||
|
50
|
+
(!description.mongos? && updated.mongos?)
|
51
|
+
publish(Event::PRIMARY_ELECTED, updated)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|