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,147 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
class RediscoveryImpl
|
|
5
|
-
NO_ROUTERS_AVAILABLE = "Could not perform discovery for database '%s'. No routing server available."
|
|
6
|
-
RECOVERABLE_ROUTING_ERROR = "Failed to update routing table with server '%s'."
|
|
7
|
-
RECOVERABLE_DISCOVERY_ERROR_WITH_SERVER = "Received a recoverable discovery error with server '%s', will continue discovery with other routing servers if available. Complete failure is reported separately from this entry."
|
|
8
|
-
INVALID_BOOKMARK_CODE = 'Neo.ClientError.Transaction.InvalidBookmark'
|
|
9
|
-
INVALID_BOOKMARK_MIXTURE_CODE = 'Neo.ClientError.Transaction.InvalidBookmarkMixture'
|
|
10
|
-
|
|
11
|
-
def initialize(initial_router, settings, provider, event_executor_group, resolver, logger, domain_name_resolver)
|
|
12
|
-
@initial_router = initial_router
|
|
13
|
-
@settings = settings
|
|
14
|
-
@log = logger
|
|
15
|
-
@provider = provider
|
|
16
|
-
@resolver = resolver
|
|
17
|
-
@event_executor_group = event_executor_group
|
|
18
|
-
@domain_name_resolver = Internal::Validator.require_non_nil!(domain_name_resolver)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
# Given a database and its current routing table, and the global connection pool, use the global cluster composition provider to fetch a new cluster
|
|
22
|
-
# composition, which would be used to update the routing table of the given database and global connection pool.
|
|
23
|
-
|
|
24
|
-
# @param routingTable current routing table of the given database.
|
|
25
|
-
# @param connectionPool connection pool.
|
|
26
|
-
# @return new cluster composition and an optional set of resolved initial router addresses.
|
|
27
|
-
def lookup_cluster_composition(
|
|
28
|
-
routing_table, connection_pool, bookmark, impersonated_user,
|
|
29
|
-
failures = 0,
|
|
30
|
-
previous_delay = 0,
|
|
31
|
-
base_error = Exceptions::ServiceUnavailableException.new(NO_ROUTERS_AVAILABLE % routing_table.database.description))
|
|
32
|
-
|
|
33
|
-
lookup(routing_table, connection_pool, bookmark, impersonated_user, base_error) ||
|
|
34
|
-
if failures > @settings.max_routing_failures
|
|
35
|
-
# now we throw our saved error out
|
|
36
|
-
raise base_error
|
|
37
|
-
else
|
|
38
|
-
next_delay = [@settings.retry_timeout_delay, previous_delay * 2].max
|
|
39
|
-
@log.info("Unable to fetch new routing table, will try again in #{next_delay} ms")
|
|
40
|
-
sleep next_delay
|
|
41
|
-
lookup_cluster_composition(routing_table, connection_pool, bookmark, impersonated_user, failures + 1, next_delay, base_error)
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def resolve
|
|
46
|
-
exception = nil
|
|
47
|
-
|
|
48
|
-
resolved_addresses = @resolver.call(@initial_router).flat_map do |server_address|
|
|
49
|
-
resolve_all_by_domain_name(server_address).unicast_stream
|
|
50
|
-
# rescue java.net.UnknownHostException => e
|
|
51
|
-
rescue SocketError => e
|
|
52
|
-
exception ||= e
|
|
53
|
-
[]
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
# give up only if there are no addresses to work with at all
|
|
57
|
-
raise exception if resolved_addresses.empty? && exception
|
|
58
|
-
|
|
59
|
-
resolved_addresses
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
private
|
|
63
|
-
|
|
64
|
-
def lookup(routing_table, connection_pool, bookmark, impersonated_user, base_error)
|
|
65
|
-
if routing_table.prefer_initial_router
|
|
66
|
-
lookup_on_initial_router_then_on_known_routers(routing_table, connection_pool, bookmark, impersonated_user, base_error)
|
|
67
|
-
else
|
|
68
|
-
lookup_on_known_routers_then_on_initial_router(routing_table, connection_pool, bookmark, impersonated_user, base_error)
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def lookup_on_known_routers_then_on_initial_router(routing_table, connection_pool, bookmark, impersonated_user, base_error)
|
|
73
|
-
seen_servers = Set.new
|
|
74
|
-
lookup_on_known_routers(routing_table, connection_pool, seen_servers, bookmark, impersonated_user, base_error) ||
|
|
75
|
-
lookup_on_initial_router(routing_table, connection_pool, seen_servers, bookmark, impersonated_user, base_error)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def lookup_on_initial_router_then_on_known_routers(routing_table, connection_pool, bookmark, impersonated_user, base_error)
|
|
79
|
-
lookup_on_initial_router(routing_table, connection_pool, Set.new, bookmark, impersonated_user, base_error) ||
|
|
80
|
-
lookup_on_known_routers(routing_table, connection_pool, Set.new, bookmark, impersonated_user, base_error)
|
|
81
|
-
end
|
|
82
|
-
|
|
83
|
-
def lookup_on_known_routers(routing_table, connection_pool, seen_servers, bookmark, impersonated_user, base_error)
|
|
84
|
-
routing_table.routers.lazy.map do |address|
|
|
85
|
-
lookup_on_router(address, true, routing_table, connection_pool, seen_servers, bookmark, impersonated_user, base_error)
|
|
86
|
-
end.first&.then(&ClusterCompositionLookupResult.method(:new))
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def lookup_on_initial_router(routing_table, connection_pool, seen_servers, bookmark, impersonated_user, base_error)
|
|
90
|
-
resolved_routers = resolve
|
|
91
|
-
(resolved_routers - seen_servers.to_a).lazy.filter_map do |address|
|
|
92
|
-
lookup_on_router(address, false, routing_table, connection_pool, nil, bookmark,
|
|
93
|
-
impersonated_user, base_error)
|
|
94
|
-
end.first&.then { |composition| ClusterCompositionLookupResult.new(composition, Set.new(resolved_routers)) }
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
def lookup_on_router(router_address, resolve_address, routing_table, connection_pool, seen_servers, bookmark, impersonated_user, base_error)
|
|
98
|
-
address = resolve_address ? resolve_by_domain_name_or_throw_completion_exception(router_address, routing_table) : router_address
|
|
99
|
-
seen_servers&.send(:<<, address)
|
|
100
|
-
connection = connection_pool.acquire(address)
|
|
101
|
-
ImpersonationUtil.ensure_impersonation_support(connection, impersonated_user)
|
|
102
|
-
@provider.get_cluster_composition(connection, routing_table.database, bookmark, impersonated_user)
|
|
103
|
-
rescue => error
|
|
104
|
-
handle_routing_procedure_error(error, routing_table, router_address, base_error)
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
def handle_routing_procedure_error(error, routing_table, router_address, base_error)
|
|
108
|
-
raise error if must_abort_discovery(error)
|
|
109
|
-
|
|
110
|
-
# Retriable error happened during discovery.
|
|
111
|
-
discovery_error = Exceptions::DiscoveryException.new(nil, RECOVERABLE_ROUTING_ERROR % router_address, error)
|
|
112
|
-
Util::Futures.combine_errors(base_error, discovery_error) # we record each failure here
|
|
113
|
-
warning_message = RECOVERABLE_DISCOVERY_ERROR_WITH_SERVER % router_address
|
|
114
|
-
@log.warn(warning_message)
|
|
115
|
-
@log.debug(discovery_error)
|
|
116
|
-
routing_table.forget(router_address)
|
|
117
|
-
nil
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def must_abort_discovery(error)
|
|
121
|
-
!error.is_a?(Exceptions::AuthorizationExpiredException) && error.is_a?(Exceptions::SecurityException) ||
|
|
122
|
-
error.is_a?(Exceptions::FatalDiscoveryException) ||
|
|
123
|
-
error.is_a?(Exceptions::IllegalStateException) &&
|
|
124
|
-
Spi::ConnectionPool::CONNECTION_POOL_CLOSED_ERROR_MESSAGE == error.message ||
|
|
125
|
-
error.is_a?(Exceptions::ClientException) &&
|
|
126
|
-
[INVALID_BOOKMARK_CODE, INVALID_BOOKMARK_MIXTURE_CODE].include?(error.code) ||
|
|
127
|
-
# Not sure why this is not im java
|
|
128
|
-
!error.is_a?(Exceptions::Neo4jException) ||
|
|
129
|
-
Util::ErrorUtil.fatal?(error)
|
|
130
|
-
end
|
|
131
|
-
|
|
132
|
-
def resolve_by_domain_name_or_throw_completion_exception(address, routing_table)
|
|
133
|
-
resolved_address = resolve_all_by_domain_name(address)
|
|
134
|
-
routing_table.replace_router_if_present(address, resolved_address)
|
|
135
|
-
|
|
136
|
-
resolved_address.unicast_stream.first or
|
|
137
|
-
raise Exceptions::IllegalStateException,
|
|
138
|
-
'Unexpected condition, the ResolvedBoltServerAddress must always have at least one unicast address'
|
|
139
|
-
end
|
|
140
|
-
|
|
141
|
-
def resolve_all_by_domain_name(address)
|
|
142
|
-
ResolvedBoltServerAddress.new(address.host, address.port, *@domain_name_resolver.call(address.host))
|
|
143
|
-
end
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
end
|
|
147
|
-
end
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
# This implementation of the {@link RoutingProcedureRunner} access the routing procedure
|
|
5
|
-
# through the bolt's ROUTE message.
|
|
6
|
-
class RouteMessageRoutingProcedureRunner
|
|
7
|
-
attr_writer :routing_table
|
|
8
|
-
|
|
9
|
-
def initialize(routing_context)
|
|
10
|
-
@routing_context = routing_context.to_h
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def run(connection, database_name, bookmark, impersonated_user)
|
|
14
|
-
direct_connection = to_direct_connection(connection, database_name, impersonated_user)
|
|
15
|
-
direct_connection.write_and_flush(
|
|
16
|
-
Messaging::Request::RouteMessage.new(@routing_context, bookmark, database_name.database_name,
|
|
17
|
-
impersonated_user),
|
|
18
|
-
Handlers::RouteMessageResponseHandler.new(self))
|
|
19
|
-
RoutingProcedureResponse.new(query(database_name), records: [to_record(@routing_table)])
|
|
20
|
-
rescue => e
|
|
21
|
-
RoutingProcedureResponse.new(query(database_name), error: e)
|
|
22
|
-
ensure
|
|
23
|
-
direct_connection.release
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
private
|
|
27
|
-
|
|
28
|
-
def to_record(routing_table)
|
|
29
|
-
InternalRecord.new(routing_table.keys, routing_table.values)
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
def to_direct_connection(connection, database_name, impersonated_user)
|
|
33
|
-
Async::Connection::DirectConnection.new(connection, database_name, AccessMode::READ, impersonated_user)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
def query(database_name)
|
|
37
|
-
Query.new('ROUTE $routing_context $database_name', routing_context: @routing_context,
|
|
38
|
-
database_name: database_name.database_name)
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
class RoutingContext
|
|
5
|
-
include Scheme
|
|
6
|
-
EMPTY = new
|
|
7
|
-
ROUTING_ADDRESS_KEY = :address
|
|
8
|
-
|
|
9
|
-
def initialize(uri = nil)
|
|
10
|
-
if uri
|
|
11
|
-
@server_routing_enabled = routing_scheme?(uri.scheme)
|
|
12
|
-
@context = parse_parameters(uri).freeze
|
|
13
|
-
else
|
|
14
|
-
@server_routing_enabled = true
|
|
15
|
-
@context = {}
|
|
16
|
-
end
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def defined?
|
|
20
|
-
@context.size > 1
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def to_h
|
|
24
|
-
@context
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def server_routing_enabled?
|
|
28
|
-
@server_routing_enabled
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def to_s
|
|
32
|
-
"RoutingContext #{@context} ServerRoutingEnabled=#{@server_routing_enabled}"
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
private
|
|
36
|
-
|
|
37
|
-
def parse_parameters(uri)
|
|
38
|
-
query = uri.query
|
|
39
|
-
address = "#{uri.host}:#{uri.port || BoltServerAddress::DEFAULT_PORT}"
|
|
40
|
-
parameters = { ROUTING_ADDRESS_KEY => address }
|
|
41
|
-
return parameters if query.blank?
|
|
42
|
-
|
|
43
|
-
pairs = query.split('&')
|
|
44
|
-
pairs.each do |pair|
|
|
45
|
-
key_value = pair.split('=')
|
|
46
|
-
|
|
47
|
-
if key_value.size != 2
|
|
48
|
-
raise ArgumentError, "Invalid parameters: '#{pair}' in URI '#{uri}'"
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
key = trim_and_verify_key(key_value[0], 'key', uri)
|
|
52
|
-
if parameters.key?(key)
|
|
53
|
-
raise ArgumentError, "Duplicated query parameters with key '#{key}' in URI '#{uri}'"
|
|
54
|
-
end
|
|
55
|
-
parameters[key] = trim_and_verify(key_value[1], 'value', uri)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
parameters
|
|
59
|
-
end
|
|
60
|
-
|
|
61
|
-
def trim_and_verify_key(s, key, uri)
|
|
62
|
-
trim_and_verify(s, key, uri).tap do |trimmed|
|
|
63
|
-
if trimmed == ROUTING_ADDRESS_KEY
|
|
64
|
-
raise ArgumentError, "The key 'address' is reserved for routing context."
|
|
65
|
-
end
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def trim_and_verify(string, name, uri)
|
|
70
|
-
string.strip.tap do |result|
|
|
71
|
-
raise ArgumentError, "Illegal empty #{name} in URI query '#{uri}'" if result.empty?
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
end
|
|
75
|
-
end
|
|
76
|
-
end
|
|
77
|
-
end
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
class RoutingProcedureClusterCompositionProvider
|
|
5
|
-
PROTOCOL_ERROR_MESSAGE = "Failed to parse '%s' result received from server due to "
|
|
6
|
-
|
|
7
|
-
def initialize(_clock, routing_context)
|
|
8
|
-
@single_database_routing_procedure_runner = SingleDatabaseRoutingProcedureRunner.new(routing_context)
|
|
9
|
-
@multi_database_routing_procedure_runner = MultiDatabasesRoutingProcedureRunner.new(routing_context)
|
|
10
|
-
@route_message_routing_procedure_runner = RouteMessageRoutingProcedureRunner.new(routing_context)
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def get_cluster_composition(connection, database_name, bookmark, impersonated_user)
|
|
14
|
-
runner = if Messaging::Request::MultiDatabaseUtil.supports_route_message?(connection)
|
|
15
|
-
@route_message_routing_procedure_runner
|
|
16
|
-
elsif Messaging::Request::MultiDatabaseUtil.supports_multi_database?(connection)
|
|
17
|
-
@multi_database_routing_procedure_runner
|
|
18
|
-
else
|
|
19
|
-
@single_database_routing_procedure_runner
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
process_routing_response(runner.run(connection, database_name, bookmark, impersonated_user))
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def process_routing_response(response)
|
|
26
|
-
unless response.success?
|
|
27
|
-
raise response.error, "Failed to run '#{invoked_procedure_string(response)}' on server. Please make sure that there is a Neo4j server or cluster up running."
|
|
28
|
-
end
|
|
29
|
-
|
|
30
|
-
records = response.records
|
|
31
|
-
|
|
32
|
-
# the record size is wrong
|
|
33
|
-
if records.size != 1
|
|
34
|
-
raise Exceptions::ProtocolException, "#{PROTOCOL_ERROR_MESSAGE % invoked_procedure_string(response)} records received '#{records.size}' is too few or too many."
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# failed to parse the record
|
|
38
|
-
begin
|
|
39
|
-
cluster = ClusterComposition.parse(records[0], Time.now)
|
|
40
|
-
rescue Exceptions::Value::ValueException => e
|
|
41
|
-
raise Exceptions::ProtocolException, "#{PROTOCOL_ERROR_MESSAGE % invoked_procedure_string(response)} unparsable record received. #{e}"
|
|
42
|
-
end
|
|
43
|
-
|
|
44
|
-
# the cluster result is not a legal reply
|
|
45
|
-
if !cluster.has_routers_and_readers?
|
|
46
|
-
raise Exceptions::ProtocolException, "#{PROTOCOL_ERROR_MESSAGE % invoked_procedure_string(response)} no router or reader found in response."
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
# all good
|
|
50
|
-
cluster
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
def invoked_procedure_string(response)
|
|
54
|
-
query = response.procedure
|
|
55
|
-
"#{query.text} #{query.parameters}"
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
end
|
|
59
|
-
end
|
|
60
|
-
end
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
class RoutingProcedureResponse
|
|
5
|
-
attr_reader :procedure
|
|
6
|
-
|
|
7
|
-
def initialize(procedure, records: nil, error: nil)
|
|
8
|
-
@procedure = procedure
|
|
9
|
-
@records = records
|
|
10
|
-
@error = error
|
|
11
|
-
end
|
|
12
|
-
|
|
13
|
-
def success?
|
|
14
|
-
!@records.nil?
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
def records
|
|
18
|
-
if success?
|
|
19
|
-
@records
|
|
20
|
-
else
|
|
21
|
-
raise Exceptions::IllegalStateException, "Can't access records of a failed result #{@error}"
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def error
|
|
26
|
-
if success?
|
|
27
|
-
raise Exceptions::IllegalStateException, "Can't access error of a succeeded result #{@records}"
|
|
28
|
-
else
|
|
29
|
-
@error
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
end
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
end
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
class RoutingSettings
|
|
5
|
-
attr_reader :max_routing_failures, :retry_timeout_delay, :routing_context, :routing_table_purge_delay
|
|
6
|
-
|
|
7
|
-
def initialize(max_routing_failures, retry_timeout_delay, routing_table_purge_delay,
|
|
8
|
-
routing_context = RoutingContext::EMPTY)
|
|
9
|
-
@max_routing_failures = max_routing_failures
|
|
10
|
-
@retry_timeout_delay = retry_timeout_delay
|
|
11
|
-
@routing_context = routing_context
|
|
12
|
-
@routing_table_purge_delay = routing_table_purge_delay
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
STALE_ROUTING_TABLE_PURGE_DELAY = 30.seconds
|
|
16
|
-
DEFAULT = new(1, 5.seconds, STALE_ROUTING_TABLE_PURGE_DELAY)
|
|
17
|
-
|
|
18
|
-
def with_routing_context(new_routing_context)
|
|
19
|
-
self.class.new(@max_routing_failures, @retry_timeout_delay, @routing_table_purge_delay, new_routing_context)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
24
|
-
end
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
class RoutingTableHandlerImpl
|
|
5
|
-
attr_reader :routing_table
|
|
6
|
-
|
|
7
|
-
delegate :servers, to: :routing_table
|
|
8
|
-
|
|
9
|
-
def initialize(routing_table, rediscovery, connection_pool, routing_table_registry, logger, routing_table_purge_delay)
|
|
10
|
-
@routing_table = routing_table
|
|
11
|
-
@database_name = routing_table.database
|
|
12
|
-
@rediscovery = rediscovery
|
|
13
|
-
@connection_pool = connection_pool
|
|
14
|
-
@routing_table_registry = routing_table_registry
|
|
15
|
-
@log = logger
|
|
16
|
-
@routing_table_purge_delay = routing_table_purge_delay
|
|
17
|
-
@mutex = Concurrent::ReentrantReadWriteLock.new
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def on_connection_failure(address)
|
|
21
|
-
# remove server from the routing table, to prevent concurrent threads from making connections to this address
|
|
22
|
-
@routing_table.forget(address)
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
def on_write_failure(address)
|
|
26
|
-
@routing_table.forget_writer(address)
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def ensure_routing_table(context)
|
|
30
|
-
@mutex.with_write_lock do
|
|
31
|
-
if @routing_table.stale_for?(context.mode)
|
|
32
|
-
# existing routing table is not fresh and should be updated
|
|
33
|
-
@log.debug("Routing table for database '#{@database_name.description}' is stale. #{@routing_table}")
|
|
34
|
-
|
|
35
|
-
fresh_cluster_composition_fetched(
|
|
36
|
-
@rediscovery.lookup_cluster_composition(@routing_table, @connection_pool, context.rediscovery_bookmark,
|
|
37
|
-
nil))
|
|
38
|
-
else
|
|
39
|
-
# existing routing table is fresh, use it
|
|
40
|
-
@routing_table
|
|
41
|
-
end
|
|
42
|
-
rescue => error
|
|
43
|
-
cluster_composition_lookup_failed(error)
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def update_routing_table(composition_lookup_result)
|
|
48
|
-
@mutex.with_write_lock do
|
|
49
|
-
if composition_lookup_result.cluster_composition.expiration_timestamp < @routing_table.expiration_timestamp
|
|
50
|
-
@routing_table
|
|
51
|
-
else
|
|
52
|
-
fresh_cluster_composition_fetched(composition_lookup_result)
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
|
-
end
|
|
56
|
-
|
|
57
|
-
private
|
|
58
|
-
|
|
59
|
-
def fresh_cluster_composition_fetched(composition_lookup_result)
|
|
60
|
-
@log.debug("Fetched cluster composition for database '#{@database_name.description}'. #{composition_lookup_result.cluster_composition}")
|
|
61
|
-
@routing_table.update(composition_lookup_result.cluster_composition)
|
|
62
|
-
@routing_table_registry.remove_aged
|
|
63
|
-
addresses_to_retain = @routing_table_registry.all_servers.map(&:unicast_stream).reduce(&:+)
|
|
64
|
-
|
|
65
|
-
composition_lookup_result.resolved_initial_routers&.then do |addresses|
|
|
66
|
-
addresses_to_retain.merge(addresses)
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
@connection_pool.retain_all(addresses_to_retain)
|
|
70
|
-
|
|
71
|
-
@log.debug("Updated routing table for database '#{@database_name.description}'. #{routing_table}")
|
|
72
|
-
@routing_table
|
|
73
|
-
rescue => error
|
|
74
|
-
cluster_composition_lookup_failed(error)
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
def cluster_composition_lookup_failed(error)
|
|
78
|
-
@log.error do
|
|
79
|
-
"Failed to update routing table for database '#{@database_name.description}'. Current routing table: #{@routing_table}."
|
|
80
|
-
end
|
|
81
|
-
@log.error(error)
|
|
82
|
-
@routing_table_registry.remove(@database_name)
|
|
83
|
-
raise error
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
public
|
|
87
|
-
|
|
88
|
-
# This method cannot be synchronized as it will be visited by all routing table handler's threads concurrently
|
|
89
|
-
def routing_table_aged?
|
|
90
|
-
@mutex.with_read_lock { @routing_table.has_been_stale_for?(@routing_table_purge_delay) }
|
|
91
|
-
end
|
|
92
|
-
end
|
|
93
|
-
end
|
|
94
|
-
end
|
|
95
|
-
end
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
class RoutingTableRegistryImpl
|
|
5
|
-
def initialize(connection_pool, rediscovery, clock, logger, routing_table_purge_delay)
|
|
6
|
-
@factory = RoutingTableHandlerFactory.new(connection_pool, rediscovery, clock, logger, routing_table_purge_delay)
|
|
7
|
-
@routing_table_handlers = Concurrent::Map.new
|
|
8
|
-
@principal_to_database_name = {}
|
|
9
|
-
@clock = clock
|
|
10
|
-
@connection_pool = connection_pool
|
|
11
|
-
@rediscovery = rediscovery
|
|
12
|
-
@log = logger
|
|
13
|
-
@mutex = Mutex.new
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def ensure_routing_table(context)
|
|
17
|
-
ctx_and_handler = ensure_database_name_is_completed(context)
|
|
18
|
-
(ctx_and_handler.handler || get_or_create(context.database_name))
|
|
19
|
-
.tap { |handler| handler.ensure_routing_table(ctx_and_handler.context) }
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
private def ensure_database_name_is_completed(context)
|
|
23
|
-
context_database_name = context.database_name
|
|
24
|
-
|
|
25
|
-
return ConnectionContextAndHandler.new(context, nil) if context_database_name
|
|
26
|
-
@mutex.synchronize do
|
|
27
|
-
return ConnectionContextAndHandler.new(context, nil) if context_database_name
|
|
28
|
-
|
|
29
|
-
impersonated_user = context.impersonated_user
|
|
30
|
-
principal = Principal.new(impersonated_user)
|
|
31
|
-
database_name = @principal_to_database_name[principal]
|
|
32
|
-
handler_ref = Concurrent::AtomicReference.new
|
|
33
|
-
|
|
34
|
-
if database_name.nil?
|
|
35
|
-
@principal_to_database_name[principal] = database_name
|
|
36
|
-
|
|
37
|
-
routing_table = ClusterRoutingTable.new(DatabaseNameUtil.default_database, @clock)
|
|
38
|
-
|
|
39
|
-
composition_lookup_result = @rediscovery.lookup_cluster_composition(routing_table, @connection_pool, context.rediscovery_bookmark, impersonated_user)
|
|
40
|
-
database_name = DatabaseNameUtil.database(composition_lookup_result.cluster_composition.database_name)
|
|
41
|
-
handler = get_or_create(database_name)
|
|
42
|
-
handler_ref.set(handler)
|
|
43
|
-
handler.update_routing_table(composition_lookup_result)
|
|
44
|
-
@principal_to_database_name.delete(principal)
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
context.database_name = database_name
|
|
48
|
-
ConnectionContextAndHandler.new(context, handler_ref.get)
|
|
49
|
-
end
|
|
50
|
-
end
|
|
51
|
-
|
|
52
|
-
def all_servers
|
|
53
|
-
# obviously we just had a snapshot of all servers in all routing tables
|
|
54
|
-
# after we read it, the set could already be changed.
|
|
55
|
-
@routing_table_handlers.values.map(&:servers).reduce(&:+)
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
def remove(database_name)
|
|
59
|
-
@routing_table_handlers.delete(database_name)
|
|
60
|
-
@log.debug("Routing table handler for database '#{database_name.description}' is removed.")
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def remove_aged
|
|
64
|
-
@routing_table_handlers.each do |database_name, handler|
|
|
65
|
-
if handler.routing_table_aged?
|
|
66
|
-
@log.info("Routing table handler for database '#{database_name.description}' is removed because it has not been used for a long time. Routing table: #{handler.routing_table}")
|
|
67
|
-
@routing_table_handlers.delete(database_name)
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def routing_table_handler(database_name)
|
|
73
|
-
database_name = DatabaseNameUtil.database(database_name) unless database_name.is_a?(InternalDatabaseName)
|
|
74
|
-
@routing_table_handlers[database_name]
|
|
75
|
-
end
|
|
76
|
-
|
|
77
|
-
# For tests
|
|
78
|
-
delegate :key?, to: :@routing_table_handlers
|
|
79
|
-
|
|
80
|
-
def get_or_create(database_name)
|
|
81
|
-
@routing_table_handlers.compute_if_absent(database_name) do
|
|
82
|
-
# TODO: Verify if applies
|
|
83
|
-
# Note: Atomic methods taking a block do not allow the self instance to be used within the block. Doing so will cause a deadlock.
|
|
84
|
-
handler = @factory.new_instance(database_name, self)
|
|
85
|
-
@log.debug("Routing table handler for database '#{database_name.description}' is added.")
|
|
86
|
-
handler
|
|
87
|
-
end
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
private
|
|
91
|
-
|
|
92
|
-
class RoutingTableHandlerFactory
|
|
93
|
-
def initialize(connection_pool, rediscovery, clock, logger, routing_table_purge_delay)
|
|
94
|
-
@connection_pool = connection_pool
|
|
95
|
-
@rediscovery = rediscovery
|
|
96
|
-
@clock = clock
|
|
97
|
-
@logger = logger
|
|
98
|
-
@routing_table_purge_delay = routing_table_purge_delay
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def new_instance(database_name, all_tables)
|
|
102
|
-
routing_table = ClusterRoutingTable.new(database_name, @clock)
|
|
103
|
-
RoutingTableHandlerImpl.new(routing_table, @rediscovery, @connection_pool, all_tables, @logger, @routing_table_purge_delay)
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
class Principal < Struct.new(:id)
|
|
108
|
-
end
|
|
109
|
-
|
|
110
|
-
class ConnectionContextAndHandler
|
|
111
|
-
attr_reader :context, :handler
|
|
112
|
-
|
|
113
|
-
def initialize(context, handler)
|
|
114
|
-
@context = context
|
|
115
|
-
@handler = handler
|
|
116
|
-
end
|
|
117
|
-
end
|
|
118
|
-
end
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
end
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
module Neo4j::Driver
|
|
2
|
-
module Internal
|
|
3
|
-
module Cluster
|
|
4
|
-
|
|
5
|
-
# This implementation of the {@link RoutingProcedureRunner} works with single database versions of Neo4j calling
|
|
6
|
-
# the procedure `dbms.cluster.routing.getRoutingTable`
|
|
7
|
-
class SingleDatabaseRoutingProcedureRunner
|
|
8
|
-
ROUTING_CONTEXT = :context
|
|
9
|
-
GET_ROUTING_TABLE = "CALL dbms.cluster.routing.getRoutingTable($#{ROUTING_CONTEXT})"
|
|
10
|
-
|
|
11
|
-
def initialize(context)
|
|
12
|
-
@context = context
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def run(connection, database_name, bookmark, impersonated_user)
|
|
16
|
-
delegate = connection(connection)
|
|
17
|
-
procedure = procedure_query(connection.server_version, database_name)
|
|
18
|
-
bookmark_holder = bookmark_holder(bookmark)
|
|
19
|
-
begin
|
|
20
|
-
result = run_procedure(delegate, procedure, bookmark_holder)
|
|
21
|
-
RoutingProcedureResponse.new(procedure, **result.error ? { error: result.error } : { records: result.result! })
|
|
22
|
-
rescue => error
|
|
23
|
-
handle_error(procedure, error)
|
|
24
|
-
ensure
|
|
25
|
-
release_connection(delegate)
|
|
26
|
-
end
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
private
|
|
30
|
-
|
|
31
|
-
def connection(connection)
|
|
32
|
-
Async::Connection::DirectConnection.new(connection, DatabaseNameUtil.default_database, AccessMode::WRITE, nil)
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def procedure_query(server_version, database_name)
|
|
36
|
-
if database_name.database_name.present?
|
|
37
|
-
raise Exceptions::FatalDiscoveryException, "Refreshing routing table for multi-databases is not supported in server version lower than 4.0. Current server version: #{server_version}. Database name: '#{database_name.description}'"
|
|
38
|
-
end
|
|
39
|
-
|
|
40
|
-
Query.new(GET_ROUTING_TABLE, ROUTING_CONTEXT => @context.to_h)
|
|
41
|
-
end
|
|
42
|
-
|
|
43
|
-
def bookmark_holder(_ignored)
|
|
44
|
-
BookmarkHolder::NO_OP
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
def run_procedure(connection, procedure, bookmark_holder)
|
|
48
|
-
connection.protocol
|
|
49
|
-
.run_in_auto_commit_transaction(connection, procedure, bookmark_holder, TransactionConfig.empty,
|
|
50
|
-
Handlers::Pulln::FetchSizeUtil::UNLIMITED_FETCH_SIZE)
|
|
51
|
-
.async_result.list_async
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
def release_connection(connection)
|
|
55
|
-
# It is not strictly required to release connection after routing procedure invocation because it'll
|
|
56
|
-
# be released by the PULL_ALL response handler after result is fully fetched. Such release will happen
|
|
57
|
-
# in background. However, releasing it early as part of whole chain makes it easier to reason about
|
|
58
|
-
# rediscovery in stub server tests. Some of them assume connections to instances not present in new
|
|
59
|
-
# routing table will be closed immediately.
|
|
60
|
-
connection.release
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
def handle_error(procedure, error)
|
|
64
|
-
if error.is_a? Exceptions::ClientException
|
|
65
|
-
RoutingProcedureResponse.new(procedure, error: error)
|
|
66
|
-
else
|
|
67
|
-
raise error
|
|
68
|
-
end
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
end
|