mongo 1.12.5 → 2.0.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CONTRIBUTING.md +64 -0
- data/LICENSE +1 -1
- data/README.md +23 -125
- data/Rakefile +26 -21
- data/bin/mongo_console +6 -38
- data/lib/mongo.rb +23 -82
- data/lib/mongo/address.rb +111 -0
- 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/auth.rb +108 -0
- data/lib/mongo/auth/cr.rb +44 -0
- data/lib/mongo/auth/cr/conversation.rb +119 -0
- data/lib/mongo/auth/executable.rb +52 -0
- data/lib/mongo/auth/ldap.rb +48 -0
- data/lib/mongo/auth/ldap/conversation.rb +92 -0
- data/lib/mongo/auth/roles.rb +104 -0
- data/lib/mongo/auth/scram.rb +53 -0
- data/lib/mongo/auth/scram/conversation.rb +450 -0
- data/lib/mongo/auth/user.rb +159 -0
- data/lib/mongo/auth/user/view.rb +102 -0
- data/lib/mongo/auth/x509.rb +48 -0
- data/lib/mongo/auth/x509/conversation.rb +92 -0
- data/lib/mongo/{gridfs.rb → bulk.rb} +2 -5
- data/lib/mongo/bulk/bulk_write.rb +307 -0
- data/lib/mongo/client.rb +233 -0
- data/lib/mongo/cluster.rb +203 -0
- data/lib/mongo/cluster/topology.rb +60 -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/collection.rb +130 -1101
- data/lib/mongo/collection/view.rb +169 -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 +169 -0
- data/lib/mongo/cursor.rb +79 -680
- data/lib/mongo/database.rb +224 -0
- data/lib/mongo/database/view.rb +101 -0
- data/lib/mongo/error.rb +81 -0
- data/lib/mongo/error/bulk_write_failure.rb +41 -0
- data/lib/mongo/{utils/thread_local_variable_manager.rb → error/empty_batch.rb} +22 -8
- data/{test/functional/db_connection_test.rb → lib/mongo/error/invalid_bulk_operation.rb} +19 -8
- 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/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/event.rb +40 -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/grid.rb +16 -0
- data/lib/mongo/grid/file.rb +94 -0
- data/lib/mongo/grid/file/chunk.rb +184 -0
- data/lib/mongo/grid/file/metadata.rb +223 -0
- data/lib/mongo/grid/fs.rb +149 -0
- data/lib/mongo/index.rb +64 -0
- data/lib/mongo/index/view.rb +205 -0
- data/lib/mongo/loggable.rb +126 -0
- data/lib/mongo/logger.rb +132 -0
- data/lib/mongo/operation.rb +26 -0
- data/lib/mongo/operation/aggregate.rb +100 -0
- data/lib/mongo/operation/aggregate/result.rb +84 -0
- data/lib/mongo/operation/batchable.rb +103 -0
- data/lib/mongo/operation/bulk_delete/result.rb +197 -0
- data/lib/mongo/operation/bulk_insert/result.rb +195 -0
- data/lib/mongo/operation/bulk_update/result.rb +295 -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 +116 -0
- data/lib/mongo/operation/list_indexes/result.rb +118 -0
- data/lib/mongo/operation/map_reduce.rb +96 -0
- data/lib/mongo/operation/map_reduce/result.rb +122 -0
- data/lib/mongo/{functional.rb → operation/read.rb} +7 -7
- 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/operation/read_preferrable.rb +34 -0
- data/lib/mongo/operation/result.rb +259 -0
- data/lib/mongo/operation/specifiable.rb +380 -0
- data/lib/mongo/operation/write.rb +25 -0
- data/lib/mongo/operation/write/bulk_delete.rb +158 -0
- data/lib/mongo/operation/write/bulk_insert.rb +160 -0
- data/lib/mongo/operation/write/bulk_update.rb +167 -0
- data/lib/mongo/{connection/socket/socket_util.rb → operation/write/command.rb} +9 -24
- 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/ensure_index.rb +55 -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/create_index.rb +84 -0
- data/lib/mongo/operation/write/create_user.rb +75 -0
- data/lib/mongo/operation/write/delete.rb +91 -0
- data/lib/mongo/operation/write/drop_index.rb +62 -0
- data/lib/mongo/operation/write/insert.rb +88 -0
- data/lib/mongo/operation/write/remove_user.rb +70 -0
- data/lib/mongo/operation/write/update.rb +98 -0
- data/lib/mongo/protocol.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/server.rb +163 -0
- data/lib/mongo/server/connectable.rb +99 -0
- data/lib/mongo/server/connection.rb +133 -0
- data/lib/mongo/server/connection_pool.rb +141 -0
- data/lib/mongo/server/connection_pool/queue.rb +182 -0
- data/lib/mongo/server/context.rb +66 -0
- data/lib/mongo/server/description.rb +450 -0
- data/lib/mongo/server/description/features.rb +85 -0
- data/lib/mongo/server/description/inspector.rb +79 -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/monitor.rb +160 -0
- data/lib/mongo/server/monitor/connection.rb +88 -0
- data/lib/mongo/server_selector.rb +81 -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/socket.rb +179 -0
- data/lib/mongo/socket/ssl.rb +108 -0
- data/lib/mongo/socket/tcp.rb +69 -0
- data/lib/mongo/socket/unix.rb +66 -0
- data/lib/mongo/uri.rb +504 -0
- data/lib/mongo/version.rb +21 -0
- data/lib/mongo/write_concern.rb +99 -0
- data/lib/mongo/write_concern/acknowledged.rb +38 -0
- data/lib/mongo/write_concern/normalizable.rb +73 -0
- data/lib/mongo/write_concern/unacknowledged.rb +43 -0
- data/mongo.gemspec +17 -14
- 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 +175 -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 +135 -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 +504 -0
- data/spec/mongo/collection/view_spec.rb +521 -0
- data/spec/mongo/collection_spec.rb +362 -0
- data/spec/mongo/cursor_spec.rb +295 -0
- data/spec/mongo/database_spec.rb +306 -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 +69 -0
- data/spec/mongo/grid/file_spec.rb +138 -0
- data/spec/mongo/grid/fs_spec.rb +129 -0
- data/spec/mongo/index/view_spec.rb +226 -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 +135 -0
- data/spec/mongo/operation/command_spec.rb +106 -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 +473 -0
- data/spec/mongo/operation/write/bulk_insert_spec.rb +466 -0
- data/spec/mongo/operation/write/bulk_update_spec.rb +524 -0
- data/spec/mongo/operation/write/command/delete_spec.rb +116 -0
- data/spec/mongo/operation/write/command/insert_spec.rb +117 -0
- data/spec/mongo/operation/write/command/update_spec.rb +123 -0
- data/spec/mongo/operation/write/create_user_spec.rb +44 -0
- data/spec/mongo/operation/write/delete_spec.rb +178 -0
- data/spec/mongo/operation/write/drop_index_spec.rb +51 -0
- data/spec/mongo/operation/write/ensure_index_spec.rb +81 -0
- data/spec/mongo/operation/write/insert_spec.rb +231 -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 +177 -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 +289 -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 +130 -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/mongo_orchestration_spec.rb +70 -0
- data/spec/spec_helper.rb +148 -0
- data/spec/support/authorization.rb +245 -0
- data/spec/support/helpers.rb +140 -0
- data/spec/support/matchers.rb +37 -0
- data/spec/support/mongo_orchestration.rb +61 -0
- data/spec/support/mongo_orchestration/requestable.rb +109 -0
- data/spec/support/mongo_orchestration/standalone.rb +57 -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.rb +140 -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 +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Nearest_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Primary.yml +23 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/PrimaryPreferred_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred.yml +32 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/SecondaryPreferred_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetNoPrimary/read/Secondary_non_matching.yml +27 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest.yml +41 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Nearest_non_matching.yml +34 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/Primary.yml +33 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred.yml +39 -0
- data/spec/support/server_selection/selection/ReplicaSetWithPrimary/read/PrimaryPreferred_non_matching.yml +36 -0
- data/spec/support/server_selection/selection/Sharded/read/SecondaryPreferred.yml +32 -0
- data/spec/support/server_selection/selection/Single/read/SecondaryPreferred.yml +23 -0
- data/spec/support/server_selection/selection/Unknown/read/SecondaryPreferred.yml +13 -0
- data/spec/support/server_selection_rtt.rb +41 -0
- data/spec/support/shared/bulk_write.rb +498 -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
- metadata +523 -189
- 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
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
# Copyright (C) 2009-2013 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 Node
|
|
17
|
-
|
|
18
|
-
attr_accessor :host, :port, :address, :client, :socket, :last_state
|
|
19
|
-
|
|
20
|
-
def initialize(client, host_port)
|
|
21
|
-
@client = client
|
|
22
|
-
@manager = @client.local_manager
|
|
23
|
-
@host, @port = Support.normalize_seeds(host_port)
|
|
24
|
-
@address = "#{@host}:#{@port}"
|
|
25
|
-
@config = nil
|
|
26
|
-
@socket = nil
|
|
27
|
-
@node_mutex = Monitor.new
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def eql?(other)
|
|
31
|
-
(other.is_a?(Node) && @address == other.address)
|
|
32
|
-
end
|
|
33
|
-
alias :== :eql?
|
|
34
|
-
|
|
35
|
-
def =~(other)
|
|
36
|
-
if other.is_a?(String)
|
|
37
|
-
h, p = Support.normalize_seeds(other)
|
|
38
|
-
h == @host && p == @port
|
|
39
|
-
else
|
|
40
|
-
false
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
def host_string
|
|
45
|
-
address
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def config
|
|
49
|
-
connect unless connected?
|
|
50
|
-
set_config unless @config || !connected?
|
|
51
|
-
@config
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def inspect
|
|
55
|
-
"<Mongo::Node:0x#{self.object_id.to_s(16)} @host=#{@host} @port=#{@port}>"
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
# Create a connection to the provided node,
|
|
59
|
-
# and, if successful, return the socket. Otherwise,
|
|
60
|
-
# return nil.
|
|
61
|
-
def connect
|
|
62
|
-
@node_mutex.synchronize do
|
|
63
|
-
begin
|
|
64
|
-
@socket = @client.socket_class.new(@host, @port,
|
|
65
|
-
@client.op_timeout,
|
|
66
|
-
@client.connect_timeout,
|
|
67
|
-
@client.socket_opts)
|
|
68
|
-
rescue ConnectionTimeoutError, OperationTimeout, ConnectionFailure, OperationFailure,
|
|
69
|
-
SocketError, SystemCallError, IOError => ex
|
|
70
|
-
@client.log(:debug, "Failed connection to #{host_string} with #{ex.class}, #{ex.message}.")
|
|
71
|
-
close
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
# This should only be called within a mutex
|
|
77
|
-
def close
|
|
78
|
-
if @socket && !@socket.closed?
|
|
79
|
-
@socket.close
|
|
80
|
-
end
|
|
81
|
-
@socket = nil
|
|
82
|
-
@config = nil
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
def connected?
|
|
86
|
-
@socket != nil && !@socket.closed?
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def active?
|
|
90
|
-
begin
|
|
91
|
-
result = @client['admin'].command({:ping => 1}, :socket => usable_socket)
|
|
92
|
-
rescue OperationFailure, SocketError, SystemCallError, IOError
|
|
93
|
-
return nil
|
|
94
|
-
end
|
|
95
|
-
result['ok'] == 1
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
# Get the configuration for the provided node as returned by the
|
|
99
|
-
# ismaster command. Additionally, check that the replica set name
|
|
100
|
-
# matches with the name provided.
|
|
101
|
-
def set_config
|
|
102
|
-
@node_mutex.synchronize do
|
|
103
|
-
begin
|
|
104
|
-
if @config
|
|
105
|
-
@last_state = @config['ismaster'] ? :primary : :other
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
if @client.connect_timeout
|
|
109
|
-
Timeout::timeout(@client.connect_timeout, OperationTimeout) do
|
|
110
|
-
@config = @client['admin'].command({:ismaster => 1}, :socket => usable_socket)
|
|
111
|
-
end
|
|
112
|
-
else
|
|
113
|
-
@config = @client['admin'].command({:ismaster => 1}, :socket => usable_socket)
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
update_max_sizes
|
|
117
|
-
|
|
118
|
-
if @config['msg']
|
|
119
|
-
@client.log(:warn, "#{config['msg']}")
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
unless @client.mongos?
|
|
123
|
-
check_set_membership(@config)
|
|
124
|
-
check_set_name(@config)
|
|
125
|
-
end
|
|
126
|
-
rescue ConnectionFailure, OperationFailure, OperationTimeout, SocketError, SystemCallError, IOError => ex
|
|
127
|
-
@client.log(:warn, "Attempted connection to node #{host_string} raised " +
|
|
128
|
-
"#{ex.class}: #{ex.message}")
|
|
129
|
-
# Socket may already be nil from issuing command
|
|
130
|
-
close
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
end
|
|
134
|
-
|
|
135
|
-
# Return a list of replica set nodes from the config.
|
|
136
|
-
# Note: this excludes arbiters.
|
|
137
|
-
def node_list
|
|
138
|
-
nodes = []
|
|
139
|
-
nodes += config['hosts'] if config['hosts']
|
|
140
|
-
nodes += config['passives'] if config['passives']
|
|
141
|
-
nodes += ["#{@host}:#{@port}"] if @client.mongos?
|
|
142
|
-
nodes
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
def arbiters
|
|
146
|
-
return [] unless config['arbiters']
|
|
147
|
-
config['arbiters'].map do |arbiter|
|
|
148
|
-
Support.normalize_seeds(arbiter)
|
|
149
|
-
end
|
|
150
|
-
end
|
|
151
|
-
|
|
152
|
-
def primary?
|
|
153
|
-
config['ismaster'] == true || config['ismaster'] == 1
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
def secondary?
|
|
157
|
-
config['secondary'] == true || config['secondary'] == 1
|
|
158
|
-
end
|
|
159
|
-
|
|
160
|
-
def tags
|
|
161
|
-
config['tags'] || {}
|
|
162
|
-
end
|
|
163
|
-
|
|
164
|
-
def host_port
|
|
165
|
-
[@host, @port]
|
|
166
|
-
end
|
|
167
|
-
|
|
168
|
-
def hash
|
|
169
|
-
address.hash
|
|
170
|
-
end
|
|
171
|
-
|
|
172
|
-
def healthy?
|
|
173
|
-
connected? && config
|
|
174
|
-
end
|
|
175
|
-
|
|
176
|
-
def max_bson_size
|
|
177
|
-
@max_bson_size || DEFAULT_MAX_BSON_SIZE
|
|
178
|
-
end
|
|
179
|
-
|
|
180
|
-
def max_message_size
|
|
181
|
-
@max_message_size || max_bson_size * MESSAGE_SIZE_FACTOR
|
|
182
|
-
end
|
|
183
|
-
|
|
184
|
-
def max_wire_version
|
|
185
|
-
@max_wire_version || 0
|
|
186
|
-
end
|
|
187
|
-
|
|
188
|
-
def min_wire_version
|
|
189
|
-
@min_wire_version || 0
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
def wire_version_feature?(feature)
|
|
193
|
-
min_wire_version <= feature && feature <= max_wire_version
|
|
194
|
-
end
|
|
195
|
-
|
|
196
|
-
def max_write_batch_size
|
|
197
|
-
@max_write_batch_size || Mongo::MongoClient::DEFAULT_MAX_WRITE_BATCH_SIZE
|
|
198
|
-
end
|
|
199
|
-
|
|
200
|
-
protected
|
|
201
|
-
|
|
202
|
-
# Ensure that this node is a healthy member of a replica set.
|
|
203
|
-
def check_set_membership(config)
|
|
204
|
-
if !config.has_key?('hosts')
|
|
205
|
-
message = "Will not connect to #{host_string} because it's not a member " +
|
|
206
|
-
"of a replica set."
|
|
207
|
-
raise ConnectionFailure, message
|
|
208
|
-
elsif config['hosts'].length == 1 && !config['ismaster'] &&
|
|
209
|
-
!config['secondary']
|
|
210
|
-
message = "Attempting to connect to an unhealthy, single-node replica set."
|
|
211
|
-
raise ConnectionFailure, message
|
|
212
|
-
end
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
# Ensure that this node is part of a replica set of the expected name.
|
|
216
|
-
def check_set_name(config)
|
|
217
|
-
if @client.replica_set_name
|
|
218
|
-
if !config['setName']
|
|
219
|
-
@client.log(:warn, "Could not verify replica set name for member #{host_string} " +
|
|
220
|
-
"because ismaster does not return name in this version of MongoDB")
|
|
221
|
-
elsif @client.replica_set_name != config['setName']
|
|
222
|
-
message = "Attempting to connect to replica set '#{config['setName']}' on member #{host_string} " +
|
|
223
|
-
"but expected '#{@client.replica_set_name}'"
|
|
224
|
-
raise ReplicaSetConnectionError, message
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
private
|
|
230
|
-
|
|
231
|
-
def usable_socket
|
|
232
|
-
if @socket && @socket.pid != Process.pid
|
|
233
|
-
@socket.close
|
|
234
|
-
@socket = nil
|
|
235
|
-
connect
|
|
236
|
-
else
|
|
237
|
-
@socket
|
|
238
|
-
end
|
|
239
|
-
end
|
|
240
|
-
|
|
241
|
-
def update_max_sizes
|
|
242
|
-
@max_bson_size = config['maxBsonObjectSize'] || DEFAULT_MAX_BSON_SIZE
|
|
243
|
-
@max_message_size = config['maxMessageSizeBytes'] || @max_bson_size * MESSAGE_SIZE_FACTOR
|
|
244
|
-
@max_wire_version = config['maxWireVersion'] || 0
|
|
245
|
-
@min_wire_version = config['minWireVersion'] || 0
|
|
246
|
-
@max_write_batch_size = config['maxWriteBatchSize'] || Mongo::MongoClient::DEFAULT_MAX_WRITE_BATCH_SIZE
|
|
247
|
-
end
|
|
248
|
-
end
|
|
249
|
-
end
|
|
@@ -1,340 +0,0 @@
|
|
|
1
|
-
# Copyright (C) 2009-2013 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 Pool
|
|
17
|
-
PING_ATTEMPTS = 6
|
|
18
|
-
MAX_PING_TIME = 1_000_000
|
|
19
|
-
PRUNE_INTERVAL = 10_000
|
|
20
|
-
|
|
21
|
-
attr_accessor :host,
|
|
22
|
-
:port,
|
|
23
|
-
:address,
|
|
24
|
-
:size,
|
|
25
|
-
:timeout,
|
|
26
|
-
:checked_out,
|
|
27
|
-
:client,
|
|
28
|
-
:node
|
|
29
|
-
|
|
30
|
-
# Create a new pool of connections.
|
|
31
|
-
def initialize(client, host, port, opts={})
|
|
32
|
-
@client = client
|
|
33
|
-
|
|
34
|
-
@host, @port = host, port
|
|
35
|
-
|
|
36
|
-
# A Mongo::Node object.
|
|
37
|
-
@node = opts[:node]
|
|
38
|
-
|
|
39
|
-
# The string address
|
|
40
|
-
@address = "#{@host}:#{@port}"
|
|
41
|
-
|
|
42
|
-
# Pool size and timeout.
|
|
43
|
-
@size = opts.fetch(:size, 20)
|
|
44
|
-
@timeout = opts.fetch(:timeout, 30)
|
|
45
|
-
|
|
46
|
-
# Mutex for synchronizing pool access
|
|
47
|
-
@connection_mutex = Mutex.new
|
|
48
|
-
|
|
49
|
-
# Mutex for synchronizing pings
|
|
50
|
-
@ping_mutex = Mutex.new
|
|
51
|
-
|
|
52
|
-
# Condition variable for signal and wait
|
|
53
|
-
@queue = ConditionVariable.new
|
|
54
|
-
|
|
55
|
-
@sockets = []
|
|
56
|
-
@checked_out = []
|
|
57
|
-
@ping_time = nil
|
|
58
|
-
@last_ping = nil
|
|
59
|
-
@closed = false
|
|
60
|
-
@thread_ids_to_sockets = {}
|
|
61
|
-
@checkout_counter = 0
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# Close this pool.
|
|
65
|
-
#
|
|
66
|
-
# @option opts [Boolean]:soft (false) If true,
|
|
67
|
-
# close only those sockets that are not checked out.
|
|
68
|
-
def close(opts={})
|
|
69
|
-
@connection_mutex.synchronize do
|
|
70
|
-
if opts[:soft] && !@checked_out.empty?
|
|
71
|
-
@closing = true
|
|
72
|
-
close_sockets(@sockets - @checked_out)
|
|
73
|
-
else
|
|
74
|
-
close_sockets(@sockets)
|
|
75
|
-
@closed = true
|
|
76
|
-
end
|
|
77
|
-
@node.close if @node
|
|
78
|
-
end
|
|
79
|
-
true
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def tags
|
|
83
|
-
@node.tags
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def healthy?
|
|
87
|
-
close if @sockets.all?(&:closed?)
|
|
88
|
-
!closed? && node.healthy?
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
def closed?
|
|
92
|
-
@closed
|
|
93
|
-
end
|
|
94
|
-
|
|
95
|
-
def up?
|
|
96
|
-
!@closed
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def inspect
|
|
100
|
-
"#<Mongo::Pool:0x#{self.object_id.to_s(16)} @host=#{@host} @port=#{port} " +
|
|
101
|
-
"@ping_time=#{@ping_time} #{@checked_out.size}/#{@size} sockets available " +
|
|
102
|
-
"up=#{!closed?}>"
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
def host_string
|
|
106
|
-
"#{@host}:#{@port}"
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def host_port
|
|
110
|
-
[@host, @port]
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
# Refresh ping time only if we haven't
|
|
114
|
-
# checked within the last five minutes.
|
|
115
|
-
def ping_time
|
|
116
|
-
@ping_mutex.synchronize do
|
|
117
|
-
if !@last_ping || (Time.now - @last_ping) > 300
|
|
118
|
-
@ping_time = refresh_ping_time
|
|
119
|
-
@last_ping = Time.now
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
@ping_time
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
# Return the time it takes on average
|
|
126
|
-
# to do a round-trip against this node.
|
|
127
|
-
def refresh_ping_time
|
|
128
|
-
trials = []
|
|
129
|
-
PING_ATTEMPTS.times do
|
|
130
|
-
t1 = Time.now
|
|
131
|
-
if !self.ping
|
|
132
|
-
return MAX_PING_TIME
|
|
133
|
-
end
|
|
134
|
-
trials << (Time.now - t1) * 1000
|
|
135
|
-
end
|
|
136
|
-
|
|
137
|
-
trials.sort!
|
|
138
|
-
|
|
139
|
-
# Delete shortest and longest times
|
|
140
|
-
trials.delete_at(trials.length-1)
|
|
141
|
-
trials.delete_at(0)
|
|
142
|
-
|
|
143
|
-
total = 0.0
|
|
144
|
-
trials.each { |t| total += t }
|
|
145
|
-
|
|
146
|
-
(total / trials.length).ceil
|
|
147
|
-
end
|
|
148
|
-
|
|
149
|
-
def ping
|
|
150
|
-
begin
|
|
151
|
-
return self.client['admin'].command({:ping => 1}, :socket => @node.socket,
|
|
152
|
-
:timeout => client.op_timeout || MongoClient::DEFAULT_OP_TIMEOUT)
|
|
153
|
-
rescue ConnectionFailure, OperationFailure, SocketError, SystemCallError, IOError
|
|
154
|
-
return false
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
|
|
158
|
-
# Return a socket to the pool.
|
|
159
|
-
def checkin(socket)
|
|
160
|
-
@connection_mutex.synchronize do
|
|
161
|
-
if @checked_out.delete(socket)
|
|
162
|
-
@queue.broadcast
|
|
163
|
-
else
|
|
164
|
-
return false
|
|
165
|
-
end
|
|
166
|
-
end
|
|
167
|
-
true
|
|
168
|
-
end
|
|
169
|
-
|
|
170
|
-
# Adds a new socket to the pool and checks it out.
|
|
171
|
-
#
|
|
172
|
-
# This method is called exclusively from #checkout;
|
|
173
|
-
# therefore, it runs within a mutex.
|
|
174
|
-
def checkout_new_socket
|
|
175
|
-
begin
|
|
176
|
-
socket = @client.socket_class.new(@host, @port, @client.op_timeout,
|
|
177
|
-
@client.connect_timeout,
|
|
178
|
-
@client.socket_opts)
|
|
179
|
-
socket.pool = self
|
|
180
|
-
rescue => ex
|
|
181
|
-
socket.close if socket
|
|
182
|
-
@node.close if @node
|
|
183
|
-
raise ConnectionFailure, "Failed to connect to host #{@host} and port #{@port}: #{ex}"
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
@sockets << socket
|
|
187
|
-
@checked_out << socket
|
|
188
|
-
@thread_ids_to_sockets[Thread.current.object_id] = socket
|
|
189
|
-
socket
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
# If a user calls DB#authenticate, and several sockets exist,
|
|
193
|
-
# then we need a way to apply the authentication on each socket.
|
|
194
|
-
# So we store the apply_authentication method, and this will be
|
|
195
|
-
# applied right before the next use of each socket.
|
|
196
|
-
#
|
|
197
|
-
# @deprecated This method has been replaced by Pool#check_auths (private)
|
|
198
|
-
# and it isn't necessary to ever invoke this method directly.
|
|
199
|
-
# Authentication of sockets is handled upon checkout and checkin.
|
|
200
|
-
def authenticate_existing
|
|
201
|
-
end
|
|
202
|
-
|
|
203
|
-
# Store the logout op for each existing socket to be applied before
|
|
204
|
-
# the next use of each socket.
|
|
205
|
-
#
|
|
206
|
-
# @deprecated This method has been replaced by Pool#check_auths (private)
|
|
207
|
-
# and it isn't necessary to ever invoke this method directly.
|
|
208
|
-
# Authentication of sockets is handled upon checkout and checkin.
|
|
209
|
-
def logout_existing(database)
|
|
210
|
-
end
|
|
211
|
-
|
|
212
|
-
# Checks out the first available socket from the pool.
|
|
213
|
-
#
|
|
214
|
-
# If the pid has changed, remove the socket and check out
|
|
215
|
-
# new one.
|
|
216
|
-
#
|
|
217
|
-
# This method is called exclusively from #checkout;
|
|
218
|
-
# therefore, it runs within a mutex.
|
|
219
|
-
def checkout_existing_socket(socket=nil)
|
|
220
|
-
if !socket
|
|
221
|
-
available = @sockets - @checked_out
|
|
222
|
-
socket = available[rand(available.length)]
|
|
223
|
-
end
|
|
224
|
-
|
|
225
|
-
if socket.pid != Process.pid
|
|
226
|
-
@sockets.delete(socket)
|
|
227
|
-
if socket
|
|
228
|
-
socket.close unless socket.closed?
|
|
229
|
-
end
|
|
230
|
-
checkout_new_socket
|
|
231
|
-
else
|
|
232
|
-
@checked_out << socket
|
|
233
|
-
@thread_ids_to_sockets[Thread.current.object_id] = socket
|
|
234
|
-
socket
|
|
235
|
-
end
|
|
236
|
-
end
|
|
237
|
-
|
|
238
|
-
def prune_threads
|
|
239
|
-
live_threads = Thread.list.map(&:object_id)
|
|
240
|
-
@thread_ids_to_sockets.reject! do |key, value|
|
|
241
|
-
!live_threads.include?(key)
|
|
242
|
-
end
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
def check_prune
|
|
246
|
-
if @checkout_counter > PRUNE_INTERVAL
|
|
247
|
-
@checkout_counter = 0
|
|
248
|
-
prune_threads
|
|
249
|
-
else
|
|
250
|
-
@checkout_counter += 1
|
|
251
|
-
end
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
# Check out an existing socket or create a new socket if the maximum
|
|
255
|
-
# pool size has not been exceeded. Otherwise, wait for the next
|
|
256
|
-
# available socket.
|
|
257
|
-
def checkout
|
|
258
|
-
@client.connect if !@client.connected?
|
|
259
|
-
start_time = Time.now
|
|
260
|
-
loop do
|
|
261
|
-
if (Time.now - start_time) > @timeout
|
|
262
|
-
raise ConnectionTimeoutError, "could not obtain connection within " +
|
|
263
|
-
"#{@timeout} seconds. The max pool size is currently #{@size}; " +
|
|
264
|
-
"consider increasing the pool size or timeout."
|
|
265
|
-
end
|
|
266
|
-
|
|
267
|
-
@connection_mutex.synchronize do
|
|
268
|
-
check_prune
|
|
269
|
-
socket = nil
|
|
270
|
-
if socket_for_thread = @thread_ids_to_sockets[Thread.current.object_id]
|
|
271
|
-
if !@checked_out.include?(socket_for_thread)
|
|
272
|
-
socket = checkout_existing_socket(socket_for_thread)
|
|
273
|
-
end
|
|
274
|
-
else
|
|
275
|
-
if @sockets.size < @size
|
|
276
|
-
socket = checkout_new_socket
|
|
277
|
-
elsif @checked_out.size < @sockets.size
|
|
278
|
-
socket = checkout_existing_socket
|
|
279
|
-
end
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
if socket
|
|
283
|
-
if !socket.closed?
|
|
284
|
-
begin
|
|
285
|
-
check_auths(socket)
|
|
286
|
-
return socket
|
|
287
|
-
rescue ConnectionFailure
|
|
288
|
-
# Socket failed authentication and will be cleaned up below
|
|
289
|
-
end
|
|
290
|
-
end
|
|
291
|
-
|
|
292
|
-
# Socket was closed from earlier network error, or just now from
|
|
293
|
-
# a network error when authenticating.
|
|
294
|
-
@checked_out.delete(socket)
|
|
295
|
-
@sockets.delete(socket)
|
|
296
|
-
@thread_ids_to_sockets.delete(Thread.current.object_id)
|
|
297
|
-
else
|
|
298
|
-
# Otherwise, wait
|
|
299
|
-
@queue.wait(@connection_mutex)
|
|
300
|
-
end
|
|
301
|
-
end
|
|
302
|
-
end
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
private
|
|
306
|
-
|
|
307
|
-
# Helper method to handle keeping track of auths/logouts for sockets.
|
|
308
|
-
#
|
|
309
|
-
# @param socket [Socket] The socket instance to be checked.
|
|
310
|
-
#
|
|
311
|
-
# @return [Socket] The authenticated socket instance.
|
|
312
|
-
def check_auths(socket)
|
|
313
|
-
# find and handle logouts
|
|
314
|
-
(socket.auths - @client.auths).each do |auth|
|
|
315
|
-
@client.issue_logout(auth[:source], :socket => socket)
|
|
316
|
-
socket.auths.delete(auth)
|
|
317
|
-
end
|
|
318
|
-
|
|
319
|
-
# find and handle new auths
|
|
320
|
-
(@client.auths - socket.auths).each do |auth|
|
|
321
|
-
@client.issue_authentication(auth, :socket => socket)
|
|
322
|
-
socket.auths.add(auth)
|
|
323
|
-
end
|
|
324
|
-
|
|
325
|
-
socket
|
|
326
|
-
end
|
|
327
|
-
|
|
328
|
-
def close_sockets(sockets)
|
|
329
|
-
sockets.each do |socket|
|
|
330
|
-
@sockets.delete(socket)
|
|
331
|
-
begin
|
|
332
|
-
socket.close unless socket.closed?
|
|
333
|
-
rescue IOError => ex
|
|
334
|
-
warn "IOError when attempting to close socket connected to #{@host}:#{@port}: #{ex.inspect}"
|
|
335
|
-
end
|
|
336
|
-
end
|
|
337
|
-
end
|
|
338
|
-
|
|
339
|
-
end
|
|
340
|
-
end
|