cql-rb 1.2.2 → 2.0.0.pre0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.yardopts +4 -0
- data/README.md +139 -17
- data/lib/cql/client.rb +237 -8
- data/lib/cql/client/asynchronous_client.rb +138 -54
- data/lib/cql/client/asynchronous_prepared_statement.rb +41 -6
- data/lib/cql/client/authenticators.rb +46 -0
- data/lib/cql/client/batch.rb +115 -0
- data/lib/cql/client/connector.rb +255 -0
- data/lib/cql/client/execute_options_decoder.rb +25 -9
- data/lib/cql/client/keyspace_changer.rb +5 -5
- data/lib/cql/client/peer_discovery.rb +33 -0
- data/lib/cql/client/query_result.rb +124 -1
- data/lib/cql/client/request_runner.rb +4 -2
- data/lib/cql/client/synchronous_client.rb +14 -2
- data/lib/cql/client/synchronous_prepared_statement.rb +19 -1
- data/lib/cql/future.rb +97 -50
- data/lib/cql/io/connection.rb +0 -1
- data/lib/cql/io/io_reactor.rb +1 -1
- data/lib/cql/protocol.rb +8 -1
- data/lib/cql/protocol/cql_protocol_handler.rb +2 -2
- data/lib/cql/protocol/decoding.rb +10 -15
- data/lib/cql/protocol/frame_decoder.rb +2 -1
- data/lib/cql/protocol/frame_encoder.rb +5 -4
- data/lib/cql/protocol/requests/auth_response_request.rb +31 -0
- data/lib/cql/protocol/requests/batch_request.rb +59 -0
- data/lib/cql/protocol/requests/credentials_request.rb +1 -1
- data/lib/cql/protocol/requests/execute_request.rb +45 -17
- data/lib/cql/protocol/requests/options_request.rb +1 -1
- data/lib/cql/protocol/requests/prepare_request.rb +1 -1
- data/lib/cql/protocol/requests/query_request.rb +97 -5
- data/lib/cql/protocol/requests/register_request.rb +1 -1
- data/lib/cql/protocol/requests/startup_request.rb +4 -4
- data/lib/cql/protocol/response.rb +2 -2
- data/lib/cql/protocol/responses/auth_challenge_response.rb +25 -0
- data/lib/cql/protocol/responses/auth_success_response.rb +25 -0
- data/lib/cql/protocol/responses/authenticate_response.rb +1 -1
- data/lib/cql/protocol/responses/detailed_error_response.rb +1 -1
- data/lib/cql/protocol/responses/error_response.rb +3 -2
- data/lib/cql/protocol/responses/event_response.rb +3 -2
- data/lib/cql/protocol/responses/prepared_result_response.rb +10 -6
- data/lib/cql/protocol/responses/raw_rows_result_response.rb +27 -0
- data/lib/cql/protocol/responses/ready_response.rb +1 -1
- data/lib/cql/protocol/responses/result_response.rb +2 -2
- data/lib/cql/protocol/responses/rows_result_response.rb +43 -23
- data/lib/cql/protocol/responses/schema_change_event_response.rb +1 -1
- data/lib/cql/protocol/responses/schema_change_result_response.rb +1 -1
- data/lib/cql/protocol/responses/set_keyspace_result_response.rb +1 -1
- data/lib/cql/protocol/responses/status_change_event_response.rb +1 -1
- data/lib/cql/protocol/responses/supported_response.rb +1 -1
- data/lib/cql/protocol/responses/void_result_response.rb +1 -1
- data/lib/cql/protocol/type_converter.rb +2 -2
- data/lib/cql/uuid.rb +2 -2
- data/lib/cql/version.rb +1 -1
- data/spec/cql/client/asynchronous_client_spec.rb +493 -50
- data/spec/cql/client/asynchronous_prepared_statement_spec.rb +193 -11
- data/spec/cql/client/authenticators_spec.rb +56 -0
- data/spec/cql/client/batch_spec.rb +277 -0
- data/spec/cql/client/connector_spec.rb +606 -0
- data/spec/cql/client/execute_options_decoder_spec.rb +95 -0
- data/spec/cql/client/keyspace_changer_spec.rb +8 -8
- data/spec/cql/client/peer_discovery_spec.rb +92 -0
- data/spec/cql/client/query_result_spec.rb +352 -0
- data/spec/cql/client/request_runner_spec.rb +31 -5
- data/spec/cql/client/synchronous_client_spec.rb +44 -1
- data/spec/cql/client/synchronous_prepared_statement_spec.rb +63 -1
- data/spec/cql/future_spec.rb +50 -2
- data/spec/cql/protocol/cql_protocol_handler_spec.rb +16 -5
- data/spec/cql/protocol/decoding_spec.rb +16 -6
- data/spec/cql/protocol/encoding_spec.rb +3 -1
- data/spec/cql/protocol/frame_encoder_spec.rb +99 -50
- data/spec/cql/protocol/requests/auth_response_request_spec.rb +62 -0
- data/spec/cql/protocol/requests/batch_request_spec.rb +155 -0
- data/spec/cql/protocol/requests/credentials_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/execute_request_spec.rb +184 -71
- data/spec/cql/protocol/requests/options_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/prepare_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/query_request_spec.rb +255 -32
- data/spec/cql/protocol/requests/register_request_spec.rb +1 -1
- data/spec/cql/protocol/requests/startup_request_spec.rb +12 -6
- data/spec/cql/protocol/responses/auth_challenge_response_spec.rb +31 -0
- data/spec/cql/protocol/responses/auth_success_response_spec.rb +31 -0
- data/spec/cql/protocol/responses/authenticate_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/detailed_error_response_spec.rb +14 -7
- data/spec/cql/protocol/responses/error_response_spec.rb +4 -2
- data/spec/cql/protocol/responses/event_response_spec.rb +7 -4
- data/spec/cql/protocol/responses/prepared_result_response_spec.rb +89 -34
- data/spec/cql/protocol/responses/raw_rows_result_response_spec.rb +66 -0
- data/spec/cql/protocol/responses/ready_response_spec.rb +1 -1
- data/spec/cql/protocol/responses/result_response_spec.rb +19 -7
- data/spec/cql/protocol/responses/rows_result_response_spec.rb +56 -11
- data/spec/cql/protocol/responses/schema_change_event_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/schema_change_result_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/set_keyspace_result_response_spec.rb +1 -1
- data/spec/cql/protocol/responses/status_change_event_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/supported_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/topology_change_event_response_spec.rb +2 -1
- data/spec/cql/protocol/responses/void_result_response_spec.rb +1 -1
- data/spec/cql/protocol/type_converter_spec.rb +21 -4
- data/spec/cql/uuid_spec.rb +10 -3
- data/spec/integration/client_spec.rb +251 -28
- data/spec/integration/protocol_spec.rb +213 -62
- data/spec/integration/regression_spec.rb +4 -1
- data/spec/integration/uuid_spec.rb +4 -1
- data/spec/support/fake_io_reactor.rb +5 -5
- metadata +36 -7
- data/lib/cql/client/connection_helper.rb +0 -181
- data/spec/cql/client/connection_helper_spec.rb +0 -429
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cql-rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0.pre0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Theo Hultberg
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-02-13 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A pure Ruby CQL3 driver for Cassandra
|
14
14
|
email:
|
@@ -17,18 +17,22 @@ executables: []
|
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
+
- .yardopts
|
20
21
|
- README.md
|
21
22
|
- lib/cql.rb
|
22
23
|
- lib/cql/byte_buffer.rb
|
23
24
|
- lib/cql/client.rb
|
24
25
|
- lib/cql/client/asynchronous_client.rb
|
25
26
|
- lib/cql/client/asynchronous_prepared_statement.rb
|
27
|
+
- lib/cql/client/authenticators.rb
|
28
|
+
- lib/cql/client/batch.rb
|
26
29
|
- lib/cql/client/column_metadata.rb
|
27
|
-
- lib/cql/client/connection_helper.rb
|
28
30
|
- lib/cql/client/connection_manager.rb
|
31
|
+
- lib/cql/client/connector.rb
|
29
32
|
- lib/cql/client/execute_options_decoder.rb
|
30
33
|
- lib/cql/client/keyspace_changer.rb
|
31
34
|
- lib/cql/client/null_logger.rb
|
35
|
+
- lib/cql/client/peer_discovery.rb
|
32
36
|
- lib/cql/client/query_result.rb
|
33
37
|
- lib/cql/client/query_trace.rb
|
34
38
|
- lib/cql/client/request_runner.rb
|
@@ -49,6 +53,8 @@ files:
|
|
49
53
|
- lib/cql/protocol/frame_decoder.rb
|
50
54
|
- lib/cql/protocol/frame_encoder.rb
|
51
55
|
- lib/cql/protocol/request.rb
|
56
|
+
- lib/cql/protocol/requests/auth_response_request.rb
|
57
|
+
- lib/cql/protocol/requests/batch_request.rb
|
52
58
|
- lib/cql/protocol/requests/credentials_request.rb
|
53
59
|
- lib/cql/protocol/requests/execute_request.rb
|
54
60
|
- lib/cql/protocol/requests/options_request.rb
|
@@ -57,11 +63,14 @@ files:
|
|
57
63
|
- lib/cql/protocol/requests/register_request.rb
|
58
64
|
- lib/cql/protocol/requests/startup_request.rb
|
59
65
|
- lib/cql/protocol/response.rb
|
66
|
+
- lib/cql/protocol/responses/auth_challenge_response.rb
|
67
|
+
- lib/cql/protocol/responses/auth_success_response.rb
|
60
68
|
- lib/cql/protocol/responses/authenticate_response.rb
|
61
69
|
- lib/cql/protocol/responses/detailed_error_response.rb
|
62
70
|
- lib/cql/protocol/responses/error_response.rb
|
63
71
|
- lib/cql/protocol/responses/event_response.rb
|
64
72
|
- lib/cql/protocol/responses/prepared_result_response.rb
|
73
|
+
- lib/cql/protocol/responses/raw_rows_result_response.rb
|
65
74
|
- lib/cql/protocol/responses/ready_response.rb
|
66
75
|
- lib/cql/protocol/responses/result_response.rb
|
67
76
|
- lib/cql/protocol/responses/rows_result_response.rb
|
@@ -79,10 +88,15 @@ files:
|
|
79
88
|
- spec/cql/byte_buffer_spec.rb
|
80
89
|
- spec/cql/client/asynchronous_client_spec.rb
|
81
90
|
- spec/cql/client/asynchronous_prepared_statement_spec.rb
|
91
|
+
- spec/cql/client/authenticators_spec.rb
|
92
|
+
- spec/cql/client/batch_spec.rb
|
82
93
|
- spec/cql/client/column_metadata_spec.rb
|
83
|
-
- spec/cql/client/connection_helper_spec.rb
|
84
94
|
- spec/cql/client/connection_manager_spec.rb
|
95
|
+
- spec/cql/client/connector_spec.rb
|
96
|
+
- spec/cql/client/execute_options_decoder_spec.rb
|
85
97
|
- spec/cql/client/keyspace_changer_spec.rb
|
98
|
+
- spec/cql/client/peer_discovery_spec.rb
|
99
|
+
- spec/cql/client/query_result_spec.rb
|
86
100
|
- spec/cql/client/query_trace_spec.rb
|
87
101
|
- spec/cql/client/request_runner_spec.rb
|
88
102
|
- spec/cql/client/synchronous_client_spec.rb
|
@@ -98,6 +112,8 @@ files:
|
|
98
112
|
- spec/cql/protocol/encoding_spec.rb
|
99
113
|
- spec/cql/protocol/frame_decoder_spec.rb
|
100
114
|
- spec/cql/protocol/frame_encoder_spec.rb
|
115
|
+
- spec/cql/protocol/requests/auth_response_request_spec.rb
|
116
|
+
- spec/cql/protocol/requests/batch_request_spec.rb
|
101
117
|
- spec/cql/protocol/requests/credentials_request_spec.rb
|
102
118
|
- spec/cql/protocol/requests/execute_request_spec.rb
|
103
119
|
- spec/cql/protocol/requests/options_request_spec.rb
|
@@ -105,11 +121,14 @@ files:
|
|
105
121
|
- spec/cql/protocol/requests/query_request_spec.rb
|
106
122
|
- spec/cql/protocol/requests/register_request_spec.rb
|
107
123
|
- spec/cql/protocol/requests/startup_request_spec.rb
|
124
|
+
- spec/cql/protocol/responses/auth_challenge_response_spec.rb
|
125
|
+
- spec/cql/protocol/responses/auth_success_response_spec.rb
|
108
126
|
- spec/cql/protocol/responses/authenticate_response_spec.rb
|
109
127
|
- spec/cql/protocol/responses/detailed_error_response_spec.rb
|
110
128
|
- spec/cql/protocol/responses/error_response_spec.rb
|
111
129
|
- spec/cql/protocol/responses/event_response_spec.rb
|
112
130
|
- spec/cql/protocol/responses/prepared_result_response_spec.rb
|
131
|
+
- spec/cql/protocol/responses/raw_rows_result_response_spec.rb
|
113
132
|
- spec/cql/protocol/responses/ready_response_spec.rb
|
114
133
|
- spec/cql/protocol/responses/result_response_spec.rb
|
115
134
|
- spec/cql/protocol/responses/rows_result_response_spec.rb
|
@@ -148,9 +167,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
148
167
|
version: 1.9.2
|
149
168
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
150
169
|
requirements:
|
151
|
-
- - '
|
170
|
+
- - '>'
|
152
171
|
- !ruby/object:Gem::Version
|
153
|
-
version:
|
172
|
+
version: 1.3.1
|
154
173
|
requirements: []
|
155
174
|
rubyforge_project:
|
156
175
|
rubygems_version: 2.2.1
|
@@ -161,10 +180,15 @@ test_files:
|
|
161
180
|
- spec/cql/byte_buffer_spec.rb
|
162
181
|
- spec/cql/client/asynchronous_client_spec.rb
|
163
182
|
- spec/cql/client/asynchronous_prepared_statement_spec.rb
|
183
|
+
- spec/cql/client/authenticators_spec.rb
|
184
|
+
- spec/cql/client/batch_spec.rb
|
164
185
|
- spec/cql/client/column_metadata_spec.rb
|
165
|
-
- spec/cql/client/connection_helper_spec.rb
|
166
186
|
- spec/cql/client/connection_manager_spec.rb
|
187
|
+
- spec/cql/client/connector_spec.rb
|
188
|
+
- spec/cql/client/execute_options_decoder_spec.rb
|
167
189
|
- spec/cql/client/keyspace_changer_spec.rb
|
190
|
+
- spec/cql/client/peer_discovery_spec.rb
|
191
|
+
- spec/cql/client/query_result_spec.rb
|
168
192
|
- spec/cql/client/query_trace_spec.rb
|
169
193
|
- spec/cql/client/request_runner_spec.rb
|
170
194
|
- spec/cql/client/synchronous_client_spec.rb
|
@@ -180,6 +204,8 @@ test_files:
|
|
180
204
|
- spec/cql/protocol/encoding_spec.rb
|
181
205
|
- spec/cql/protocol/frame_decoder_spec.rb
|
182
206
|
- spec/cql/protocol/frame_encoder_spec.rb
|
207
|
+
- spec/cql/protocol/requests/auth_response_request_spec.rb
|
208
|
+
- spec/cql/protocol/requests/batch_request_spec.rb
|
183
209
|
- spec/cql/protocol/requests/credentials_request_spec.rb
|
184
210
|
- spec/cql/protocol/requests/execute_request_spec.rb
|
185
211
|
- spec/cql/protocol/requests/options_request_spec.rb
|
@@ -187,11 +213,14 @@ test_files:
|
|
187
213
|
- spec/cql/protocol/requests/query_request_spec.rb
|
188
214
|
- spec/cql/protocol/requests/register_request_spec.rb
|
189
215
|
- spec/cql/protocol/requests/startup_request_spec.rb
|
216
|
+
- spec/cql/protocol/responses/auth_challenge_response_spec.rb
|
217
|
+
- spec/cql/protocol/responses/auth_success_response_spec.rb
|
190
218
|
- spec/cql/protocol/responses/authenticate_response_spec.rb
|
191
219
|
- spec/cql/protocol/responses/detailed_error_response_spec.rb
|
192
220
|
- spec/cql/protocol/responses/error_response_spec.rb
|
193
221
|
- spec/cql/protocol/responses/event_response_spec.rb
|
194
222
|
- spec/cql/protocol/responses/prepared_result_response_spec.rb
|
223
|
+
- spec/cql/protocol/responses/raw_rows_result_response_spec.rb
|
195
224
|
- spec/cql/protocol/responses/ready_response_spec.rb
|
196
225
|
- spec/cql/protocol/responses/result_response_spec.rb
|
197
226
|
- spec/cql/protocol/responses/rows_result_response_spec.rb
|
@@ -1,181 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
module Cql
|
4
|
-
module Client
|
5
|
-
# @private
|
6
|
-
class ConnectionHelper
|
7
|
-
def initialize(io_reactor, port, credentials, connections_per_node, connection_timeout, compressor, logger)
|
8
|
-
@io_reactor = io_reactor
|
9
|
-
@port = port
|
10
|
-
@credentials = credentials
|
11
|
-
@connections_per_node = connections_per_node
|
12
|
-
@connection_timeout = connection_timeout
|
13
|
-
@logger = logger
|
14
|
-
@request_runner = RequestRunner.new
|
15
|
-
@keyspace_changer = KeyspaceChanger.new
|
16
|
-
@compressor = compressor
|
17
|
-
end
|
18
|
-
|
19
|
-
def connect(hosts, initial_keyspace)
|
20
|
-
f = @io_reactor.start.flat_map do
|
21
|
-
connect_to_hosts(hosts, initial_keyspace, true)
|
22
|
-
end
|
23
|
-
f = f.map do |connections|
|
24
|
-
connected_connections = connections.select(&:connected?)
|
25
|
-
if connected_connections.empty?
|
26
|
-
e = connections.first.error
|
27
|
-
if e.is_a?(Cql::QueryError) && e.code == 0x100
|
28
|
-
e = AuthenticationError.new(e.message)
|
29
|
-
end
|
30
|
-
raise e
|
31
|
-
end
|
32
|
-
connected_connections
|
33
|
-
end
|
34
|
-
f
|
35
|
-
end
|
36
|
-
|
37
|
-
def discover_peers(seed_connections, initial_keyspace)
|
38
|
-
@logger.debug('Looking for additional nodes')
|
39
|
-
connection = seed_connections.sample
|
40
|
-
return Future.resolved([]) unless connection
|
41
|
-
request = Protocol::QueryRequest.new('SELECT peer, data_center, host_id, rpc_address FROM system.peers', :one)
|
42
|
-
peer_info = @request_runner.execute(connection, request)
|
43
|
-
peer_info.flat_map do |result|
|
44
|
-
seed_dcs = seed_connections.map { |c| c[:data_center] }.uniq
|
45
|
-
unconnected_peers = result.select do |row|
|
46
|
-
seed_dcs.include?(row['data_center']) && seed_connections.none? { |c| c[:host_id] == row['host_id'] }
|
47
|
-
end
|
48
|
-
if unconnected_peers.empty?
|
49
|
-
@logger.debug('No additional nodes found')
|
50
|
-
else
|
51
|
-
@logger.debug('%d additional nodes found' % unconnected_peers.size)
|
52
|
-
end
|
53
|
-
node_addresses = unconnected_peers.map do |row|
|
54
|
-
rpc_address = row['rpc_address'].to_s
|
55
|
-
if rpc_address == '0.0.0.0'
|
56
|
-
row['peer'].to_s
|
57
|
-
else
|
58
|
-
rpc_address
|
59
|
-
end
|
60
|
-
end
|
61
|
-
if node_addresses.any?
|
62
|
-
connect_to_hosts(node_addresses, initial_keyspace, false)
|
63
|
-
else
|
64
|
-
Future.resolved([])
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
private
|
70
|
-
|
71
|
-
def connect_to_hosts(hosts, initial_keyspace, peer_discovery)
|
72
|
-
connection_futures = hosts.flat_map do |host|
|
73
|
-
Array.new(@connections_per_node) do
|
74
|
-
connect_to_host(host, initial_keyspace).recover do |error|
|
75
|
-
FailedConnection.new(error, host, @port)
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
connection_futures.each do |cf|
|
80
|
-
cf.on_value do |c|
|
81
|
-
if c.is_a?(FailedConnection)
|
82
|
-
@logger.warn('Failed connecting to node at %s:%d: %s' % [c.host, c.port, c.error.message])
|
83
|
-
else
|
84
|
-
@logger.info('Connected to node %s at %s:%d in data center %s' % [c[:host_id], c.host, c.port, c[:data_center]])
|
85
|
-
end
|
86
|
-
c.on_closed do
|
87
|
-
@logger.warn('Connection to node %s at %s:%d in data center %s unexpectedly closed' % [c[:host_id], c.host, c.port, c[:data_center]])
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
91
|
-
hosts_connected_future = Future.all(*connection_futures)
|
92
|
-
if peer_discovery
|
93
|
-
hosts_connected_future.flat_map do |connections|
|
94
|
-
discover_peers(connections.select(&:connected?), initial_keyspace).map do |peer_connections|
|
95
|
-
connections + peer_connections
|
96
|
-
end
|
97
|
-
end
|
98
|
-
else
|
99
|
-
hosts_connected_future
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
def connect_to_host(host, keyspace)
|
104
|
-
if @compressor
|
105
|
-
@logger.debug('Connecting to node at %s:%d using "%s" compression' % [host, @port, @compressor.algorithm])
|
106
|
-
else
|
107
|
-
@logger.debug('Connecting to node at %s:%d' % [host, @port])
|
108
|
-
end
|
109
|
-
connected = @io_reactor.connect(host, @port, @connection_timeout)
|
110
|
-
connected.flat_map do |connection|
|
111
|
-
f = cache_supported_options(connection)
|
112
|
-
f = f.flat_map { send_startup_request(connection) }
|
113
|
-
f = f.flat_map { |response| maybe_authenticate(response, connection) }
|
114
|
-
f = f.flat_map { identify_node(connection) }
|
115
|
-
f = f.flat_map { change_keyspace(keyspace, connection) }
|
116
|
-
f
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def cache_supported_options(connection)
|
121
|
-
f = @request_runner.execute(connection, Protocol::OptionsRequest.new)
|
122
|
-
f.on_value do |supported_options|
|
123
|
-
connection[:cql_version] = supported_options['CQL_VERSION']
|
124
|
-
connection[:compression] = supported_options['COMPRESSION']
|
125
|
-
end
|
126
|
-
f
|
127
|
-
end
|
128
|
-
|
129
|
-
def send_startup_request(connection)
|
130
|
-
compression = @compressor && @compressor.algorithm
|
131
|
-
if @compressor && !connection[:compression].include?(@compressor.algorithm)
|
132
|
-
@logger.warn(%[Compression algorithm "#{@compressor.algorithm}" not supported (server supports "#{connection[:compression].join('", "')}")])
|
133
|
-
compression = nil
|
134
|
-
end
|
135
|
-
request = Protocol::StartupRequest.new(nil, compression)
|
136
|
-
@request_runner.execute(connection, request)
|
137
|
-
end
|
138
|
-
|
139
|
-
def maybe_authenticate(response, connection)
|
140
|
-
return Future.resolved(connection) unless response.is_a?(AuthenticationRequired)
|
141
|
-
return Future.failed(AuthenticationError.new('Server requested authentication, but no credentials given')) unless @credentials
|
142
|
-
send_credentials(@credentials, connection)
|
143
|
-
end
|
144
|
-
|
145
|
-
def send_credentials(credentials, connection)
|
146
|
-
credentials_request = Protocol::CredentialsRequest.new(credentials)
|
147
|
-
@request_runner.execute(connection, credentials_request)
|
148
|
-
end
|
149
|
-
|
150
|
-
def identify_node(connection)
|
151
|
-
request = Protocol::QueryRequest.new('SELECT data_center, host_id FROM system.local', :one)
|
152
|
-
f = @request_runner.execute(connection, request)
|
153
|
-
f.on_value do |result|
|
154
|
-
unless result.empty?
|
155
|
-
connection[:host_id] = result.first['host_id']
|
156
|
-
connection[:data_center] = result.first['data_center']
|
157
|
-
end
|
158
|
-
end
|
159
|
-
f
|
160
|
-
end
|
161
|
-
|
162
|
-
def change_keyspace(keyspace, connection)
|
163
|
-
@keyspace_changer.use_keyspace(keyspace, connection)
|
164
|
-
end
|
165
|
-
|
166
|
-
class FailedConnection
|
167
|
-
attr_reader :error, :host, :port
|
168
|
-
|
169
|
-
def initialize(error, host, port)
|
170
|
-
@error = error
|
171
|
-
@host = host
|
172
|
-
@port = port
|
173
|
-
end
|
174
|
-
|
175
|
-
def connected?
|
176
|
-
false
|
177
|
-
end
|
178
|
-
end
|
179
|
-
end
|
180
|
-
end
|
181
|
-
end
|
@@ -1,429 +0,0 @@
|
|
1
|
-
# encoding: utf-8
|
2
|
-
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
|
6
|
-
module Cql
|
7
|
-
module Client
|
8
|
-
describe ConnectionHelper do
|
9
|
-
let :connection_helper do
|
10
|
-
described_class.new(io_reactor, 9876, nil, 1, 7, compressor, logger)
|
11
|
-
end
|
12
|
-
|
13
|
-
let :io_reactor do
|
14
|
-
double(:io_reactor)
|
15
|
-
end
|
16
|
-
|
17
|
-
let :logger do
|
18
|
-
NullLogger.new
|
19
|
-
end
|
20
|
-
|
21
|
-
let :compressor do
|
22
|
-
nil
|
23
|
-
end
|
24
|
-
|
25
|
-
describe '#connect' do
|
26
|
-
let :hosts do
|
27
|
-
%w[host0 host1]
|
28
|
-
end
|
29
|
-
|
30
|
-
let :local_metadata do
|
31
|
-
[
|
32
|
-
['system', 'local', 'data_center', :text],
|
33
|
-
['system', 'local', 'host_id', :uuid],
|
34
|
-
]
|
35
|
-
end
|
36
|
-
|
37
|
-
before do
|
38
|
-
io_reactor.stub(:start).and_return(Future.resolved)
|
39
|
-
io_reactor.stub(:connect).and_return(Future.resolved)
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'starts the IO reactor' do
|
43
|
-
connection_helper.connect(hosts, nil)
|
44
|
-
io_reactor.should have_received(:start)
|
45
|
-
end
|
46
|
-
|
47
|
-
it 'fails when the IO reactor fails to start' do
|
48
|
-
io_reactor.stub(:start).and_return(Future.failed(StandardError.new('bork')))
|
49
|
-
f = connection_helper.connect(hosts, nil)
|
50
|
-
expect { f.value }.to raise_error('bork')
|
51
|
-
end
|
52
|
-
|
53
|
-
it 'connects to the specified hosts' do
|
54
|
-
connection_helper.connect(hosts, nil)
|
55
|
-
io_reactor.should have_received(:connect).with('host0', 9876, 7)
|
56
|
-
io_reactor.should have_received(:connect).with('host1', 9876, 7)
|
57
|
-
end
|
58
|
-
|
59
|
-
it 'logs a message when a node connects' do
|
60
|
-
logger.stub(:info)
|
61
|
-
io_reactor.stub(:connect).and_return(Future.resolved(FakeConnection.new('host', 9876, 7)))
|
62
|
-
connection_helper.connect(hosts, nil)
|
63
|
-
logger.should have_received(:info).with(/Connected to node/).exactly(hosts.size).times
|
64
|
-
end
|
65
|
-
|
66
|
-
it 'logs a message when connecting to a node' do
|
67
|
-
logger.stub(:debug)
|
68
|
-
io_reactor.stub(:connect).and_return(Future.resolved(FakeConnection.new('host', 9876, 7)))
|
69
|
-
connection_helper.connect(hosts, nil)
|
70
|
-
logger.should have_received(:debug).with(/Connecting to node/).exactly(hosts.size).times
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'fails when all hosts fail to connect' do
|
74
|
-
io_reactor.stub(:connect).and_return(Future.failed(StandardError.new('bork')))
|
75
|
-
f = connection_helper.connect(hosts, nil)
|
76
|
-
expect { f.value }.to raise_error('bork')
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'logs a message when a node fails to connect' do
|
80
|
-
logger.stub(:warn)
|
81
|
-
io_reactor.stub(:connect).and_return(Future.failed(StandardError.new('bork')))
|
82
|
-
connection_helper.connect(hosts, nil)
|
83
|
-
logger.should have_received(:warn).with(/Failed connecting to node/).exactly(hosts.size).times
|
84
|
-
end
|
85
|
-
|
86
|
-
it 'fails with an AuthenticationError when the connections fail to connect because of authentication issues' do
|
87
|
-
io_reactor.stub(:connect).and_return(Future.failed(QueryError.new(0x100, 'bork')))
|
88
|
-
f = connection_helper.connect(hosts, nil)
|
89
|
-
expect { f.value }.to raise_error(AuthenticationError)
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'initializes the connections' do
|
93
|
-
connection0 = FakeConnection.new('host0', 9876, 7)
|
94
|
-
connection1 = FakeConnection.new('host1', 9876, 7)
|
95
|
-
io_reactor.stub(:connect).with('host0', 9876, 7).and_return(Future.resolved(connection0))
|
96
|
-
io_reactor.stub(:connect).with('host1', 9876, 7).and_return(Future.resolved(connection1))
|
97
|
-
connection_helper.connect(hosts, 'some_keyspace')
|
98
|
-
[connection0, connection1].each do |c|
|
99
|
-
c.requests[0].should be_a(Protocol::OptionsRequest)
|
100
|
-
c.requests[1].should be_a(Protocol::StartupRequest)
|
101
|
-
c.requests[2].cql.should match(/SELECT .* FROM system.local/)
|
102
|
-
c.requests[3].cql.should == 'USE some_keyspace'
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
it 'saves the supported CQL version and compression algorithms on the connection' do
|
107
|
-
connection = FakeConnection.new('host0', 9876, 7)
|
108
|
-
connection.handle_request do |request, timeout|
|
109
|
-
if request.is_a?(Protocol::OptionsRequest)
|
110
|
-
Protocol::SupportedResponse.new('CQL_VERSION' => %w[3.1.1], 'COMPRESSION' => %w[lz4 snappy])
|
111
|
-
else
|
112
|
-
connection.default_request_handler(request, timeout)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
io_reactor.stub(:connect).with('host0', 9876, 7).and_return(Future.resolved(connection))
|
116
|
-
connection_helper.connect(hosts.take(1), 'some_keyspace')
|
117
|
-
connection[:cql_version].should == %w[3.1.1]
|
118
|
-
connection[:compression].should == %w[lz4 snappy]
|
119
|
-
end
|
120
|
-
|
121
|
-
it 'fails if authentication is required and no credentials were specified' do
|
122
|
-
connection = FakeConnection.new('host0', 9876, 7)
|
123
|
-
connection.handle_request do |request|
|
124
|
-
if request.is_a?(Protocol::StartupRequest)
|
125
|
-
Protocol::AuthenticateResponse.new('xyz')
|
126
|
-
else
|
127
|
-
connection.default_request_handler(request)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
io_reactor.stub(:connect).with('host0', 9876, 7).and_return(Future.resolved(connection))
|
131
|
-
f = connection_helper.connect(hosts, nil)
|
132
|
-
expect { f.value }.to raise_error(AuthenticationError)
|
133
|
-
end
|
134
|
-
|
135
|
-
it 'authenticates when authentication is required and credentials were specified' do
|
136
|
-
credentials = {'username' => 'foo', 'password' => 'bar'}
|
137
|
-
connection_helper = described_class.new(io_reactor, 9876, credentials, 1, 7, nil, logger)
|
138
|
-
connection = FakeConnection.new('host0', 9876, 7)
|
139
|
-
authentication_sent = false
|
140
|
-
connection.handle_request do |request|
|
141
|
-
if request.is_a?(Protocol::StartupRequest)
|
142
|
-
Protocol::AuthenticateResponse.new('xyz')
|
143
|
-
elsif request == Protocol::CredentialsRequest.new(credentials)
|
144
|
-
authentication_sent = true
|
145
|
-
Protocol::ReadyResponse.new
|
146
|
-
else
|
147
|
-
connection.default_request_handler(request)
|
148
|
-
end
|
149
|
-
end
|
150
|
-
io_reactor.stub(:connect).with('host0', 9876, 7).and_return(Future.resolved(connection))
|
151
|
-
f = connection_helper.connect(hosts, nil)
|
152
|
-
f.value
|
153
|
-
authentication_sent.should be_true
|
154
|
-
end
|
155
|
-
|
156
|
-
it 'decorates the connections with :host_id and :data_center' do
|
157
|
-
connection = FakeConnection.new('host0', 9876, 7)
|
158
|
-
connection.handle_request do |request|
|
159
|
-
if request.is_a?(Protocol::QueryRequest) && request.cql =~ /SELECT .* FROM system\.local/
|
160
|
-
row = {'data_center' => 'dc1', 'host_id' => Uuid.new('eac69196-1e28-11e3-8e2b-191b6d153d0c')}
|
161
|
-
Protocol::RowsResultResponse.new([row], local_metadata, nil)
|
162
|
-
else
|
163
|
-
connection.default_request_handler(request)
|
164
|
-
end
|
165
|
-
end
|
166
|
-
io_reactor.stub(:connect).with('host0', 9876, 7).and_return(Future.resolved(connection))
|
167
|
-
connection_helper.connect(hosts, nil)
|
168
|
-
connection[:host_id].should == Uuid.new('eac69196-1e28-11e3-8e2b-191b6d153d0c')
|
169
|
-
connection[:data_center].should == 'dc1'
|
170
|
-
end
|
171
|
-
|
172
|
-
it 'registers a close handler that logs when connections close' do
|
173
|
-
logger.stub(:warn)
|
174
|
-
connection = FakeConnection.new('host', 9876, 7)
|
175
|
-
io_reactor.stub(:connect).and_return(Future.resolved(connection))
|
176
|
-
connection_helper.connect(hosts.take(1), nil)
|
177
|
-
connection.close
|
178
|
-
logger.should have_received(:warn).with(/Connection to node .* closed/)
|
179
|
-
end
|
180
|
-
|
181
|
-
it 'initializes a peer discovery when connected to the specified hosts' do
|
182
|
-
connection_helper.stub(:discover_peers)
|
183
|
-
connection_helper.connect(hosts, nil)
|
184
|
-
connection0 = FakeConnection.new('host0', 9876, 7)
|
185
|
-
connection1 = FakeConnection.new('host1', 9876, 7)
|
186
|
-
io_reactor.stub(:connect).with('host0', 9876, 7).and_return(Future.resolved(connection0))
|
187
|
-
io_reactor.stub(:connect).with('host1', 9876, 7).and_return(Future.resolved(connection1))
|
188
|
-
connection_helper.connect(hosts, 'some_keyspace')
|
189
|
-
connection_helper.should have_received(:discover_peers).with([connection0, connection1], 'some_keyspace')
|
190
|
-
end
|
191
|
-
|
192
|
-
it 'initializes a peer discovery with the successfull connections as seeds' do
|
193
|
-
connection_helper.stub(:discover_peers)
|
194
|
-
connection_helper.connect(hosts, nil)
|
195
|
-
connection = FakeConnection.new('host0', 9876, 7)
|
196
|
-
io_reactor.stub(:connect).with('host0', 9876, 7).and_return(Future.resolved(connection))
|
197
|
-
io_reactor.stub(:connect).with('host1', 9876, 7).and_return(Future.failed(StandardError.new('bork')))
|
198
|
-
connection_helper.connect(hosts, 'some_keyspace')
|
199
|
-
connection_helper.should have_received(:discover_peers).with([connection], 'some_keyspace')
|
200
|
-
end
|
201
|
-
|
202
|
-
it 'connects to each node a configurable number of times' do
|
203
|
-
connection_helper = described_class.new(io_reactor, 9876, nil, connections_per_node = 3, 7, nil, logger)
|
204
|
-
connection_helper.connect(hosts, nil)
|
205
|
-
io_reactor.should have_received(:connect).with('host0', 9876, 7).exactly(3).times
|
206
|
-
io_reactor.should have_received(:connect).with('host1', 9876, 7).exactly(3).times
|
207
|
-
end
|
208
|
-
|
209
|
-
context 'when a compressor is specified' do
|
210
|
-
let :compressor do
|
211
|
-
double(:compressor, algorithm: 'snappy')
|
212
|
-
end
|
213
|
-
|
214
|
-
let :connection do
|
215
|
-
FakeConnection.new('host0', 9876, 7)
|
216
|
-
end
|
217
|
-
|
218
|
-
it 'enables compression by sending the algorithm with the STARTUP request' do
|
219
|
-
connection.handle_request do |request, timeout|
|
220
|
-
if request.is_a?(Protocol::OptionsRequest)
|
221
|
-
Protocol::SupportedResponse.new('CQL_VERSION' => %w[3.1.1], 'COMPRESSION' => %w[lz4 snappy])
|
222
|
-
else
|
223
|
-
connection.default_request_handler(request, timeout)
|
224
|
-
end
|
225
|
-
end
|
226
|
-
io_reactor.stub(:connect).with('host0', 9876, 7).and_return(Future.resolved(connection))
|
227
|
-
connection_helper.connect(hosts.take(1), 'some_keyspace')
|
228
|
-
connection.requests[1].options['COMPRESSION'].should == 'snappy'
|
229
|
-
end
|
230
|
-
|
231
|
-
it 'does not enable compression when the algorithm is not supported' do
|
232
|
-
connection.handle_request do |request, timeout|
|
233
|
-
if request.is_a?(Protocol::OptionsRequest)
|
234
|
-
Protocol::SupportedResponse.new('CQL_VERSION' => %w[3.1.1], 'COMPRESSION' => %w[lz4])
|
235
|
-
else
|
236
|
-
connection.default_request_handler(request, timeout)
|
237
|
-
end
|
238
|
-
end
|
239
|
-
io_reactor.stub(:connect).with('host0', 9876, 7).and_return(Future.resolved(connection))
|
240
|
-
connection_helper.connect(hosts.take(1), 'some_keyspace')
|
241
|
-
connection.requests[1].options.should_not have_key('COMPRESSION')
|
242
|
-
end
|
243
|
-
|
244
|
-
it 'logs a warning when compression was disabled because the algorithm was not supported' do
|
245
|
-
logger.stub(:warn)
|
246
|
-
connection.handle_request do |request, timeout|
|
247
|
-
if request.is_a?(Protocol::OptionsRequest)
|
248
|
-
Protocol::SupportedResponse.new('CQL_VERSION' => %w[3.1.1], 'COMPRESSION' => %w[lz4])
|
249
|
-
else
|
250
|
-
connection.default_request_handler(request, timeout)
|
251
|
-
end
|
252
|
-
end
|
253
|
-
io_reactor.stub(:connect).with('host0', 9876, 7).and_return(Future.resolved(connection))
|
254
|
-
connection_helper.connect(hosts.take(1), 'some_keyspace')
|
255
|
-
logger.should have_received(:warn).with(/not supported/)
|
256
|
-
end
|
257
|
-
|
258
|
-
it 'logs the name of the compression algorithm when connecting' do
|
259
|
-
logger.stub(:debug)
|
260
|
-
io_reactor.stub(:connect).with('host0', 9876, 7).and_return(Future.resolved(connection))
|
261
|
-
connection_helper.connect(hosts.take(1), 'some_keyspace')
|
262
|
-
logger.should have_received(:debug).with(/using "snappy" compression/)
|
263
|
-
end
|
264
|
-
end
|
265
|
-
end
|
266
|
-
|
267
|
-
describe '#discover_peers' do
|
268
|
-
let :seed_connections do
|
269
|
-
[
|
270
|
-
FakeConnection.new('host0', 9042, 5),
|
271
|
-
FakeConnection.new('host1', 9042, 5),
|
272
|
-
FakeConnection.new('host2', 9042, 5),
|
273
|
-
]
|
274
|
-
end
|
275
|
-
|
276
|
-
let :seed_connection_rows do
|
277
|
-
[
|
278
|
-
{'peer' => IPAddr.new('2.0.0.0'), 'rpc_address' => IPAddr.new('1.0.0.0'), 'data_center' => 'dc1', 'host_id' => Uuid.new('eac69196-1e28-11e3-8e2b-191b6d153d0c')},
|
279
|
-
{'peer' => IPAddr.new('2.0.0.1'), 'rpc_address' => IPAddr.new('1.0.0.1'), 'data_center' => 'dc1', 'host_id' => Uuid.new('fa5f9562-1e28-11e3-bf05-3d3a155d0608')},
|
280
|
-
{'peer' => IPAddr.new('2.0.0.2'), 'rpc_address' => IPAddr.new('1.0.0.2'), 'data_center' => 'dc1', 'host_id' => Uuid.new('018b8f1c-1e29-11e3-b14f-532d016437ce')},
|
281
|
-
]
|
282
|
-
end
|
283
|
-
|
284
|
-
let :extra_connection_rows do
|
285
|
-
[
|
286
|
-
{'peer' => IPAddr.new('2.0.0.3'), 'rpc_address' => IPAddr.new('1.0.0.3'), 'data_center' => 'dc1', 'host_id' => Uuid.new('7a3ccace-1e2a-11e3-a447-43312b1c66e4')},
|
287
|
-
{'peer' => IPAddr.new('2.0.0.4'), 'rpc_address' => IPAddr.new('1.0.0.4'), 'data_center' => 'dc1', 'host_id' => Uuid.new('7bbd4e32-1e2a-11e3-b21d-69d7c02cece8')},
|
288
|
-
{'peer' => IPAddr.new('2.0.0.5'), 'rpc_address' => IPAddr.new('1.0.0.5'), 'data_center' => 'dc1', 'host_id' => Uuid.new('7d7e76f6-1e2a-11e3-bfa0-4fb416ef4064')},
|
289
|
-
]
|
290
|
-
end
|
291
|
-
|
292
|
-
let :peer_metadata do
|
293
|
-
[
|
294
|
-
['system', 'peers', 'peer', :inet],
|
295
|
-
['system', 'peers', 'data_center', :varchar],
|
296
|
-
['system', 'peers', 'host_id', :uuid],
|
297
|
-
['system', 'peers', 'rpc_address', :inet],
|
298
|
-
]
|
299
|
-
end
|
300
|
-
|
301
|
-
before do
|
302
|
-
seed_connections.each_with_index do |c, i|
|
303
|
-
c[:host_id] = seed_connection_rows[i]['host_id']
|
304
|
-
c[:data_center] = seed_connection_rows[i]['data_center']
|
305
|
-
end
|
306
|
-
end
|
307
|
-
|
308
|
-
def peer_request_response
|
309
|
-
seed_connections.each do |c|
|
310
|
-
c.handle_request do |request|
|
311
|
-
if request.cql =~ /SELECT .* FROM system\.peers/
|
312
|
-
Protocol::RowsResultResponse.new(yield, peer_metadata, nil)
|
313
|
-
end
|
314
|
-
end
|
315
|
-
end
|
316
|
-
end
|
317
|
-
|
318
|
-
it 'returns immediately if there are no seed connections' do
|
319
|
-
f = connection_helper.discover_peers([], nil)
|
320
|
-
f.value
|
321
|
-
end
|
322
|
-
|
323
|
-
it 'logs a message when it begins' do
|
324
|
-
logger.stub(:debug)
|
325
|
-
connection_helper.discover_peers([], nil)
|
326
|
-
logger.should have_received(:debug).with(/Looking for additional nodes/)
|
327
|
-
end
|
328
|
-
|
329
|
-
it 'asks a random connection for its peers' do
|
330
|
-
connection_helper.discover_peers(seed_connections, nil)
|
331
|
-
connection = seed_connections.find { |c| c.requests.any? }
|
332
|
-
connection.requests.first.cql.should match(/SELECT .* FROM system\.peers/)
|
333
|
-
end
|
334
|
-
|
335
|
-
it 'returns an empty list when it only finds nodes it\'s already connected to' do
|
336
|
-
peer_request_response { seed_connection_rows }
|
337
|
-
f = connection_helper.discover_peers(seed_connections, nil)
|
338
|
-
f.value.should be_empty
|
339
|
-
end
|
340
|
-
|
341
|
-
it 'logs a message when it finds no new nodes' do
|
342
|
-
logger.stub(:debug)
|
343
|
-
peer_request_response { seed_connection_rows }
|
344
|
-
connection_helper.discover_peers(seed_connections, nil)
|
345
|
-
logger.should have_received(:debug).with(/No additional nodes found/)
|
346
|
-
end
|
347
|
-
|
348
|
-
it 'returns an empty list when it only finds nodes data centers other than those of the seed connections' do
|
349
|
-
seed_connections[1][:data_center] = 'dc2'
|
350
|
-
seed_connection_rows[1]['data_center'] = 'dc2'
|
351
|
-
extra_connection_rows[0]['data_center'] = 'dc3'
|
352
|
-
peer_request_response { seed_connection_rows + extra_connection_rows.take(1) }
|
353
|
-
f = connection_helper.discover_peers(seed_connections, nil)
|
354
|
-
f.value.should be_empty
|
355
|
-
end
|
356
|
-
|
357
|
-
it 'connects to the nodes it finds that it is not already connected to' do
|
358
|
-
connection = FakeConnection.new('host3', 9876, 7)
|
359
|
-
io_reactor.stub(:connect).with('1.0.0.3', 9876, 7).and_return(Future.resolved(connection))
|
360
|
-
peer_request_response { seed_connection_rows + extra_connection_rows.take(1) }
|
361
|
-
f = connection_helper.discover_peers(seed_connections, nil)
|
362
|
-
f.value
|
363
|
-
end
|
364
|
-
|
365
|
-
it 'logs the number of new nodes found' do
|
366
|
-
logger.stub(:debug)
|
367
|
-
connection = FakeConnection.new('host3', 9876, 7)
|
368
|
-
io_reactor.stub(:connect).with('1.0.0.3', 9876, 7).and_return(Future.resolved(connection))
|
369
|
-
peer_request_response { seed_connection_rows + extra_connection_rows.take(1) }
|
370
|
-
connection_helper.discover_peers(seed_connections, nil)
|
371
|
-
logger.should have_received(:debug).with(/1 additional nodes found/)
|
372
|
-
end
|
373
|
-
|
374
|
-
it 'returns the new connections' do
|
375
|
-
connection = FakeConnection.new('host3', 9876, 7)
|
376
|
-
io_reactor.stub(:connect).with('1.0.0.3', 9876, 7).and_return(Future.resolved(connection))
|
377
|
-
peer_request_response { seed_connection_rows + extra_connection_rows.take(1) }
|
378
|
-
f = connection_helper.discover_peers(seed_connections, nil)
|
379
|
-
f.value.should == [connection]
|
380
|
-
end
|
381
|
-
|
382
|
-
it 'initializes the new connections' do
|
383
|
-
connection = FakeConnection.new('host3', 9876, 7)
|
384
|
-
io_reactor.stub(:connect).with('1.0.0.3', 9876, 7).and_return(Future.resolved(connection))
|
385
|
-
peer_request_response { seed_connection_rows + extra_connection_rows.take(1) }
|
386
|
-
f = connection_helper.discover_peers(seed_connections, 'some_keyspace')
|
387
|
-
f.value
|
388
|
-
connection.requests[0].should be_a(Protocol::OptionsRequest)
|
389
|
-
connection.requests[1].should be_a(Protocol::StartupRequest)
|
390
|
-
connection.requests[2].cql.should match(/SELECT .* FROM system.local/)
|
391
|
-
connection.requests[3].cql.should == 'USE some_keyspace'
|
392
|
-
end
|
393
|
-
|
394
|
-
it 'connects only to node in the same data centers as the seed nodes' do
|
395
|
-
seed_connections[1][:data_center] = 'dc2'
|
396
|
-
seed_connection_rows[1]['data_center'] = 'dc2'
|
397
|
-
extra_connection_rows[0]['data_center'] = 'dc3'
|
398
|
-
extra_connection_rows[1]['data_center'] = 'dc2'
|
399
|
-
extra_connection_rows[2]['data_center'] = 'dc1'
|
400
|
-
connection4 = FakeConnection.new('host4', 9876, 7)
|
401
|
-
connection5 = FakeConnection.new('host5', 9876, 7)
|
402
|
-
io_reactor.stub(:connect).with('1.0.0.4', 9876, 7).and_return(Future.resolved(connection4))
|
403
|
-
io_reactor.stub(:connect).with('1.0.0.5', 9876, 7).and_return(Future.resolved(connection5))
|
404
|
-
peer_request_response { seed_connection_rows + extra_connection_rows.take(3) }
|
405
|
-
f = connection_helper.discover_peers(seed_connections, nil)
|
406
|
-
f.value.should == [connection4, connection5]
|
407
|
-
end
|
408
|
-
|
409
|
-
it 'uses the peer address instead of the RPC address when latter is 0.0.0.0' do
|
410
|
-
extra_connection_rows[0]['rpc_address'] = IPAddr.new('0.0.0.0')
|
411
|
-
connection = FakeConnection.new('host3', 9876, 7)
|
412
|
-
io_reactor.stub(:connect).with(extra_connection_rows[0]['peer'].to_s, 9876, 7).and_return(Future.resolved(connection))
|
413
|
-
peer_request_response { seed_connection_rows + extra_connection_rows.take(1) }
|
414
|
-
f = connection_helper.discover_peers(seed_connections, nil)
|
415
|
-
f.value
|
416
|
-
end
|
417
|
-
|
418
|
-
it 'connects to each node a configurable number of times' do
|
419
|
-
connection_helper = described_class.new(io_reactor, 9876, nil, connections_per_node = 3, 7, nil, logger)
|
420
|
-
connection = FakeConnection.new('host3', 9876, 7)
|
421
|
-
io_reactor.stub(:connect).with('1.0.0.3', 9876, 7).and_return(Future.resolved(connection))
|
422
|
-
peer_request_response { seed_connection_rows + extra_connection_rows.take(1) }
|
423
|
-
connection_helper.discover_peers(seed_connections, nil).value
|
424
|
-
io_reactor.should have_received(:connect).with('1.0.0.3', 9876, 7).exactly(3).times
|
425
|
-
end
|
426
|
-
end
|
427
|
-
end
|
428
|
-
end
|
429
|
-
end
|