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,89 @@
|
|
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 Monitor
|
18
|
+
|
19
|
+
# This class models the monitor connections and their behavior.
|
20
|
+
#
|
21
|
+
# @since 2.0.0
|
22
|
+
class Connection
|
23
|
+
include Connectable
|
24
|
+
|
25
|
+
# Tell the underlying socket to establish a connection to the host.
|
26
|
+
#
|
27
|
+
# @example Connect to the host.
|
28
|
+
# connection.connect!
|
29
|
+
#
|
30
|
+
# @note This method mutates the connection class by setting a socket if
|
31
|
+
# one previously did not exist.
|
32
|
+
#
|
33
|
+
# @return [ true ] If the connection succeeded.
|
34
|
+
#
|
35
|
+
# @since 2.0.0
|
36
|
+
def connect!
|
37
|
+
unless socket
|
38
|
+
@socket = address.socket(timeout, ssl_options)
|
39
|
+
@socket.connect!
|
40
|
+
end
|
41
|
+
true
|
42
|
+
end
|
43
|
+
|
44
|
+
# Disconnect the connection.
|
45
|
+
#
|
46
|
+
# @example Disconnect from the host.
|
47
|
+
# connection.disconnect!
|
48
|
+
#
|
49
|
+
# @note This method mutates the connection by setting the socket to nil
|
50
|
+
# if the closing succeeded.
|
51
|
+
#
|
52
|
+
# @return [ true ] If the disconnect succeeded.
|
53
|
+
#
|
54
|
+
# @since 2.0.0
|
55
|
+
def disconnect!
|
56
|
+
if socket
|
57
|
+
socket.close
|
58
|
+
@socket = nil
|
59
|
+
end
|
60
|
+
true
|
61
|
+
end
|
62
|
+
|
63
|
+
# Initialize a new socket connection from the client to the server.
|
64
|
+
#
|
65
|
+
# @example Create the connection.
|
66
|
+
# Connection.new(address)
|
67
|
+
#
|
68
|
+
# @param [ Mongo::Address ] address The address the connection is for.
|
69
|
+
# @param [ Hash ] options The connection options.
|
70
|
+
#
|
71
|
+
# @since 2.0.0
|
72
|
+
def initialize(address, options = {})
|
73
|
+
@address = address
|
74
|
+
@options = options.freeze
|
75
|
+
@ssl_options = options.reject { |k, v| !k.to_s.start_with?('ssl') }
|
76
|
+
@socket = nil
|
77
|
+
@pid = Process.pid
|
78
|
+
end
|
79
|
+
|
80
|
+
private
|
81
|
+
|
82
|
+
def write(messages, buffer = '')
|
83
|
+
messages.each{ |message| message.serialize(buffer) }
|
84
|
+
ensure_connected{ |socket| socket.write(buffer) }
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,176 @@
|
|
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/monitor/connection'
|
16
|
+
|
17
|
+
module Mongo
|
18
|
+
class Server
|
19
|
+
|
20
|
+
# This object is responsible for keeping server status up to date, running in
|
21
|
+
# a separate thread as to not disrupt other operations.
|
22
|
+
#
|
23
|
+
# @since 2.0.0
|
24
|
+
class Monitor
|
25
|
+
include Loggable
|
26
|
+
|
27
|
+
# The default time for a server to refresh its status is 10 seconds.
|
28
|
+
#
|
29
|
+
# @since 2.0.0
|
30
|
+
HEARTBEAT_FREQUENCY = 10.freeze
|
31
|
+
|
32
|
+
# The minimum time between forced server scans. Is
|
33
|
+
# minHeartbeatFrequencyMS in the SDAM spec.
|
34
|
+
#
|
35
|
+
# @since 2.0.0
|
36
|
+
MIN_SCAN_FREQUENCY = 0.5.freeze
|
37
|
+
|
38
|
+
# The command used for determining server status.
|
39
|
+
#
|
40
|
+
# @since 2.0.0
|
41
|
+
STATUS = { :ismaster => 1 }.freeze
|
42
|
+
|
43
|
+
# The constant for the ismaster command.
|
44
|
+
#
|
45
|
+
# @since 2.0.0
|
46
|
+
ISMASTER = Protocol::Query.new(Database::ADMIN, Database::COMMAND, STATUS, :limit => -1)
|
47
|
+
|
48
|
+
# The weighting factor (alpha) for calculating the average moving round trip time.
|
49
|
+
#
|
50
|
+
# @since 2.0.0
|
51
|
+
RTT_WEIGHT_FACTOR = 0.2.freeze
|
52
|
+
|
53
|
+
# @return [ Mongo::Connection ] connection The connection to use.
|
54
|
+
attr_reader :connection
|
55
|
+
|
56
|
+
# @return [ Server::Description ] description The server
|
57
|
+
# description the monitor refreshes.
|
58
|
+
attr_reader :description
|
59
|
+
|
60
|
+
# @return [ Description::Inspector ] inspector The description inspector.
|
61
|
+
attr_reader :inspector
|
62
|
+
|
63
|
+
# @return [ Hash ] options The server options.
|
64
|
+
attr_reader :options
|
65
|
+
|
66
|
+
# Force the monitor to immediately do a check of its server.
|
67
|
+
#
|
68
|
+
# @example Force a scan.
|
69
|
+
# monitor.scan!
|
70
|
+
#
|
71
|
+
# @return [ Description ] The updated description.
|
72
|
+
#
|
73
|
+
# @since 2.0.0
|
74
|
+
def scan!
|
75
|
+
throttle_scan_frequency!
|
76
|
+
@description = inspector.run(description, *ismaster)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Get the refresh interval for the server. This will be defined via an option
|
80
|
+
# or will default to 5.
|
81
|
+
#
|
82
|
+
# @example Get the refresh interval.
|
83
|
+
# server.heartbeat_frequency
|
84
|
+
#
|
85
|
+
# @return [ Integer ] The heartbeat frequency, in seconds.
|
86
|
+
#
|
87
|
+
# @since 2.0.0
|
88
|
+
def heartbeat_frequency
|
89
|
+
@heartbeat_frequency ||= options[:heartbeat_frequency] || HEARTBEAT_FREQUENCY
|
90
|
+
end
|
91
|
+
|
92
|
+
# Create the new server monitor.
|
93
|
+
#
|
94
|
+
# @example Create the server monitor.
|
95
|
+
# Mongo::Server::Monitor.new(address, listeners)
|
96
|
+
#
|
97
|
+
# @param [ Address ] address The address to monitor.
|
98
|
+
# @param [ Event::Listeners ] listeners The event listeners.
|
99
|
+
# @param [ Hash ] options The options.
|
100
|
+
#
|
101
|
+
# @since 2.0.0
|
102
|
+
def initialize(address, listeners, options = {})
|
103
|
+
@description = Description.new(address, {})
|
104
|
+
@inspector = Description::Inspector.new(listeners)
|
105
|
+
@options = options.freeze
|
106
|
+
@connection = Connection.new(address, options)
|
107
|
+
@last_round_trip_time = nil
|
108
|
+
@mutex = Mutex.new
|
109
|
+
end
|
110
|
+
|
111
|
+
# Runs the server monitor. Refreshing happens on a separate thread per
|
112
|
+
# server.
|
113
|
+
#
|
114
|
+
# @example Run the monitor.
|
115
|
+
# monito.run
|
116
|
+
#
|
117
|
+
# @return [ Thread ] The thread the monitor runs on.
|
118
|
+
#
|
119
|
+
# @since 2.0.0
|
120
|
+
def run!
|
121
|
+
@thread = Thread.new(heartbeat_frequency) do |i|
|
122
|
+
loop do
|
123
|
+
sleep(i)
|
124
|
+
scan!
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
# Stops the server monitor. Kills the thread so it doesn't continue
|
130
|
+
# taking memory and sending commands to the connection.
|
131
|
+
#
|
132
|
+
# @example Stop the monitor.
|
133
|
+
# monitor.stop!
|
134
|
+
#
|
135
|
+
# @return [ Boolean ] Is the Thread stopped?
|
136
|
+
#
|
137
|
+
# @since 2.0.0
|
138
|
+
def stop!
|
139
|
+
@thread.kill && @thread.stop?
|
140
|
+
end
|
141
|
+
|
142
|
+
private
|
143
|
+
|
144
|
+
def average_round_trip_time(start)
|
145
|
+
new_rtt = Time.now - start
|
146
|
+
RTT_WEIGHT_FACTOR * new_rtt + (1 - RTT_WEIGHT_FACTOR) * (@last_round_trip_time || new_rtt)
|
147
|
+
end
|
148
|
+
|
149
|
+
def calculate_average_round_trip_time(start)
|
150
|
+
@last_round_trip_time = average_round_trip_time(start)
|
151
|
+
end
|
152
|
+
|
153
|
+
def ismaster
|
154
|
+
@mutex.synchronize do
|
155
|
+
start = Time.now
|
156
|
+
begin
|
157
|
+
result = connection.dispatch([ ISMASTER ]).documents[0]
|
158
|
+
return result, calculate_average_round_trip_time(start)
|
159
|
+
rescue Exception => e
|
160
|
+
log_debug([ e.message ])
|
161
|
+
return {}, calculate_average_round_trip_time(start)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
def throttle_scan_frequency!
|
167
|
+
if @last_scan
|
168
|
+
difference = (Time.now - @last_scan)
|
169
|
+
throttle_time = (MIN_SCAN_FREQUENCY - difference)
|
170
|
+
sleep(throttle_time) if throttle_time > 0
|
171
|
+
end
|
172
|
+
@last_scan = Time.now
|
173
|
+
end
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
data/lib/mongo/server.rb
ADDED
@@ -0,0 +1,163 @@
|
|
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/connectable'
|
16
|
+
require 'mongo/server/connection'
|
17
|
+
require 'mongo/server/connection_pool'
|
18
|
+
require 'mongo/server/context'
|
19
|
+
require 'mongo/server/description'
|
20
|
+
require 'mongo/server/monitor'
|
21
|
+
|
22
|
+
module Mongo
|
23
|
+
|
24
|
+
# Represents a single server on the server side that can be standalone, part of
|
25
|
+
# a replica set, or a mongos.
|
26
|
+
#
|
27
|
+
# @since 2.0.0
|
28
|
+
class Server
|
29
|
+
extend Forwardable
|
30
|
+
|
31
|
+
# @return [ String ] The configured address for the server.
|
32
|
+
attr_reader :address
|
33
|
+
|
34
|
+
# @return [ Monitor ] monitor The server monitor.
|
35
|
+
attr_reader :monitor
|
36
|
+
|
37
|
+
# @return [ Hash ] The options hash.
|
38
|
+
attr_reader :options
|
39
|
+
|
40
|
+
# Get the description from the monitor and scan on monitor.
|
41
|
+
def_delegators :monitor, :description, :scan!
|
42
|
+
|
43
|
+
# Delegate convenience methods to the monitor description.
|
44
|
+
def_delegators :description,
|
45
|
+
:arbiter?,
|
46
|
+
:features,
|
47
|
+
:ghost?,
|
48
|
+
:max_wire_version,
|
49
|
+
:max_write_batch_size,
|
50
|
+
:max_bson_object_size,
|
51
|
+
:max_message_size,
|
52
|
+
:tags,
|
53
|
+
:average_round_trip_time,
|
54
|
+
:mongos?,
|
55
|
+
:other?,
|
56
|
+
:primary?,
|
57
|
+
:replica_set_name,
|
58
|
+
:secondary?,
|
59
|
+
:standalone?,
|
60
|
+
:unknown?
|
61
|
+
|
62
|
+
# Is this server equal to another?
|
63
|
+
#
|
64
|
+
# @example Is the server equal to the other?
|
65
|
+
# server == other
|
66
|
+
#
|
67
|
+
# @param [ Object ] other The object to compare to.
|
68
|
+
#
|
69
|
+
# @return [ true, false ] If the servers are equal.
|
70
|
+
#
|
71
|
+
# @since 2.0.0
|
72
|
+
def ==(other)
|
73
|
+
return false unless other.is_a?(Server)
|
74
|
+
address == other.address
|
75
|
+
end
|
76
|
+
|
77
|
+
# Get a new context for this server in which to send messages.
|
78
|
+
#
|
79
|
+
# @example Get the server context.
|
80
|
+
# server.context
|
81
|
+
#
|
82
|
+
# @return [ Mongo::Server::Context ] context The server context.
|
83
|
+
#
|
84
|
+
# @since 2.0.0
|
85
|
+
def context
|
86
|
+
Context.new(self)
|
87
|
+
end
|
88
|
+
|
89
|
+
# Disconnect the server from the connection.
|
90
|
+
#
|
91
|
+
# @example Disconnect the server.
|
92
|
+
# server.disconnect!
|
93
|
+
#
|
94
|
+
# @return [ true ] Always tru with no exception.
|
95
|
+
#
|
96
|
+
# @since 2.0.0
|
97
|
+
def disconnect!
|
98
|
+
context.with_connection do |connection|
|
99
|
+
connection.disconnect!
|
100
|
+
end
|
101
|
+
monitor.stop! and true
|
102
|
+
end
|
103
|
+
|
104
|
+
# Instantiate a new server object. Will start the background refresh and
|
105
|
+
# subscribe to the appropriate events.
|
106
|
+
#
|
107
|
+
# @example Initialize the server.
|
108
|
+
# Mongo::Server.new('127.0.0.1:27017', listeners)
|
109
|
+
#
|
110
|
+
# @param [ Address ] address The host:port address to connect to.
|
111
|
+
# @param [ Event::Listeners ] event_listeners The event listeners.
|
112
|
+
# @param [ Hash ] options The server options.
|
113
|
+
#
|
114
|
+
# @since 2.0.0
|
115
|
+
def initialize(address, event_listeners, options = {})
|
116
|
+
@address = address
|
117
|
+
@options = options.freeze
|
118
|
+
@monitor = Monitor.new(address, event_listeners, options)
|
119
|
+
monitor.scan!
|
120
|
+
monitor.run!
|
121
|
+
end
|
122
|
+
|
123
|
+
# Get a pretty printed server inspection.
|
124
|
+
#
|
125
|
+
# @example Get the server inspection.
|
126
|
+
# server.inspec
|
127
|
+
#
|
128
|
+
# @return [ String ] The nice inspection string.
|
129
|
+
#
|
130
|
+
# @since 2.0.0
|
131
|
+
def inspect
|
132
|
+
"#<Mongo::Server:0x#{object_id} address=#{address.host}:#{address.port}>"
|
133
|
+
end
|
134
|
+
|
135
|
+
# Get the connection pool for this server.
|
136
|
+
#
|
137
|
+
# @example Get the connection pool for the server.
|
138
|
+
# server.pool
|
139
|
+
#
|
140
|
+
# @return [ Mongo::Pool ] The connection pool.
|
141
|
+
#
|
142
|
+
# @since 2.0.0
|
143
|
+
def pool
|
144
|
+
@pool ||= ConnectionPool.get(self)
|
145
|
+
end
|
146
|
+
|
147
|
+
# Determine if the provided tags are a subset of the server's tags.
|
148
|
+
#
|
149
|
+
# @example Are the provided tags a subset of the server's tags.
|
150
|
+
# server.matches_tag_set?({ 'rack' => 'a', 'dc' => 'nyc' })
|
151
|
+
#
|
152
|
+
# @param [ Hash ] tag_set The tag set to compare to the server's tags.
|
153
|
+
#
|
154
|
+
# @return [ true, false ] If the provided tags are a subset of the server's tags.
|
155
|
+
#
|
156
|
+
# @since 2.0.0
|
157
|
+
def matches_tag_set?(tag_set)
|
158
|
+
tag_set.keys.all? do |k|
|
159
|
+
tags[k] && tags[k] == tag_set[k]
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
@@ -0,0 +1,94 @@
|
|
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
|
+
module ServerSelector
|
17
|
+
|
18
|
+
# Encapsulates specifications for selecting near servers given a list
|
19
|
+
# of candidates.
|
20
|
+
#
|
21
|
+
# @since 2.0.0
|
22
|
+
class Nearest
|
23
|
+
include Selectable
|
24
|
+
|
25
|
+
# Get the name of the server mode type.
|
26
|
+
#
|
27
|
+
# @example Get the name of the server mode for this preference.
|
28
|
+
# preference.name
|
29
|
+
#
|
30
|
+
# @return [ Symbol ] :nearest
|
31
|
+
#
|
32
|
+
# @since 2.0.0
|
33
|
+
def name
|
34
|
+
:nearest
|
35
|
+
end
|
36
|
+
|
37
|
+
# Whether the slaveOk bit should be set on wire protocol messages.
|
38
|
+
# I.e. whether the operation can be performed on a secondary server.
|
39
|
+
#
|
40
|
+
# @return [ true ] true
|
41
|
+
#
|
42
|
+
# @since 2.0.0
|
43
|
+
def slave_ok?
|
44
|
+
true
|
45
|
+
end
|
46
|
+
|
47
|
+
# Whether tag sets are allowed to be defined for this server preference.
|
48
|
+
#
|
49
|
+
# @return [ true ] true
|
50
|
+
#
|
51
|
+
# @since 2.0.0
|
52
|
+
def tags_allowed?
|
53
|
+
true
|
54
|
+
end
|
55
|
+
|
56
|
+
# Convert this server preference definition into a format appropriate
|
57
|
+
# for a mongos server.
|
58
|
+
#
|
59
|
+
# @example Convert this server preference definition into a format
|
60
|
+
# for mongos.
|
61
|
+
# preference = Mongo::ServerSelector::Nearest.new
|
62
|
+
# preference.to_mongos
|
63
|
+
#
|
64
|
+
# @return [ Hash ] The server preference formatted for a mongos server.
|
65
|
+
#
|
66
|
+
# @since 2.0.0
|
67
|
+
def to_mongos
|
68
|
+
preference = { :mode => 'nearest' }
|
69
|
+
preference.merge!({ :tags => tag_sets }) unless tag_sets.empty?
|
70
|
+
preference
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
# Select the near servers taking into account any defined tag sets and
|
76
|
+
# local threshold between the nearest server and other servers.
|
77
|
+
#
|
78
|
+
# @example Select nearest servers given a list of candidates.
|
79
|
+
# preference = Mongo::Serverreference::Nearest.new
|
80
|
+
# preference.select_server(cluster)
|
81
|
+
#
|
82
|
+
# @return [ Array ] The nearest servers from the list of candidates.
|
83
|
+
#
|
84
|
+
# @since 2.0.0
|
85
|
+
def select(candidates)
|
86
|
+
if tag_sets.empty?
|
87
|
+
near_servers(candidates)
|
88
|
+
else
|
89
|
+
near_servers(match_tag_sets(candidates))
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
@@ -0,0 +1,88 @@
|
|
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
|
+
|
17
|
+
module ServerSelector
|
18
|
+
|
19
|
+
# Encapsulates specifications for selecting the primary server given a list
|
20
|
+
# of candidates.
|
21
|
+
#
|
22
|
+
# @since 2.0.0
|
23
|
+
class Primary
|
24
|
+
include Selectable
|
25
|
+
|
26
|
+
# Get the name of the server mode type.
|
27
|
+
#
|
28
|
+
# @example Get the name of the server mode for this preference.
|
29
|
+
# preference.name
|
30
|
+
#
|
31
|
+
# @return [ Symbol ] :primary
|
32
|
+
#
|
33
|
+
# @since 2.0.0
|
34
|
+
def name
|
35
|
+
:primary
|
36
|
+
end
|
37
|
+
|
38
|
+
# Whether the slaveOk bit should be set on wire protocol messages.
|
39
|
+
# I.e. whether the operation can be performed on a secondary server.
|
40
|
+
#
|
41
|
+
# @return [ false ] false
|
42
|
+
#
|
43
|
+
# @since 2.0.0
|
44
|
+
def slave_ok?
|
45
|
+
false
|
46
|
+
end
|
47
|
+
|
48
|
+
# Whether tag sets are allowed to be defined for this server preference.
|
49
|
+
#
|
50
|
+
# @return [ false ] false
|
51
|
+
#
|
52
|
+
# @since 2.0.0
|
53
|
+
def tags_allowed?
|
54
|
+
false
|
55
|
+
end
|
56
|
+
|
57
|
+
# Convert this server preference definition into a format appropriate
|
58
|
+
# for a mongos server.
|
59
|
+
#
|
60
|
+
# @example Convert this server preference definition into a format
|
61
|
+
# for mongos.
|
62
|
+
# preference = Mongo::ServerSelector::Primary.new
|
63
|
+
# preference.to_mongos
|
64
|
+
#
|
65
|
+
# @return [ nil ] nil
|
66
|
+
#
|
67
|
+
# @since 2.0.0
|
68
|
+
def to_mongos
|
69
|
+
nil
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
# Select the primary server from a list of candidates.
|
75
|
+
#
|
76
|
+
# @example Select the primary server given a list of candidates.
|
77
|
+
# preference = Mongo::ServerSelector::Primary.new
|
78
|
+
# preference.select([candidate_1, candidate_2])
|
79
|
+
#
|
80
|
+
# @return [ Array ] The primary server from the list of candidates.
|
81
|
+
#
|
82
|
+
# @since 2.0.0
|
83
|
+
def select(candidates)
|
84
|
+
primary(candidates)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,94 @@
|
|
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
|
+
|
17
|
+
module ServerSelector
|
18
|
+
|
19
|
+
# Encapsulates specifications for selecting servers, with the
|
20
|
+
# primary preferred, given a list of candidates.
|
21
|
+
#
|
22
|
+
# @since 2.0.0
|
23
|
+
class PrimaryPreferred
|
24
|
+
include Selectable
|
25
|
+
|
26
|
+
# Get the name of the server mode type.
|
27
|
+
#
|
28
|
+
# @example Get the name of the server mode for this preference.
|
29
|
+
# preference.name
|
30
|
+
#
|
31
|
+
# @return [ Symbol ] :primary_preferred
|
32
|
+
#
|
33
|
+
# @since 2.0.0
|
34
|
+
def name
|
35
|
+
:primary_preferred
|
36
|
+
end
|
37
|
+
|
38
|
+
# Whether the slaveOk bit should be set on wire protocol messages.
|
39
|
+
# I.e. whether the operation can be performed on a secondary server.
|
40
|
+
#
|
41
|
+
# @return [ true ] true
|
42
|
+
#
|
43
|
+
# @since 2.0.0
|
44
|
+
def slave_ok?
|
45
|
+
true
|
46
|
+
end
|
47
|
+
|
48
|
+
# Whether tag sets are allowed to be defined for this server preference.
|
49
|
+
#
|
50
|
+
# @return [ true ] true
|
51
|
+
#
|
52
|
+
# @since 2.0.0
|
53
|
+
def tags_allowed?
|
54
|
+
true
|
55
|
+
end
|
56
|
+
|
57
|
+
# Convert this server preference definition into a format appropriate
|
58
|
+
# for a mongos server.
|
59
|
+
#
|
60
|
+
# @example Convert this server preference definition into a format
|
61
|
+
# for mongos.
|
62
|
+
# preference = Mongo::ServerSelector::PrimaryPreferred.new
|
63
|
+
# preference.to_mongos
|
64
|
+
#
|
65
|
+
# @return [ Hash ] The server preference formatted for a mongos server.
|
66
|
+
#
|
67
|
+
# @since 2.0.0
|
68
|
+
def to_mongos
|
69
|
+
preference = { :mode => 'primaryPreferred' }
|
70
|
+
preference.merge!({ :tags => tag_sets }) unless tag_sets.empty?
|
71
|
+
preference
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
# Select servers taking into account any defined tag sets and
|
77
|
+
# local threshold, with the primary preferred.
|
78
|
+
#
|
79
|
+
# @example Select servers given a list of candidates,
|
80
|
+
# with the primary preferred.
|
81
|
+
# preference = Mongo::ServerSelector::PrimaryPreferred.new
|
82
|
+
# preference.select([candidate_1, candidate_2])
|
83
|
+
#
|
84
|
+
# @return [ Array ] A list of servers matching tag sets and acceptable
|
85
|
+
# latency with the primary preferred.
|
86
|
+
#
|
87
|
+
# @since 2.0.0
|
88
|
+
def select(candidates)
|
89
|
+
primary = primary(candidates)
|
90
|
+
primary.first ? primary : near_servers(secondaries(candidates))
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|