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,132 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
class Cluster
|
17
|
+
module Topology
|
18
|
+
|
19
|
+
# Defines behaviour for when a cluster is in sharded topology.
|
20
|
+
#
|
21
|
+
# @since 2.0.0
|
22
|
+
class Sharded
|
23
|
+
|
24
|
+
# The display name for the topology.
|
25
|
+
#
|
26
|
+
# @since 2.0.0
|
27
|
+
NAME = 'Sharded'.freeze
|
28
|
+
|
29
|
+
# Get the display name.
|
30
|
+
#
|
31
|
+
# @example Get the display name.
|
32
|
+
# Sharded.display_name
|
33
|
+
#
|
34
|
+
# @return [ String ] The display name.
|
35
|
+
#
|
36
|
+
# @since 2.0.0
|
37
|
+
def display_name
|
38
|
+
NAME
|
39
|
+
end
|
40
|
+
|
41
|
+
# Elect a primary server within this topology.
|
42
|
+
#
|
43
|
+
# @example Elect a primary server.
|
44
|
+
# topology.elect_primary(description, servers)
|
45
|
+
#
|
46
|
+
# @param [ Server::Description ] description The description of the
|
47
|
+
# elected primary.
|
48
|
+
# @param [ Array<Server> ] servers The list of known servers to the
|
49
|
+
# cluster.
|
50
|
+
#
|
51
|
+
# @return [ Sharded ] The topology.
|
52
|
+
def elect_primary(description, servers); self; end
|
53
|
+
|
54
|
+
# Initialize the topology with the options.
|
55
|
+
#
|
56
|
+
# @example Initialize the topology.
|
57
|
+
# Sharded.new(options)
|
58
|
+
#
|
59
|
+
# @param [ Hash ] options The options.
|
60
|
+
#
|
61
|
+
# @since 2.0.0
|
62
|
+
def initialize(options)
|
63
|
+
@options = options
|
64
|
+
end
|
65
|
+
|
66
|
+
# A sharded topology is not a replica set.
|
67
|
+
#
|
68
|
+
# @example Is the topology a replica set?
|
69
|
+
# Sharded.replica_set?
|
70
|
+
#
|
71
|
+
# @return [ false ] Always false.
|
72
|
+
#
|
73
|
+
# @since 2.0.0
|
74
|
+
def replica_set?; false; end
|
75
|
+
|
76
|
+
# Sharded topologies have no replica set name.
|
77
|
+
#
|
78
|
+
# @example Get the replica set name.
|
79
|
+
# sharded.replica_set_name
|
80
|
+
#
|
81
|
+
# @return [ nil ] Always nil.
|
82
|
+
#
|
83
|
+
# @since 2.0.0
|
84
|
+
def replica_set_name; nil; end
|
85
|
+
|
86
|
+
# Select appropriate servers for this topology.
|
87
|
+
#
|
88
|
+
# @example Select the servers.
|
89
|
+
# Sharded.servers(servers)
|
90
|
+
#
|
91
|
+
# @param [ Array<Server> ] servers The known servers.
|
92
|
+
#
|
93
|
+
# @return [ Array<Server> ] The mongos servers.
|
94
|
+
#
|
95
|
+
# @since 2.0.0
|
96
|
+
def servers(servers)
|
97
|
+
servers.select{ |server| server.mongos? }
|
98
|
+
end
|
99
|
+
|
100
|
+
# A sharded topology is sharded.
|
101
|
+
#
|
102
|
+
# @example Is the topology sharded?
|
103
|
+
# Sharded.sharded?
|
104
|
+
#
|
105
|
+
# @return [ true ] Always true.
|
106
|
+
#
|
107
|
+
# @since 2.0.0
|
108
|
+
def sharded?; true; end
|
109
|
+
|
110
|
+
# A sharded topology is not standalone.
|
111
|
+
#
|
112
|
+
# @example Is the topology standalone?
|
113
|
+
# Sharded.standalone?
|
114
|
+
#
|
115
|
+
# @return [ false ] Always false.
|
116
|
+
#
|
117
|
+
# @since 2.0.0
|
118
|
+
def standalone?; false; end
|
119
|
+
|
120
|
+
# A sharded topology is not unknown.
|
121
|
+
#
|
122
|
+
# @example Is the topology unknown?
|
123
|
+
# Sharded.unknown?
|
124
|
+
#
|
125
|
+
# @return [ false ] Always false.
|
126
|
+
#
|
127
|
+
# @since 2.0.0
|
128
|
+
def unknown?; false; end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,132 @@
|
|
1
|
+
# Copyright (C) 2014-2015 MongoDB, Inc.
|
2
|
+
#
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
4
|
+
# you may not use this file except in compliance with the License.
|
5
|
+
# You may obtain a copy of the License at
|
6
|
+
#
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
8
|
+
#
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
12
|
+
# See the License for the specific language governing permissions and
|
13
|
+
# limitations under the License.
|
14
|
+
|
15
|
+
module Mongo
|
16
|
+
class Cluster
|
17
|
+
module Topology
|
18
|
+
|
19
|
+
# Defines behaviour for when a cluster is in standalone topology.
|
20
|
+
#
|
21
|
+
# @since 2.0.0
|
22
|
+
class Standalone
|
23
|
+
|
24
|
+
# The display name for the topology.
|
25
|
+
#
|
26
|
+
# @since 2.0.0
|
27
|
+
NAME = 'Standalone'.freeze
|
28
|
+
|
29
|
+
# Get the display name.
|
30
|
+
#
|
31
|
+
# @example Get the display name.
|
32
|
+
# Standalone.display_name
|
33
|
+
#
|
34
|
+
# @return [ String ] The display name.
|
35
|
+
#
|
36
|
+
# @since 2.0.0
|
37
|
+
def display_name
|
38
|
+
NAME
|
39
|
+
end
|
40
|
+
|
41
|
+
# Elect a primary server within this topology.
|
42
|
+
#
|
43
|
+
# @example Elect a primary server.
|
44
|
+
# topology.elect_primary(description, servers)
|
45
|
+
#
|
46
|
+
# @param [ Server::Description ] description The description of the
|
47
|
+
# elected primary.
|
48
|
+
# @param [ Array<Server> ] servers The list of known servers to the
|
49
|
+
# cluster.
|
50
|
+
#
|
51
|
+
# @return [ Standalone ] The topology.
|
52
|
+
def elect_primary(description, servers); self; end
|
53
|
+
|
54
|
+
# Initialize the topology with the options.
|
55
|
+
#
|
56
|
+
# @example Initialize the topology.
|
57
|
+
# Standalone.new(options)
|
58
|
+
#
|
59
|
+
# @param [ Hash ] options The options.
|
60
|
+
#
|
61
|
+
# @since 2.0.0
|
62
|
+
def initialize(options)
|
63
|
+
@options = options
|
64
|
+
end
|
65
|
+
|
66
|
+
# A standalone topology is not a replica set.
|
67
|
+
#
|
68
|
+
# @example Is the topology a replica set?
|
69
|
+
# Sharded.replica_set?
|
70
|
+
#
|
71
|
+
# @return [ false ] Always false.
|
72
|
+
#
|
73
|
+
# @since 2.0.0
|
74
|
+
def replica_set?; false; end
|
75
|
+
|
76
|
+
# Standalone topologies have no replica set name.
|
77
|
+
#
|
78
|
+
# @example Get the replica set name.
|
79
|
+
# standalone.replica_set_name
|
80
|
+
#
|
81
|
+
# @return [ nil ] Always nil.
|
82
|
+
#
|
83
|
+
# @since 2.0.0
|
84
|
+
def replica_set_name; nil; end
|
85
|
+
|
86
|
+
# Select appropriate servers for this topology.
|
87
|
+
#
|
88
|
+
# @example Select the servers.
|
89
|
+
# Standalone.servers(servers, 'test')
|
90
|
+
#
|
91
|
+
# @param [ Array<Server> ] servers The known servers.
|
92
|
+
#
|
93
|
+
# @return [ Array<Server> ] The standalone servers.
|
94
|
+
#
|
95
|
+
# @since 2.0.0
|
96
|
+
def servers(servers, name = nil)
|
97
|
+
[ servers.detect{ |server| server.standalone? } ]
|
98
|
+
end
|
99
|
+
|
100
|
+
# A standalone topology is not sharded.
|
101
|
+
#
|
102
|
+
# @example Is the topology sharded?
|
103
|
+
# Standalone.sharded?
|
104
|
+
#
|
105
|
+
# @return [ false ] Always false.
|
106
|
+
#
|
107
|
+
# @since 2.0.0
|
108
|
+
def sharded?; false; end
|
109
|
+
|
110
|
+
# A standalone topology is standalone.
|
111
|
+
#
|
112
|
+
# @example Is the topology standalone?
|
113
|
+
# Standalone.standalone?
|
114
|
+
#
|
115
|
+
# @return [ true ] Always true.
|
116
|
+
#
|
117
|
+
# @since 2.0.0
|
118
|
+
def standalone?; true; end
|
119
|
+
|
120
|
+
# An standalone topology is not unknown.
|
121
|
+
#
|
122
|
+
# @example Is the topology unknown?
|
123
|
+
# Standalone.unknown?
|
124
|
+
#
|
125
|
+
# @return [ false ] Always false.
|
126
|
+
#
|
127
|
+
# @since 2.0.0
|
128
|
+
def unknown?; false; end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -0,0 +1,155 @@
|
|
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 Cluster
|
17
|
+
module Topology
|
18
|
+
|
19
|
+
# Defines behaviour for when a cluster is in an unknown state.
|
20
|
+
#
|
21
|
+
# @since 2.0.0
|
22
|
+
class Unknown
|
23
|
+
include Loggable
|
24
|
+
|
25
|
+
# The display name for the topology.
|
26
|
+
#
|
27
|
+
# @since 2.0.0
|
28
|
+
NAME = 'Unknown'.freeze
|
29
|
+
|
30
|
+
# @return [ Hash ] options The options.
|
31
|
+
attr_reader :options
|
32
|
+
|
33
|
+
# Get the display name.
|
34
|
+
#
|
35
|
+
# @example Get the display name.
|
36
|
+
# Unknown.display_name
|
37
|
+
#
|
38
|
+
# @return [ String ] The display name.
|
39
|
+
#
|
40
|
+
# @since 2.0.0
|
41
|
+
def display_name
|
42
|
+
NAME
|
43
|
+
end
|
44
|
+
|
45
|
+
# Elect a primary server within this topology.
|
46
|
+
#
|
47
|
+
# @example Elect a primary server.
|
48
|
+
# topology.elect_primary(description, servers)
|
49
|
+
#
|
50
|
+
# @param [ Server::Description ] description The description of the
|
51
|
+
# elected primary.
|
52
|
+
# @param [ Array<Server> ] servers The list of known servers to the
|
53
|
+
# cluster.
|
54
|
+
#
|
55
|
+
# @return [ Sharded, ReplicaSet ] The new topology.
|
56
|
+
def elect_primary(description, servers)
|
57
|
+
if description.mongos?
|
58
|
+
log_debug([ "Mongos #{description.address.to_s} discovered." ])
|
59
|
+
Sharded.new(options)
|
60
|
+
else
|
61
|
+
initialize_replica_set(description, servers)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# Initialize the topology with the options.
|
66
|
+
#
|
67
|
+
# @example Initialize the topology.
|
68
|
+
# Unknown.new(options)
|
69
|
+
#
|
70
|
+
# @param [ Hash ] options The options.
|
71
|
+
#
|
72
|
+
# @since 2.0.0
|
73
|
+
def initialize(options)
|
74
|
+
@options = options
|
75
|
+
end
|
76
|
+
|
77
|
+
# An unknown topology is not a replica set.
|
78
|
+
#
|
79
|
+
# @example Is the topology a replica set?
|
80
|
+
# Unknown.replica_set?
|
81
|
+
#
|
82
|
+
# @return [ false ] Always false.
|
83
|
+
#
|
84
|
+
# @since 2.0.0
|
85
|
+
def replica_set?; false; end
|
86
|
+
|
87
|
+
# Unknown topologies have no replica set name.
|
88
|
+
#
|
89
|
+
# @example Get the replica set name.
|
90
|
+
# unknown.replica_set_name
|
91
|
+
#
|
92
|
+
# @return [ nil ] Always nil.
|
93
|
+
#
|
94
|
+
# @since 2.0.0
|
95
|
+
def replica_set_name; nil; end
|
96
|
+
|
97
|
+
# Select appropriate servers for this topology.
|
98
|
+
#
|
99
|
+
# @example Select the servers.
|
100
|
+
# Unknown.servers(servers)
|
101
|
+
#
|
102
|
+
# @param [ Array<Server> ] servers The known servers.
|
103
|
+
#
|
104
|
+
# @raise [ Unknown ] Cannot select servers when the topology is
|
105
|
+
# unknown.
|
106
|
+
#
|
107
|
+
# @since 2.0.0
|
108
|
+
def servers(servers)
|
109
|
+
end
|
110
|
+
|
111
|
+
# An unknown topology is not sharded.
|
112
|
+
#
|
113
|
+
# @example Is the topology sharded?
|
114
|
+
# Unknown.sharded?
|
115
|
+
#
|
116
|
+
# @return [ false ] Always false.
|
117
|
+
#
|
118
|
+
# @since 2.0.0
|
119
|
+
def sharded?; false; end
|
120
|
+
|
121
|
+
# An unknown topology is not standalone.
|
122
|
+
#
|
123
|
+
# @example Is the topology standalone?
|
124
|
+
# Unknown.standalone?
|
125
|
+
#
|
126
|
+
# @return [ true ] Always false.
|
127
|
+
#
|
128
|
+
# @since 2.0.0
|
129
|
+
def standalone?; false; end
|
130
|
+
|
131
|
+
# An unknown topology is unknown.
|
132
|
+
#
|
133
|
+
# @example Is the topology unknown?
|
134
|
+
# Unknown.unknown?
|
135
|
+
#
|
136
|
+
# @return [ true ] Always true.
|
137
|
+
#
|
138
|
+
# @since 2.0.0
|
139
|
+
def unknown?; true; end
|
140
|
+
|
141
|
+
private
|
142
|
+
|
143
|
+
def initialize_replica_set(description, servers)
|
144
|
+
log_debug([ "Server #{description.address.to_s} discovered as primary." ])
|
145
|
+
servers.each do |server|
|
146
|
+
if server.standalone? && server.address != description.address
|
147
|
+
server.description.unknown!
|
148
|
+
end
|
149
|
+
end
|
150
|
+
ReplicaSet.new(options.merge(:replica_set => description.replica_set_name))
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,60 @@
|
|
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/cluster/topology/replica_set'
|
16
|
+
require 'mongo/cluster/topology/sharded'
|
17
|
+
require 'mongo/cluster/topology/standalone'
|
18
|
+
require 'mongo/cluster/topology/unknown'
|
19
|
+
|
20
|
+
module Mongo
|
21
|
+
class Cluster
|
22
|
+
|
23
|
+
# Defines behaviour for getting servers.
|
24
|
+
#
|
25
|
+
# @since 2.0.0
|
26
|
+
module Topology
|
27
|
+
extend self
|
28
|
+
|
29
|
+
# The 2 various topologies for server selection.
|
30
|
+
#
|
31
|
+
# @since 2.0.0
|
32
|
+
OPTIONS = {
|
33
|
+
replica_set: ReplicaSet,
|
34
|
+
sharded: Sharded,
|
35
|
+
direct: Standalone
|
36
|
+
}
|
37
|
+
|
38
|
+
# Get the initial cluster topology for the provided options.
|
39
|
+
#
|
40
|
+
# @example Get the initial cluster topology.
|
41
|
+
# Topology.initial(topology: :replica_set)
|
42
|
+
#
|
43
|
+
# @param [ Hash ] options The cluster options.
|
44
|
+
#
|
45
|
+
# @return [ ReplicaSet, Sharded, Standalone ] The topology.
|
46
|
+
#
|
47
|
+
# @since 2.0.0
|
48
|
+
def initial(seeds, options)
|
49
|
+
if options.has_key?(:connect)
|
50
|
+
return OPTIONS.fetch(options[:connect]).new(options)
|
51
|
+
end
|
52
|
+
if options.has_key?(:replica_set)
|
53
|
+
ReplicaSet.new(options)
|
54
|
+
else
|
55
|
+
seeds.size > 1 ? Unknown.new(options) : Standalone.new(options)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,203 @@
|
|
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/cluster/topology'
|
16
|
+
|
17
|
+
module Mongo
|
18
|
+
|
19
|
+
# Represents a group of servers on the server side, either as a single server, a
|
20
|
+
# replica set, or a single or multiple mongos.
|
21
|
+
#
|
22
|
+
# @since 2.0.0
|
23
|
+
class Cluster
|
24
|
+
extend Forwardable
|
25
|
+
include Event::Subscriber
|
26
|
+
include Loggable
|
27
|
+
|
28
|
+
# @return [ Array<String> ] The provided seed addresses.
|
29
|
+
attr_reader :addresses
|
30
|
+
|
31
|
+
# @return [ Hash ] The options hash.
|
32
|
+
attr_reader :options
|
33
|
+
|
34
|
+
# @return [ Object ] The cluster topology.
|
35
|
+
attr_reader :topology
|
36
|
+
|
37
|
+
def_delegators :topology, :replica_set?, :replica_set_name, :sharded?, :standalone?, :unknown?
|
38
|
+
|
39
|
+
# Determine if this cluster of servers is equal to another object. Checks the
|
40
|
+
# servers currently in the cluster, not what was configured.
|
41
|
+
#
|
42
|
+
# @example Is the cluster equal to the object?
|
43
|
+
# cluster == other
|
44
|
+
#
|
45
|
+
# @param [ Object ] other The object to compare to.
|
46
|
+
#
|
47
|
+
# @return [ true, false ] If the objects are equal.
|
48
|
+
#
|
49
|
+
# @since 2.0.0
|
50
|
+
def ==(other)
|
51
|
+
return false unless other.is_a?(Cluster)
|
52
|
+
addresses == other.addresses && options == other.options
|
53
|
+
end
|
54
|
+
|
55
|
+
# Add a server to the cluster with the provided address. Useful in
|
56
|
+
# auto-discovery of new servers when an existing server executes an ismaster
|
57
|
+
# and potentially non-configured servers were included.
|
58
|
+
#
|
59
|
+
# @example Add the server for the address to the cluster.
|
60
|
+
# cluster.add('127.0.0.1:27018')
|
61
|
+
#
|
62
|
+
# @param [ String ] host The address of the server to add.
|
63
|
+
#
|
64
|
+
# @return [ Server ] The newly added server, if not present already.
|
65
|
+
#
|
66
|
+
# @since 2.0.0
|
67
|
+
def add(host)
|
68
|
+
address = Address.new(host)
|
69
|
+
unless addresses.include?(address)
|
70
|
+
log_debug([ "Adding #{address.to_s} to the cluster." ])
|
71
|
+
addresses.push(address)
|
72
|
+
server = Server.new(address, event_listeners, options)
|
73
|
+
@servers.push(server)
|
74
|
+
server
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# Instantiate the new cluster.
|
79
|
+
#
|
80
|
+
# @example Instantiate the cluster.
|
81
|
+
# Mongo::Cluster.new(["127.0.0.1:27017"])
|
82
|
+
#
|
83
|
+
# @param [ Array<String> ] seeds The addresses of the configured servers.
|
84
|
+
# @param [ Hash ] options The options.
|
85
|
+
#
|
86
|
+
# @since 2.0.0
|
87
|
+
def initialize(seeds, options = {})
|
88
|
+
@addresses = []
|
89
|
+
@servers = []
|
90
|
+
@event_listeners = Event::Listeners.new
|
91
|
+
@options = options.freeze
|
92
|
+
@topology = Topology.initial(seeds, options)
|
93
|
+
|
94
|
+
subscribe_to(Event::SERVER_ADDED, Event::ServerAdded.new(self))
|
95
|
+
subscribe_to(Event::SERVER_REMOVED, Event::ServerRemoved.new(self))
|
96
|
+
subscribe_to(Event::PRIMARY_ELECTED, Event::PrimaryElected.new(self))
|
97
|
+
|
98
|
+
seeds.each{ |seed| add(seed) }
|
99
|
+
end
|
100
|
+
|
101
|
+
# Get the nicer formatted string for use in inspection.
|
102
|
+
#
|
103
|
+
# @example Inspect the cluster.
|
104
|
+
# cluster.inspect
|
105
|
+
#
|
106
|
+
# @return [ String ] The cluster inspection.
|
107
|
+
#
|
108
|
+
# @since 2.0.0
|
109
|
+
def inspect
|
110
|
+
"#<Mongo::Cluster:0x#{object_id} servers=#{servers} topology=#{topology.display_name}>"
|
111
|
+
end
|
112
|
+
|
113
|
+
# Get the next primary server we can send an operation to.
|
114
|
+
#
|
115
|
+
# @example Get the next primary server.
|
116
|
+
# cluster.next_primary
|
117
|
+
#
|
118
|
+
# @return [ Mongo::Server ] A primary server.
|
119
|
+
#
|
120
|
+
# @since 2.0.0
|
121
|
+
def next_primary
|
122
|
+
ServerSelector.get({ mode: :primary }, options).select_server(self)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Elect a primary server from the description that has just changed to a
|
126
|
+
# primary.
|
127
|
+
#
|
128
|
+
# @example Elect a primary server.
|
129
|
+
# cluster.elect_primary!(description)
|
130
|
+
#
|
131
|
+
# @param [ Server::Description ] description The newly elected primary.
|
132
|
+
#
|
133
|
+
# @return [ Topology ] The cluster topology.
|
134
|
+
#
|
135
|
+
# @since 2.0.0
|
136
|
+
def elect_primary!(description)
|
137
|
+
@topology = topology.elect_primary(description, @servers)
|
138
|
+
end
|
139
|
+
|
140
|
+
# Removed the server from the cluster for the provided address, if it
|
141
|
+
# exists.
|
142
|
+
#
|
143
|
+
# @example Remove the server from the cluster.
|
144
|
+
# server.remove('127.0.0.1:27017')
|
145
|
+
#
|
146
|
+
# @param [ String ] host The host/port or socket address.
|
147
|
+
#
|
148
|
+
# @since 2.0.0
|
149
|
+
def remove(host)
|
150
|
+
log_debug([ "#{host} being removed from the cluster." ])
|
151
|
+
address = Address.new(host)
|
152
|
+
removed_servers = @servers.reject!{ |server| server.address == address }
|
153
|
+
removed_servers.each{ |server| server.disconnect! } if removed_servers
|
154
|
+
addresses.reject!{ |addr| addr == address }
|
155
|
+
end
|
156
|
+
|
157
|
+
# Force a scan of all known servers in the cluster.
|
158
|
+
#
|
159
|
+
# @example Force a full cluster scan.
|
160
|
+
# cluster.scan!
|
161
|
+
#
|
162
|
+
# @note This operation is done synchronously. If servers in the cluster are
|
163
|
+
# down or slow to respond this can potentially be a slow operation.
|
164
|
+
#
|
165
|
+
# @return [ true ] Always true.
|
166
|
+
#
|
167
|
+
# @since 2.0.0
|
168
|
+
def scan!
|
169
|
+
@servers.each{ |server| server.scan! } and true
|
170
|
+
end
|
171
|
+
|
172
|
+
# Get a list of server candidates from the cluster that can have operations
|
173
|
+
# executed on them.
|
174
|
+
#
|
175
|
+
# @example Get the server candidates for an operation.
|
176
|
+
# cluster.servers
|
177
|
+
#
|
178
|
+
# @return [ Array<Server> ] The candidate servers.
|
179
|
+
#
|
180
|
+
# @since 2.0.0
|
181
|
+
def servers
|
182
|
+
topology.servers(@servers)
|
183
|
+
end
|
184
|
+
|
185
|
+
# Create a cluster for the provided client, for use when we don't want the
|
186
|
+
# client's original cluster instance to be the same.
|
187
|
+
#
|
188
|
+
# @api private
|
189
|
+
#
|
190
|
+
# @example Create a cluster for the client.
|
191
|
+
# Cluster.create(client)
|
192
|
+
#
|
193
|
+
# @param [ Client ] client The client to create on.
|
194
|
+
#
|
195
|
+
# @return [ Cluster ] The cluster.
|
196
|
+
#
|
197
|
+
# @since 2.0.0
|
198
|
+
def self.create(client)
|
199
|
+
cluster = Cluster.new(client.cluster.addresses.map(&:to_s), client.options)
|
200
|
+
client.instance_variable_set(:@cluster, cluster)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|