neo4j-ruby-driver 5.7.0.alpha.4 → 6.0.3.alpha.0-java
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
- data/README.md +440 -40
- data/jruby/neo4j/driver/ext/async_converter.rb +55 -0
- data/jruby/neo4j/driver/ext/auth_tokens.rb +20 -0
- data/jruby/neo4j/driver/ext/config_converter.rb +83 -0
- data/jruby/neo4j/driver/ext/exception_checkable.rb +34 -0
- data/jruby/neo4j/driver/ext/exception_mapper.rb +92 -0
- data/jruby/neo4j/driver/ext/graph_database.rb +33 -0
- data/jruby/neo4j/driver/ext/internal/abstract_query_runner.rb +18 -0
- data/jruby/neo4j/driver/ext/internal/async/internal_async_session.rb +23 -0
- data/jruby/neo4j/driver/ext/internal/cluster/routing_table_registry_impl.rb +15 -0
- data/jruby/neo4j/driver/ext/internal/cursor/disposable_async_result_cursor.rb +15 -0
- data/jruby/neo4j/driver/ext/internal/driver_factory.rb +24 -0
- data/jruby/neo4j/driver/ext/internal/eager_result_value.rb +17 -0
- data/jruby/neo4j/driver/ext/internal/metrics/internal_connection_pool_metrics.rb +17 -0
- data/jruby/neo4j/driver/ext/internal/summary/internal_notification.rb +27 -0
- data/jruby/neo4j/driver/ext/internal/summary/internal_plan.rb +26 -0
- data/jruby/neo4j/driver/ext/internal/summary/internal_result_summary.rb +34 -0
- data/jruby/neo4j/driver/ext/internal_driver.rb +52 -0
- data/jruby/neo4j/driver/ext/internal_entity.rb +21 -0
- data/jruby/neo4j/driver/ext/internal_keys.rb +15 -0
- data/jruby/neo4j/driver/ext/internal_node.rb +13 -0
- data/jruby/neo4j/driver/ext/internal_record.rb +29 -0
- data/jruby/neo4j/driver/ext/internal_relationship.rb +13 -0
- data/jruby/neo4j/driver/ext/internal_result.rb +27 -0
- data/jruby/neo4j/driver/ext/internal_session.rb +44 -0
- data/jruby/neo4j/driver/ext/internal_transaction.rb +19 -0
- data/jruby/neo4j/driver/ext/logger.rb +60 -0
- data/jruby/neo4j/driver/ext/map_converter.rb +14 -0
- data/jruby/neo4j/driver/ext/neo_converter.rb +59 -0
- data/jruby/neo4j/driver/ext/query.rb +13 -0
- data/jruby/neo4j/driver/ext/ruby_converter.rb +57 -0
- data/jruby/neo4j/driver/ext/run_override.rb +22 -0
- data/jruby/neo4j/driver/ext/start_end_naming.rb +17 -0
- data/{ruby → jruby}/neo4j/driver/version.rb +1 -1
- data/jruby/neo4j/driver.rb +62 -0
- data/lib/neo4j/driver/{auto_closable.rb → auto_closeable.rb} +6 -6
- data/lib/neo4j/driver/exceptions/neo4j_exception.rb +6 -6
- data/lib/neo4j/driver/internal/deprecator.rb +15 -0
- metadata +91 -277
- data/ruby/neo4j/driver/access_mode.rb +0 -10
- data/ruby/neo4j/driver/auth_tokens.rb +0 -34
- data/ruby/neo4j/driver/bookmark.rb +0 -21
- data/ruby/neo4j/driver/config.rb +0 -89
- data/ruby/neo4j/driver/graph_database.rb +0 -78
- data/ruby/neo4j/driver/internal/async/connection/bolt_protocol_util.rb +0 -51
- data/ruby/neo4j/driver/internal/async/connection/bootstrap_factory.rb +0 -22
- data/ruby/neo4j/driver/internal/async/connection/channel_attributes.rb +0 -31
- data/ruby/neo4j/driver/internal/async/connection/channel_connected_listener.rb +0 -32
- data/ruby/neo4j/driver/internal/async/connection/channel_connector_impl.rb +0 -83
- data/ruby/neo4j/driver/internal/async/connection/channel_pipeline_builder_impl.rb +0 -22
- data/ruby/neo4j/driver/internal/async/connection/direct_connection.rb +0 -30
- data/ruby/neo4j/driver/internal/async/connection/event_loop_group_factory.rb +0 -83
- data/ruby/neo4j/driver/internal/async/connection/handshake_completed_listener.rb +0 -27
- data/ruby/neo4j/driver/internal/async/connection/handshake_handler.rb +0 -113
- data/ruby/neo4j/driver/internal/async/connection/netty_channel_initializer.rb +0 -57
- data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver.rb +0 -26
- data/ruby/neo4j/driver/internal/async/connection/netty_domain_name_resolver_group.rb +0 -19
- data/ruby/neo4j/driver/internal/async/connection/routing_connection.rb +0 -36
- data/ruby/neo4j/driver/internal/async/connection/stream.rb +0 -12
- data/ruby/neo4j/driver/internal/async/connection/stream_reader.rb +0 -16
- data/ruby/neo4j/driver/internal/async/connection_context.rb +0 -10
- data/ruby/neo4j/driver/internal/async/immutable_connection_context.rb +0 -24
- data/ruby/neo4j/driver/internal/async/inbound/byte_buf_input.rb +0 -30
- data/ruby/neo4j/driver/internal/async/inbound/channel_error_handler.rb +0 -77
- data/ruby/neo4j/driver/internal/async/inbound/chunk_decoder.rb +0 -41
- data/ruby/neo4j/driver/internal/async/inbound/connect_timeout_handler.rb +0 -32
- data/ruby/neo4j/driver/internal/async/inbound/connection_read_timeout_handler.rb +0 -17
- data/ruby/neo4j/driver/internal/async/inbound/inbound_message_dispatcher.rb +0 -171
- data/ruby/neo4j/driver/internal/async/inbound/inbound_message_handler.rb +0 -42
- data/ruby/neo4j/driver/internal/async/inbound/message_decoder.rb +0 -51
- data/ruby/neo4j/driver/internal/async/internal_async_session.rb +0 -98
- data/ruby/neo4j/driver/internal/async/internal_async_transaction.rb +0 -13
- data/ruby/neo4j/driver/internal/async/leak_logging_network_session.rb +0 -34
- data/ruby/neo4j/driver/internal/async/network_connection.rb +0 -194
- data/ruby/neo4j/driver/internal/async/network_session.rb +0 -150
- data/ruby/neo4j/driver/internal/async/outbound/chunk_aware_byte_buf_output.rb +0 -110
- data/ruby/neo4j/driver/internal/async/outbound/outbound_message_handler.rb +0 -39
- data/ruby/neo4j/driver/internal/async/pool/channel.rb +0 -66
- data/ruby/neo4j/driver/internal/async/pool/channel_pool.rb +0 -31
- data/ruby/neo4j/driver/internal/async/pool/channel_tracker.rb +0 -135
- data/ruby/neo4j/driver/internal/async/pool/connection_pool_impl.rb +0 -156
- data/ruby/neo4j/driver/internal/async/pool/netty_channel_health_checker.rb +0 -87
- data/ruby/neo4j/driver/internal/async/pool/netty_channel_pool.rb +0 -52
- data/ruby/neo4j/driver/internal/async/pool/network_connection_factory.rb +0 -21
- data/ruby/neo4j/driver/internal/async/pool/pool_settings.rb +0 -34
- data/ruby/neo4j/driver/internal/async/pool/timed_stack.rb +0 -15
- data/ruby/neo4j/driver/internal/async/result_cursors_holder.rb +0 -17
- data/ruby/neo4j/driver/internal/async/unmanaged_transaction.rb +0 -212
- data/ruby/neo4j/driver/internal/bookmark_holder.rb +0 -9
- data/ruby/neo4j/driver/internal/cluster/cluster_composition.rb +0 -48
- data/ruby/neo4j/driver/internal/cluster/cluster_composition_lookup_result.rb +0 -14
- data/ruby/neo4j/driver/internal/cluster/cluster_routing_table.rb +0 -122
- data/ruby/neo4j/driver/internal/cluster/identity_resolver.rb +0 -10
- data/ruby/neo4j/driver/internal/cluster/loadbalancing/least_connected_load_balancing_strategy.rb +0 -68
- data/ruby/neo4j/driver/internal/cluster/loadbalancing/load_balancer.rb +0 -125
- data/ruby/neo4j/driver/internal/cluster/loadbalancing/round_robin_array_index.rb +0 -13
- data/ruby/neo4j/driver/internal/cluster/multi_databases_routing_procedure_runner.rb +0 -31
- data/ruby/neo4j/driver/internal/cluster/rediscovery_impl.rb +0 -147
- data/ruby/neo4j/driver/internal/cluster/route_message_routing_procedure_runner.rb +0 -43
- data/ruby/neo4j/driver/internal/cluster/routing_context.rb +0 -77
- data/ruby/neo4j/driver/internal/cluster/routing_procedure_cluster_composition_provider.rb +0 -60
- data/ruby/neo4j/driver/internal/cluster/routing_procedure_response.rb +0 -35
- data/ruby/neo4j/driver/internal/cluster/routing_settings.rb +0 -24
- data/ruby/neo4j/driver/internal/cluster/routing_table_handler_impl.rb +0 -95
- data/ruby/neo4j/driver/internal/cluster/routing_table_registry_impl.rb +0 -121
- data/ruby/neo4j/driver/internal/cluster/single_database_routing_procedure_runner.rb +0 -73
- data/ruby/neo4j/driver/internal/connection_settings.rb +0 -16
- data/ruby/neo4j/driver/internal/cursor/async_result_cursor_impl.rb +0 -55
- data/ruby/neo4j/driver/internal/cursor/async_result_cursor_only_factory.rb +0 -24
- data/ruby/neo4j/driver/internal/cursor/disposable_async_result_cursor.rb +0 -61
- data/ruby/neo4j/driver/internal/cursor/result_cursor_factory_impl.rb +0 -24
- data/ruby/neo4j/driver/internal/cursor/rx_result_cursor_impl.rb +0 -110
- data/ruby/neo4j/driver/internal/database_name_util.rb +0 -37
- data/ruby/neo4j/driver/internal/default_bookmark_holder.rb +0 -9
- data/ruby/neo4j/driver/internal/default_domain_name_resolver.rb +0 -11
- data/ruby/neo4j/driver/internal/direct_connection_provider.rb +0 -40
- data/ruby/neo4j/driver/internal/driver_factory.rb +0 -126
- data/ruby/neo4j/driver/internal/handlers/begin_tx_response_handler.rb +0 -20
- data/ruby/neo4j/driver/internal/handlers/channel_releasing_reset_response_handler.rb +0 -30
- data/ruby/neo4j/driver/internal/handlers/commit_tx_response_handler.rb +0 -25
- data/ruby/neo4j/driver/internal/handlers/hello_response_handler.rb +0 -65
- data/ruby/neo4j/driver/internal/handlers/init_response_handler.rb +0 -34
- data/ruby/neo4j/driver/internal/handlers/legacy_pull_all_response_handler.rb +0 -199
- data/ruby/neo4j/driver/internal/handlers/no_op_response_handler.rb +0 -16
- data/ruby/neo4j/driver/internal/handlers/ping_response_handler.rb +0 -29
- data/ruby/neo4j/driver/internal/handlers/pull_handlers.rb +0 -32
- data/ruby/neo4j/driver/internal/handlers/pulln/auto_pull_response_handler.rb +0 -168
- data/ruby/neo4j/driver/internal/handlers/pulln/basic_pull_response_handler.rb +0 -298
- data/ruby/neo4j/driver/internal/handlers/pulln/fetch_size_util.rb +0 -20
- data/ruby/neo4j/driver/internal/handlers/reset_response_handler.rb +0 -34
- data/ruby/neo4j/driver/internal/handlers/rollback_tx_response_handler.rb +0 -25
- data/ruby/neo4j/driver/internal/handlers/route_message_response_handler.rb +0 -21
- data/ruby/neo4j/driver/internal/handlers/routing_response_handler.rb +0 -70
- data/ruby/neo4j/driver/internal/handlers/run_response_handler.rb +0 -38
- data/ruby/neo4j/driver/internal/handlers/session_pull_response_completion_listener.rb +0 -34
- data/ruby/neo4j/driver/internal/handlers/transaction_pull_response_completion_listener.rb +0 -20
- data/ruby/neo4j/driver/internal/impersonation_util.rb +0 -22
- data/ruby/neo4j/driver/internal/internal_bookmark.rb +0 -36
- data/ruby/neo4j/driver/internal/internal_database_name.rb +0 -9
- data/ruby/neo4j/driver/internal/internal_driver.rb +0 -74
- data/ruby/neo4j/driver/internal/internal_entity.rb +0 -21
- data/ruby/neo4j/driver/internal/internal_node.rb +0 -21
- data/ruby/neo4j/driver/internal/internal_pair.rb +0 -9
- data/ruby/neo4j/driver/internal/internal_path.rb +0 -35
- data/ruby/neo4j/driver/internal/internal_point2_d.rb +0 -9
- data/ruby/neo4j/driver/internal/internal_point3_d.rb +0 -6
- data/ruby/neo4j/driver/internal/internal_record.rb +0 -27
- data/ruby/neo4j/driver/internal/internal_relationship.rb +0 -27
- data/ruby/neo4j/driver/internal/internal_result.rb +0 -49
- data/ruby/neo4j/driver/internal/internal_session.rb +0 -81
- data/ruby/neo4j/driver/internal/internal_transaction.rb +0 -48
- data/ruby/neo4j/driver/internal/logging/channel_activity_logger.rb +0 -29
- data/ruby/neo4j/driver/internal/logging/channel_error_logger.rb +0 -17
- data/ruby/neo4j/driver/internal/logging/prefixed_logger.rb +0 -19
- data/ruby/neo4j/driver/internal/logging/reformatted_logger.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/abstract_message_writer.rb +0 -23
- data/ruby/neo4j/driver/internal/messaging/bolt_protocol.rb +0 -32
- data/ruby/neo4j/driver/internal/messaging/bolt_protocol_version.rb +0 -48
- data/ruby/neo4j/driver/internal/messaging/common/common_message_reader.rb +0 -51
- data/ruby/neo4j/driver/internal/messaging/common/common_value.rb +0 -33
- data/ruby/neo4j/driver/internal/messaging/common/common_value_packer.rb +0 -104
- data/ruby/neo4j/driver/internal/messaging/common/common_value_unpacker.rb +0 -256
- data/ruby/neo4j/driver/internal/messaging/encode/begin_message_encoder.rb +0 -15
- data/ruby/neo4j/driver/internal/messaging/encode/commit_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/discard_all_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/discard_message_encoder.rb +0 -15
- data/ruby/neo4j/driver/internal/messaging/encode/goodbye_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/hello_message_encoder.rb +0 -15
- data/ruby/neo4j/driver/internal/messaging/encode/init_message_encoder.rb +0 -16
- data/ruby/neo4j/driver/internal/messaging/encode/logoff_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/logon_message_encoder.rb +0 -15
- data/ruby/neo4j/driver/internal/messaging/encode/pull_all_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/pull_message_encoder.rb +0 -15
- data/ruby/neo4j/driver/internal/messaging/encode/reset_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/rollback_message_encoder.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/encode/route_message_encoder.rb +0 -24
- data/ruby/neo4j/driver/internal/messaging/encode/route_v44_message_encoder.rb +0 -22
- data/ruby/neo4j/driver/internal/messaging/encode/run_message_encoder.rb +0 -16
- data/ruby/neo4j/driver/internal/messaging/encode/run_with_metadata_message_encoder.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/request/abstract_streaming_message.rb +0 -25
- data/ruby/neo4j/driver/internal/messaging/request/begin_message.rb +0 -25
- data/ruby/neo4j/driver/internal/messaging/request/commit_message.rb +0 -20
- data/ruby/neo4j/driver/internal/messaging/request/discard_all_message.rb +0 -20
- data/ruby/neo4j/driver/internal/messaging/request/discard_message.rb +0 -23
- data/ruby/neo4j/driver/internal/messaging/request/goodbye_message.rb +0 -20
- data/ruby/neo4j/driver/internal/messaging/request/hello_message.rb +0 -30
- data/ruby/neo4j/driver/internal/messaging/request/init_message.rb +0 -19
- data/ruby/neo4j/driver/internal/messaging/request/logoff_message.rb +0 -13
- data/ruby/neo4j/driver/internal/messaging/request/logon_message.rb +0 -13
- data/ruby/neo4j/driver/internal/messaging/request/message_with_metadata.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/request/multi_database_util.rb +0 -26
- data/ruby/neo4j/driver/internal/messaging/request/pull_all_message.rb +0 -23
- data/ruby/neo4j/driver/internal/messaging/request/pull_message.rb +0 -22
- data/ruby/neo4j/driver/internal/messaging/request/reset_message.rb +0 -32
- data/ruby/neo4j/driver/internal/messaging/request/rollback_message.rb +0 -20
- data/ruby/neo4j/driver/internal/messaging/request/route_message.rb +0 -28
- data/ruby/neo4j/driver/internal/messaging/request/run_message.rb +0 -23
- data/ruby/neo4j/driver/internal/messaging/request/run_with_metadata_message.rb +0 -49
- data/ruby/neo4j/driver/internal/messaging/request/transaction_metadata_builder.rb +0 -24
- data/ruby/neo4j/driver/internal/messaging/response/failure_message.rb +0 -40
- data/ruby/neo4j/driver/internal/messaging/response/ignored_message.rb +0 -29
- data/ruby/neo4j/driver/internal/messaging/response/record_message.rb +0 -33
- data/ruby/neo4j/driver/internal/messaging/response/success_message.rb +0 -34
- data/ruby/neo4j/driver/internal/messaging/v3/bolt_protocol_v3.rb +0 -82
- data/ruby/neo4j/driver/internal/messaging/v3/message_format_v3.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/v3/message_writer_v3.rb +0 -27
- data/ruby/neo4j/driver/internal/messaging/v4/bolt_protocol_v4.rb +0 -29
- data/ruby/neo4j/driver/internal/messaging/v4/message_format_v4.rb +0 -13
- data/ruby/neo4j/driver/internal/messaging/v4/message_writer_v4.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/v41/bolt_protocol_v41.rb +0 -25
- data/ruby/neo4j/driver/internal/messaging/v42/bolt_protocol_v42.rb +0 -13
- data/ruby/neo4j/driver/internal/messaging/v43/bolt_protocol_v43.rb +0 -19
- data/ruby/neo4j/driver/internal/messaging/v43/message_format_v43.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/v43/message_writer_v43.rb +0 -20
- data/ruby/neo4j/driver/internal/messaging/v44/bolt_protocol_v44.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/v44/message_format_v44.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/v44/message_writer_v44.rb +0 -15
- data/ruby/neo4j/driver/internal/messaging/v5/bolt_protocol_v5.rb +0 -21
- data/ruby/neo4j/driver/internal/messaging/v5/message_format_v5.rb +0 -18
- data/ruby/neo4j/driver/internal/messaging/v5/value_unpacker_v5.rb +0 -17
- data/ruby/neo4j/driver/internal/messaging/v51/bolt_protocol_v51.rb +0 -40
- data/ruby/neo4j/driver/internal/messaging/v51/message_format_v51.rb +0 -14
- data/ruby/neo4j/driver/internal/messaging/v51/message_writer_v51.rb +0 -17
- data/ruby/neo4j/driver/internal/metrics/connection_pool_metrics_listener.rb +0 -34
- data/ruby/neo4j/driver/internal/metrics/internal_abstract_metrics.rb +0 -46
- data/ruby/neo4j/driver/internal/metrics/internal_connection_pool_metrics.rb +0 -105
- data/ruby/neo4j/driver/internal/metrics/internal_metrics.rb +0 -82
- data/ruby/neo4j/driver/internal/metrics/internal_metrics_provider.rb +0 -18
- data/ruby/neo4j/driver/internal/metrics/listener_event.rb +0 -17
- data/ruby/neo4j/driver/internal/metrics/metrics_provider.rb +0 -24
- data/ruby/neo4j/driver/internal/metrics/time_recorder_listener_event.rb +0 -15
- data/ruby/neo4j/driver/internal/packstream/byte_array_incompatible_packer.rb +0 -12
- data/ruby/neo4j/driver/internal/packstream/pack_input.rb +0 -47
- data/ruby/neo4j/driver/internal/packstream/pack_output.rb +0 -39
- data/ruby/neo4j/driver/internal/packstream/pack_stream.rb +0 -326
- data/ruby/neo4j/driver/internal/packstream/pack_type.rb +0 -17
- data/ruby/neo4j/driver/internal/read_only_bookmark_holder.rb +0 -13
- data/ruby/neo4j/driver/internal/resolved_bolt_server_address.rb +0 -35
- data/ruby/neo4j/driver/internal/retry/exponential_backoff_retry_logic.rb +0 -151
- data/ruby/neo4j/driver/internal/revocation_strategy.rb +0 -19
- data/ruby/neo4j/driver/internal/scheme.rb +0 -32
- data/ruby/neo4j/driver/internal/security/internal_auth_token.rb +0 -15
- data/ruby/neo4j/driver/internal/security/security_plan_impl.rb +0 -48
- data/ruby/neo4j/driver/internal/security_setting.rb +0 -66
- data/ruby/neo4j/driver/internal/session_factory_impl.rb +0 -32
- data/ruby/neo4j/driver/internal/spi/connection.rb +0 -19
- data/ruby/neo4j/driver/internal/spi/connection_pool.rb +0 -9
- data/ruby/neo4j/driver/internal/spi/response_handler.rb +0 -23
- data/ruby/neo4j/driver/internal/summary/internal_database_info.rb +0 -7
- data/ruby/neo4j/driver/internal/summary/internal_input_position.rb +0 -11
- data/ruby/neo4j/driver/internal/summary/internal_notification.rb +0 -16
- data/ruby/neo4j/driver/internal/summary/internal_plan.rb +0 -41
- data/ruby/neo4j/driver/internal/summary/internal_profiled_plan.rb +0 -32
- data/ruby/neo4j/driver/internal/summary/internal_result_summary.rb +0 -33
- data/ruby/neo4j/driver/internal/summary/internal_server_info.rb +0 -6
- data/ruby/neo4j/driver/internal/summary/internal_summary_counters.rb +0 -18
- data/ruby/neo4j/driver/internal/svm/netty_substitutions.rb +0 -196
- data/ruby/neo4j/driver/internal/svm/z_lib_substitutions.rb +0 -21
- data/ruby/neo4j/driver/internal/util/certificate_tool.rb +0 -65
- data/ruby/neo4j/driver/internal/util/clock.rb +0 -29
- data/ruby/neo4j/driver/internal/util/error_util.rb +0 -104
- data/ruby/neo4j/driver/internal/util/extract.rb +0 -123
- data/ruby/neo4j/driver/internal/util/format.rb +0 -39
- data/ruby/neo4j/driver/internal/util/futures.rb +0 -99
- data/ruby/neo4j/driver/internal/util/iterables.rb +0 -35
- data/ruby/neo4j/driver/internal/util/lock_util.rb +0 -23
- data/ruby/neo4j/driver/internal/util/metadata_extractor.rb +0 -107
- data/ruby/neo4j/driver/internal/util/mutex.rb +0 -9
- data/ruby/neo4j/driver/internal/util/preconditions.rb +0 -16
- data/ruby/neo4j/driver/internal/util/result_holder.rb +0 -72
- data/ruby/neo4j/driver/internal/util/server_version.rb +0 -60
- data/ruby/neo4j/driver/logging1.rb +0 -51
- data/ruby/neo4j/driver/net/server_address.rb +0 -9
- data/ruby/neo4j/driver/query.rb +0 -48
- data/ruby/neo4j/driver/records.rb +0 -13
- data/ruby/neo4j/driver/transaction_config.rb +0 -50
- data/ruby/neo4j/driver/values.rb +0 -26
- data/ruby/neo4j/driver.rb +0 -28
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Async
|
|
4
|
-
class UnmanagedTransaction
|
|
5
|
-
class State
|
|
6
|
-
# The transaction is running with no explicit success or failure marked
|
|
7
|
-
ACTIVE = 'active'
|
|
8
|
-
|
|
9
|
-
# This transaction has been terminated either because of explicit {@link Session#reset()} or because of a fatal connection error.
|
|
10
|
-
TERMINATED = 'terminated'
|
|
11
|
-
|
|
12
|
-
# This transaction has successfully committed
|
|
13
|
-
COMMITTED = 'committed'
|
|
14
|
-
|
|
15
|
-
# This transaction has been rolled back
|
|
16
|
-
ROLLED_BACK = 'rolled_back'
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
CANT_COMMIT_COMMITTED_MSG = "Can't commit, transaction has been committed"
|
|
20
|
-
CANT_ROLLBACK_COMMITTED_MSG = "Can't rollback, transaction has been committed"
|
|
21
|
-
CANT_COMMIT_ROLLED_BACK_MSG = "Can't commit, transaction has been rolled back"
|
|
22
|
-
CANT_ROLLBACK_ROLLED_BACK_MSG = "Can't rollback, transaction has been rolled back"
|
|
23
|
-
CANT_COMMIT_ROLLING_BACK_MSG = "Can't commit, transaction has been requested to be rolled back"
|
|
24
|
-
CANT_ROLLBACK_COMMITTING_MSG = "Can't rollback, transaction has been requested to be committed"
|
|
25
|
-
OPEN_STATES = [State::ACTIVE, State::TERMINATED]
|
|
26
|
-
attr :connection
|
|
27
|
-
|
|
28
|
-
def initialize(connection, bookmark_holder, fetch_size, result_cursors = ResultCursorsHolder.new)
|
|
29
|
-
@connection = connection
|
|
30
|
-
@protocol = connection.protocol
|
|
31
|
-
@bookmark_holder = bookmark_holder
|
|
32
|
-
@result_cursors = result_cursors
|
|
33
|
-
@fetch_size = fetch_size
|
|
34
|
-
@lock = Util::Mutex.new
|
|
35
|
-
@state = State::ACTIVE
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def begin_async(initial_bookmark, config)
|
|
39
|
-
@protocol.begin_transaction(@connection, initial_bookmark, config)
|
|
40
|
-
self
|
|
41
|
-
rescue Neo4j::Driver::Exceptions::AuthorizationExpiredException
|
|
42
|
-
@connection.terminate_and_release(Neo4j::Driver::Exceptions::AuthorizationExpiredException::DESCRIPTION)
|
|
43
|
-
raise
|
|
44
|
-
rescue Neo4j::Driver::Exceptions::ConnectionReadTimeoutException => begin_error
|
|
45
|
-
@connection.terminate_and_release(begin_error.message)
|
|
46
|
-
raise
|
|
47
|
-
rescue
|
|
48
|
-
@connection.release
|
|
49
|
-
raise
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def close_async(commit = false, complete_with_null_if_not_open = true)
|
|
53
|
-
@lock.synchronize do
|
|
54
|
-
if complete_with_null_if_not_open && !open?
|
|
55
|
-
Util::ResultHolder.successful(nil)
|
|
56
|
-
elsif @state == State::COMMITTED
|
|
57
|
-
Util::ResultHolder.failed(Neo4j::Driver::Exceptions::ClientException.new(
|
|
58
|
-
commit ? CANT_COMMIT_COMMITTED_MSG : CANT_ROLLBACK_COMMITTED_MSG))
|
|
59
|
-
elsif @state == State::ROLLED_BACK
|
|
60
|
-
Util::ResultHolder.failed(Neo4j::Driver::Exceptions::ClientException.new(
|
|
61
|
-
commit ? CANT_COMMIT_ROLLED_BACK_MSG : CANT_ROLLBACK_ROLLED_BACK_MSG))
|
|
62
|
-
else
|
|
63
|
-
if commit
|
|
64
|
-
if @rollback_pending
|
|
65
|
-
Util::ResultHolder.failed(Neo4j::Driver::Exceptions::ClientException.new(CANT_COMMIT_ROLLING_BACK_MSG))
|
|
66
|
-
elsif @commit_pending
|
|
67
|
-
@commit_pending
|
|
68
|
-
else
|
|
69
|
-
@commit_pending = Util::ResultHolder.new
|
|
70
|
-
nil
|
|
71
|
-
end
|
|
72
|
-
else
|
|
73
|
-
if @commit_pending
|
|
74
|
-
Util::ResultHolder.failed(Neo4j::Driver::Exceptions::ClientException.new(CANT_ROLLBACK_COMMITTING_MSG))
|
|
75
|
-
elsif @rollback_pending
|
|
76
|
-
@rollback_pending
|
|
77
|
-
else
|
|
78
|
-
@rollback_pending = Util::ResultHolder.new
|
|
79
|
-
nil
|
|
80
|
-
end
|
|
81
|
-
end
|
|
82
|
-
end
|
|
83
|
-
end ||
|
|
84
|
-
begin
|
|
85
|
-
if commit
|
|
86
|
-
target_future = @commit_pending
|
|
87
|
-
target_action = lambda { |throwable|
|
|
88
|
-
do_commit_async(throwable).chain(&handle_commit_or_rollback(throwable))
|
|
89
|
-
}
|
|
90
|
-
else
|
|
91
|
-
target_future = @rollback_pending
|
|
92
|
-
target_action = lambda { |throwable|
|
|
93
|
-
do_rollback_async.chain(&handle_commit_or_rollback(throwable))
|
|
94
|
-
}
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
@result_cursors.retrieve_not_consumed_error.then(&target_action)
|
|
98
|
-
.side { |_, error| handle_transaction_completion(commit, error) }.copy_to(target_future)
|
|
99
|
-
target_future
|
|
100
|
-
end
|
|
101
|
-
end
|
|
102
|
-
|
|
103
|
-
def commit_async
|
|
104
|
-
close_async(true, false)
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def rollback_async
|
|
108
|
-
close_async(false, false)
|
|
109
|
-
end
|
|
110
|
-
|
|
111
|
-
def run_async(query)
|
|
112
|
-
ensure_can_run_queries
|
|
113
|
-
cursor = @protocol.run_in_unmanaged_transaction(@connection, query, self, @fetch_size).async_result
|
|
114
|
-
@result_cursors << cursor
|
|
115
|
-
cursor.map_successful_run_completion_async
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
def run_rx(query)
|
|
119
|
-
ensure_can_run_queries
|
|
120
|
-
cursor_stage = @protocol.run_in_unmanaged_transaction(@connection, query, self, @fetch_size).rx_result
|
|
121
|
-
@result_cursors << cursor_stage
|
|
122
|
-
cursor_stage
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
def open?
|
|
126
|
-
OPEN_STATES.include?(@lock.synchronize { @state })
|
|
127
|
-
end
|
|
128
|
-
|
|
129
|
-
def mark_terminated(cause)
|
|
130
|
-
@lock.synchronize do
|
|
131
|
-
if @state == State::TERMINATED
|
|
132
|
-
add_suppressed_when_not_captured(@cause_of_termination, cause) if @cause_of_termination
|
|
133
|
-
else
|
|
134
|
-
@state = State::TERMINATED
|
|
135
|
-
@cause_of_termination = cause
|
|
136
|
-
end
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
def ensure_can_run_queries
|
|
141
|
-
@lock.synchronize do
|
|
142
|
-
case @state
|
|
143
|
-
when State::COMMITTED
|
|
144
|
-
raise Neo4j::Driver::Exceptions::ClientException, 'Cannot run more queries in this transaction, it has been committed'
|
|
145
|
-
when State::ROLLED_BACK
|
|
146
|
-
raise Neo4j::Driver::Exceptions::ClientException, 'Cannot run more queries in this transaction, it has been rolled back'
|
|
147
|
-
when State::TERMINATED
|
|
148
|
-
# TODO clunky positional arguments of Neo4jException#initialize, move to named parameters
|
|
149
|
-
raise Neo4j::Driver::Exceptions::ClientException, 'Cannot run more queries in this transaction, it has either experienced an fatal error or was explicitly terminated' #, # TODO should be able to pass @cause_of_termination
|
|
150
|
-
end
|
|
151
|
-
end
|
|
152
|
-
end
|
|
153
|
-
|
|
154
|
-
private
|
|
155
|
-
|
|
156
|
-
def add_suppressed_when_not_captured(current_cause, new_cause)
|
|
157
|
-
if current_cause != new_cause
|
|
158
|
-
none_match = current_cause.get_suppressed.none? { |suppressed| suppressed == new_cause }
|
|
159
|
-
|
|
160
|
-
if none_match
|
|
161
|
-
current_cause.add_suppressed(new_cause)
|
|
162
|
-
end
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
def do_commit_async(cursor_failure)
|
|
167
|
-
exception = @lock.synchronize do
|
|
168
|
-
if @state == State::TERMINATED
|
|
169
|
-
Neo4j::Driver::Exceptions::ClientException.new(
|
|
170
|
-
"Transaction can't be committed. It has been rolled back either because of an error or explicit termination",
|
|
171
|
-
cursor_failure != @cause_of_termination ? @cause_of_termination : nil)
|
|
172
|
-
end
|
|
173
|
-
end
|
|
174
|
-
|
|
175
|
-
if exception
|
|
176
|
-
Util::ResultHolder.failed(exception)
|
|
177
|
-
else
|
|
178
|
-
@protocol.commit_transaction(@connection).then(&@bookmark_holder.method(:bookmark=))
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
|
|
182
|
-
def do_rollback_async
|
|
183
|
-
if @lock.synchronize { @state } == State::TERMINATED
|
|
184
|
-
Util::ResultHolder.successful(nil)
|
|
185
|
-
else
|
|
186
|
-
@protocol.rollback_transaction(@connection)
|
|
187
|
-
end
|
|
188
|
-
end
|
|
189
|
-
|
|
190
|
-
def handle_commit_or_rollback(cursor_failure)
|
|
191
|
-
lambda { |_value, commit_or_rollback_error|
|
|
192
|
-
combined_error = Util::Futures.combine_errors(cursor_failure, commit_or_rollback_error)
|
|
193
|
-
raise combined_error if combined_error
|
|
194
|
-
}
|
|
195
|
-
end
|
|
196
|
-
|
|
197
|
-
def handle_transaction_completion(commit_attempt, throwable)
|
|
198
|
-
@lock.synchronize { @state = commit_attempt && throwable.nil? ? State::COMMITTED : State::ROLLED_BACK }
|
|
199
|
-
|
|
200
|
-
case throwable
|
|
201
|
-
when Neo4j::Driver::Exceptions::AuthorizationExpiredException
|
|
202
|
-
@connection.terminate_and_release(Neo4j::Driver::Exceptions::AuthorizationExpiredException::DESCRIPTION)
|
|
203
|
-
when Neo4j::Driver::Exceptions::ConnectionReadTimeoutException
|
|
204
|
-
@connection.terminate_and_release(throwable.message)
|
|
205
|
-
else
|
|
206
|
-
@connection.release # release in background
|
|
207
|
-
end
|
|
208
|
-
end
|
|
209
|
-
end
|
|
210
|
-
end
|
|
211
|
-
end
|
|
212
|
-
end
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
class ClusterComposition < Struct.new(:expiration_timestamp, :readers, :writers, :routers, :database_name)
|
|
5
|
-
def initialize(expiration_timestamp:, database_name:, readers: [], writers: [], routers: [])
|
|
6
|
-
super(expiration_timestamp, readers, writers, routers, database_name)
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def has_writers?
|
|
10
|
-
writers.present?
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def has_routers_and_readers?
|
|
14
|
-
routers.present? && readers.present?
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def self.parse(record, now)
|
|
18
|
-
return unless record
|
|
19
|
-
new(expiration_timestamp: expiration_timestamp(now, record), database_name: record[:db],
|
|
20
|
-
**record[:servers].to_h do |value|
|
|
21
|
-
[servers(value[:role]),
|
|
22
|
-
value[:addresses].map { |address| BoltServerAddress.new(uri: BoltServerAddress.uri_from(address)) }]
|
|
23
|
-
end)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
def self.expiration_timestamp(now, record)
|
|
29
|
-
ttl = record['ttl']
|
|
30
|
-
now + (ttl.negative? ? 1000.years : ttl.seconds)
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def self.servers(role)
|
|
34
|
-
case role
|
|
35
|
-
when 'READ'
|
|
36
|
-
:readers
|
|
37
|
-
when 'WRITE'
|
|
38
|
-
:writers
|
|
39
|
-
when 'ROUTE'
|
|
40
|
-
:routers
|
|
41
|
-
else
|
|
42
|
-
raise ArgumentError, "invalid server role: #{role}"
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
end
|
|
48
|
-
end
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
class ClusterCompositionLookupResult
|
|
5
|
-
attr_reader :cluster_composition, :resolved_initial_routers
|
|
6
|
-
|
|
7
|
-
def initialize(composition, resolved_initial_routers = nil)
|
|
8
|
-
@cluster_composition = composition
|
|
9
|
-
@resolved_initial_routers = resolved_initial_routers
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
end
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
class ClusterRoutingTable
|
|
5
|
-
MIN_ROUTERS = 1
|
|
6
|
-
|
|
7
|
-
def initialize(of_database, _clock, *routing_addresses)
|
|
8
|
-
@database_name = of_database
|
|
9
|
-
@expiration_timestamp = Time.now
|
|
10
|
-
@routers = routing_addresses.to_set.freeze
|
|
11
|
-
@table_lock = Concurrent::ReentrantReadWriteLock.new
|
|
12
|
-
@prefer_initial_router = true
|
|
13
|
-
@disused = Set.new
|
|
14
|
-
@readers = Set.new
|
|
15
|
-
@writers = Set.new
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def stale_for?(mode)
|
|
19
|
-
@table_lock.with_read_lock do
|
|
20
|
-
@expiration_timestamp <= Time.now ||
|
|
21
|
-
routers.size < MIN_ROUTERS ||
|
|
22
|
-
(mode == AccessMode::READ && @readers.size == 0) ||
|
|
23
|
-
(mode == AccessMode::WRITE && @writers.size == 0)
|
|
24
|
-
end
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def has_been_stale_for?(extra_time)
|
|
28
|
-
Time.now - @table_lock.with_read_lock { @expiration_timestamp } >= extra_time
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def update(cluster)
|
|
32
|
-
@table_lock.with_write_lock do
|
|
33
|
-
@expiration_timestamp = cluster.expiration_timestamp
|
|
34
|
-
@readers = new_with_reused_addresses(@readers, @disused, cluster.readers)
|
|
35
|
-
@writers = new_with_reused_addresses(@writers, @disused, cluster.writers)
|
|
36
|
-
@routers = new_with_reused_addresses(@routers, @disused, cluster.routers)
|
|
37
|
-
@disused.clear
|
|
38
|
-
@prefer_initial_router = !cluster.has_writers?
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def forget(address)
|
|
43
|
-
@table_lock.with_write_lock do
|
|
44
|
-
@routers = new_without_address_if_present(@routers, address)
|
|
45
|
-
@readers = new_without_address_if_present(@readers, address)
|
|
46
|
-
@writers = new_without_address_if_present(@writers, address)
|
|
47
|
-
@disused << address
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def readers
|
|
52
|
-
@table_lock.with_read_lock { @readers }
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
def writers
|
|
56
|
-
@table_lock.with_read_lock { @writers }
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def routers
|
|
60
|
-
@table_lock.with_read_lock { @routers }
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def servers
|
|
64
|
-
@table_lock.with_write_lock do
|
|
65
|
-
[@readers, @writers, @routers, @disused].reduce(&:+)
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def database
|
|
70
|
-
@database_name
|
|
71
|
-
end
|
|
72
|
-
|
|
73
|
-
def forget_writer(to_remove)
|
|
74
|
-
Util::LockUtil.execute_with_lock(@table_lock.write_lock) do
|
|
75
|
-
@writers = new_without_address_if_present(@writers, to_remove)
|
|
76
|
-
@disused << to_remove
|
|
77
|
-
end
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def replace_router_if_present(old_router, new_router)
|
|
81
|
-
@table_lock.with_write_lock { @routers = new_with_address_replaced_if_present(@routers, old_router, new_router) }
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def prefer_initial_router
|
|
85
|
-
@table_lock.with_read_lock { @prefer_initial_router }
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def expiration_timestamp
|
|
89
|
-
@table_lock.with_read_lock { @expiration_timestamp }
|
|
90
|
-
end
|
|
91
|
-
|
|
92
|
-
def to_s
|
|
93
|
-
@table_lock.with_read_lock do
|
|
94
|
-
"Ttl #{@expiration_timestamp}, currentTime #{Time.now}, routers #{@routers}, writers #{@writers}, readers #{@readers}, database '#{@database_name.description}'"
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
private
|
|
99
|
-
|
|
100
|
-
def new_without_address_if_present(addresses, address_to_skip)
|
|
101
|
-
(addresses - [address_to_skip]).freeze
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
def new_with_address_replaced_if_present(addresses, old_address, new_address)
|
|
105
|
-
addresses.map { |address| address == old_address ? new_address : address }.freeze
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
def new_with_reused_addresses(*addresses)
|
|
109
|
-
addresses.map(&:to_set).reduce(&:+).freeze
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
def to_bolt_server_address(address)
|
|
113
|
-
if BoltServerAddress.class == address.class
|
|
114
|
-
address
|
|
115
|
-
else
|
|
116
|
-
BoltServerAddress.new(host: address.host, port: address.port)
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
end
|
data/ruby/neo4j/driver/internal/cluster/loadbalancing/least_connected_load_balancing_strategy.rb
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
module Loadbalancing
|
|
5
|
-
|
|
6
|
-
# Load balancing strategy that finds server with the least amount of active (checked out of the pool) connections from given readers or writers. It finds a
|
|
7
|
-
# start index for iteration in a round-robin fashion. This is done to prevent choosing same first address over and over when all addresses have the same amount
|
|
8
|
-
# of active connections.
|
|
9
|
-
class LeastConnectedLoadBalancingStrategy
|
|
10
|
-
|
|
11
|
-
def initialize(connection_pool, logger)
|
|
12
|
-
@readers_index = RoundRobinArrayIndex.new
|
|
13
|
-
@writers_index = RoundRobinArrayIndex.new
|
|
14
|
-
|
|
15
|
-
@connection_pool = connection_pool
|
|
16
|
-
@log = logger
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def select_reader(known_readers)
|
|
20
|
-
select(known_readers, @readers_index, 'reader')
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def select_writer(known_writers)
|
|
24
|
-
select(known_writers, @writers_index, 'writer')
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
private
|
|
28
|
-
|
|
29
|
-
def select(addresses, addresses_index, address_type)
|
|
30
|
-
size = addresses.size
|
|
31
|
-
if size == 0
|
|
32
|
-
@log.debug("Unable to select #{address_type}, no known addresses given")
|
|
33
|
-
return
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
# choose start index for iteration in round-robin fashion
|
|
37
|
-
start_index = addresses_index.next(size)
|
|
38
|
-
index = start_index
|
|
39
|
-
|
|
40
|
-
least_connected_address = nil
|
|
41
|
-
least_active_connections = nil
|
|
42
|
-
|
|
43
|
-
# iterate over the array to find the least connected address
|
|
44
|
-
addresses = addresses.to_a
|
|
45
|
-
loop do
|
|
46
|
-
address = addresses[index]
|
|
47
|
-
active_connections = @connection_pool.in_use_connections(address)
|
|
48
|
-
|
|
49
|
-
if least_active_connections.nil? || active_connections < least_active_connections
|
|
50
|
-
least_connected_address = address
|
|
51
|
-
least_active_connections = active_connections
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# loop over to the start of the array when end is reached
|
|
55
|
-
index = (index + 1) % size
|
|
56
|
-
|
|
57
|
-
break if index == start_index
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
@log.debug("Selected #{address_type} with address: '#{least_connected_address}' and active connections: #{least_active_connections}")
|
|
61
|
-
|
|
62
|
-
least_connected_address
|
|
63
|
-
end
|
|
64
|
-
end
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
end
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
module Loadbalancing
|
|
5
|
-
class LoadBalancer
|
|
6
|
-
CONNECTION_ACQUISITION_COMPLETION_FAILURE_MESSAGE = 'Connection acquisition failed for all available addresses.'
|
|
7
|
-
CONNECTION_ACQUISITION_COMPLETION_EXCEPTION_MESSAGE = "Failed to obtain connection towards %s server. Known routing table is: %s"
|
|
8
|
-
CONNECTION_ACQUISITION_ATTEMPT_FAILURE_MESSAGE = "Failed to obtain a connection towards address %s, will try other addresses if available. Complete failure is reported separately from this entry."
|
|
9
|
-
BOLT_SERVER_ADDRESSES_EMPTY_ARRAY = []
|
|
10
|
-
|
|
11
|
-
delegate :close, to: :@connection_pool
|
|
12
|
-
|
|
13
|
-
def initialize(initial_router, settings, connection_pool, event_executor_group, logger, load_balancing_strategy, resolver, &domain_name_resolver)
|
|
14
|
-
clock = Util::Clock::System
|
|
15
|
-
@connection_pool = connection_pool
|
|
16
|
-
@rediscovery = create_rediscovery(event_executor_group, initial_router, resolver, settings, clock, logger, domain_name_resolver)
|
|
17
|
-
@routing_tables = create_routing_tables(connection_pool, @rediscovery, settings, clock, logger)
|
|
18
|
-
@load_balancing_strategy = load_balancing_strategy
|
|
19
|
-
@event_executor_group = event_executor_group
|
|
20
|
-
@log = logger
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def acquire_connection(context)
|
|
24
|
-
handler = @routing_tables.ensure_routing_table(context)
|
|
25
|
-
connection = acquire(context.mode, handler.routing_table)
|
|
26
|
-
Async::Connection::RoutingConnection.new(connection, context.database_name, context.mode,
|
|
27
|
-
context.impersonated_user, handler)
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
def verify_connectivity
|
|
31
|
-
@routing_tables.ensure_routing_table(Async::ImmutableConnectionContext.simple(supports_multi_db?))
|
|
32
|
-
rescue Exceptions::ServiceUnavailableException
|
|
33
|
-
raise Exceptions::ServiceUnavailableException,
|
|
34
|
-
'Unable to connect to database management service, ensure the database is running and that there is a working network connection to it.'
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
def routing_table_registry
|
|
38
|
-
@routing_tables
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
def supports_multi_db?
|
|
42
|
-
addresses = @rediscovery.resolve
|
|
43
|
-
base_error = Exceptions::ServiceUnavailableException.new("Failed to perform multi-databases feature detection with the following servers: #{addresses}")
|
|
44
|
-
addresses.each do |address|
|
|
45
|
-
return private_suports_multi_db?(address)
|
|
46
|
-
rescue Exceptions::SecurityException
|
|
47
|
-
raise
|
|
48
|
-
rescue => error
|
|
49
|
-
Util::Futures.combine_errors(base_error, error)
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
raise base_error
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
private
|
|
56
|
-
|
|
57
|
-
def private_suports_multi_db?(address)
|
|
58
|
-
conn = @connection_pool.acquire(address)
|
|
59
|
-
Messaging::Request::MultiDatabaseUtil.supports_multi_database?(conn)
|
|
60
|
-
ensure
|
|
61
|
-
conn&.release
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
def acquire(mode, routing_table, attempt_errors = [])
|
|
65
|
-
addresses = addresses_by_mode(mode, routing_table)
|
|
66
|
-
address = select_address(mode, addresses)
|
|
67
|
-
|
|
68
|
-
unless address
|
|
69
|
-
error = Exceptions::SessionExpiredException.new(CONNECTION_ACQUISITION_COMPLETION_EXCEPTION_MESSAGE % [mode, routing_table])
|
|
70
|
-
attempt_errors.each(&error.method(:add_suppressed))
|
|
71
|
-
@log.error(CONNECTION_ACQUISITION_COMPLETION_FAILURE_MESSAGE)
|
|
72
|
-
@log.error(error)
|
|
73
|
-
raise error
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
begin
|
|
77
|
-
@connection_pool.acquire(address)
|
|
78
|
-
rescue Exceptions::ServiceUnavailableException => error
|
|
79
|
-
@log.warn { CONNECTION_ACQUISITION_ATTEMPT_FAILURE_MESSAGE % address }
|
|
80
|
-
@log.debug(error)
|
|
81
|
-
attempt_errors << error
|
|
82
|
-
routing_table.forget(address)
|
|
83
|
-
acquire(mode, routing_table, attempt_errors)
|
|
84
|
-
end
|
|
85
|
-
end
|
|
86
|
-
|
|
87
|
-
def addresses_by_mode(mode, routing_table)
|
|
88
|
-
case mode
|
|
89
|
-
when AccessMode::READ
|
|
90
|
-
routing_table.readers
|
|
91
|
-
when AccessMode::WRITE
|
|
92
|
-
routing_table.writers
|
|
93
|
-
else
|
|
94
|
-
raise unknown_mode mode
|
|
95
|
-
end
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
def select_address(mode, addresses)
|
|
99
|
-
case mode
|
|
100
|
-
when AccessMode::READ
|
|
101
|
-
@load_balancing_strategy.select_reader(addresses)
|
|
102
|
-
when AccessMode::WRITE
|
|
103
|
-
@load_balancing_strategy.select_writer(addresses)
|
|
104
|
-
else
|
|
105
|
-
raise unknown_mode mode
|
|
106
|
-
end
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def create_routing_tables(connection_pool, rediscovery, settings, clock, logger)
|
|
110
|
-
RoutingTableRegistryImpl.new(connection_pool, rediscovery, clock, logger, settings.routing_table_purge_delay)
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
def create_rediscovery(event_executor_group, initial_router, resolver, settings, clock, logger, domain_name_resolver)
|
|
114
|
-
cluster_composition_provider = RoutingProcedureClusterCompositionProvider.new(clock, settings.routing_context)
|
|
115
|
-
RediscoveryImpl.new(initial_router, settings, cluster_composition_provider, event_executor_group, resolver, logger, domain_name_resolver)
|
|
116
|
-
end
|
|
117
|
-
|
|
118
|
-
def unknown_mode(mode)
|
|
119
|
-
ArgumentError.new("Mode '#{mode}' is not supported")
|
|
120
|
-
end
|
|
121
|
-
end
|
|
122
|
-
end
|
|
123
|
-
end
|
|
124
|
-
end
|
|
125
|
-
end
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
module Loadbalancing
|
|
5
|
-
class RoundRobinArrayIndex < Concurrent::AtomicFixnum
|
|
6
|
-
def next(array_length)
|
|
7
|
-
(increment - 1) % array_length if array_length.positive?
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
end
|
|
11
|
-
end
|
|
12
|
-
end
|
|
13
|
-
end
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
|
|
5
|
-
# This implementation of the {@link RoutingProcedureRunner} works with multi database versions of Neo4j calling
|
|
6
|
-
# the procedure `dbms.routing.getRoutingTable`
|
|
7
|
-
class MultiDatabasesRoutingProcedureRunner < SingleDatabaseRoutingProcedureRunner
|
|
8
|
-
DATABASE_NAME = :database
|
|
9
|
-
MULTI_DB_GET_ROUTING_TABLE = "CALL dbms.routing.getRoutingTable($%s, $%s)" % [SingleDatabaseRoutingProcedureRunner::ROUTING_CONTEXT, DATABASE_NAME]
|
|
10
|
-
|
|
11
|
-
private
|
|
12
|
-
|
|
13
|
-
def bookmark_holder(bookmark)
|
|
14
|
-
ReadOnlyBookmarkHolder.new(bookmark)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def procedure_query(server_version, database_name)
|
|
18
|
-
map = {
|
|
19
|
-
SingleDatabaseRoutingProcedureRunner::ROUTING_CONTEXT => @context.to_h,
|
|
20
|
-
DATABASE_NAME => database_name.database_name
|
|
21
|
-
}
|
|
22
|
-
Query.new(MULTI_DB_GET_ROUTING_TABLE, **map)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def connection(connection)
|
|
26
|
-
Async::Connection::DirectConnection.new(connection, DatabaseNameUtil::SYSTEM_DATABASE, AccessMode::READ, nil)
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|