cassandra-driver 3.0.0.beta.1-java → 3.0.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 +106 -39
- data/lib/cassandra.rb +396 -148
- data/lib/cassandra/address_resolution.rb +1 -1
- data/lib/cassandra/address_resolution/policies/ec2_multi_region.rb +1 -1
- data/lib/cassandra/address_resolution/policies/none.rb +1 -1
- data/lib/cassandra/aggregate.rb +21 -7
- data/lib/cassandra/argument.rb +2 -2
- data/lib/cassandra/attr_boolean.rb +33 -0
- data/lib/cassandra/auth.rb +6 -5
- data/lib/cassandra/auth/providers.rb +1 -1
- data/lib/cassandra/auth/providers/password.rb +5 -13
- data/lib/cassandra/cassandra_logger.rb +80 -0
- data/lib/cassandra/cluster.rb +49 -9
- data/lib/cassandra/cluster/client.rb +835 -209
- data/lib/cassandra/cluster/connection_pool.rb +2 -2
- data/lib/cassandra/cluster/connector.rb +86 -27
- data/lib/cassandra/cluster/control_connection.rb +222 -95
- data/lib/cassandra/cluster/failed_connection.rb +1 -1
- data/lib/cassandra/cluster/metadata.rb +14 -8
- data/lib/cassandra/cluster/options.rb +68 -22
- data/lib/cassandra/cluster/registry.rb +81 -17
- data/lib/cassandra/cluster/schema.rb +70 -8
- data/lib/cassandra/cluster/schema/cql_type_parser.rb +15 -10
- data/lib/cassandra/cluster/schema/fetchers.rb +601 -241
- data/lib/cassandra/cluster/schema/fqcn_type_parser.rb +39 -38
- data/lib/cassandra/cluster/schema/partitioners.rb +1 -1
- data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +6 -8
- data/lib/cassandra/cluster/schema/partitioners/ordered.rb +1 -1
- data/lib/cassandra/cluster/schema/partitioners/random.rb +1 -1
- data/lib/cassandra/cluster/schema/replication_strategies.rb +1 -1
- data/lib/cassandra/cluster/schema/replication_strategies/network_topology.rb +19 -18
- data/lib/cassandra/cluster/schema/replication_strategies/none.rb +1 -1
- data/lib/cassandra/cluster/schema/replication_strategies/simple.rb +1 -1
- data/lib/cassandra/column.rb +4 -23
- data/lib/cassandra/column_container.rb +322 -0
- data/lib/cassandra/compression.rb +1 -1
- data/lib/cassandra/compression/compressors/lz4.rb +7 -8
- data/lib/cassandra/compression/compressors/snappy.rb +4 -3
- data/lib/cassandra/driver.rb +107 -46
- data/lib/cassandra/errors.rb +303 -52
- data/lib/cassandra/execution/info.rb +16 -5
- data/lib/cassandra/execution/options.rb +102 -55
- data/lib/cassandra/execution/trace.rb +16 -9
- data/lib/cassandra/executors.rb +1 -1
- data/lib/cassandra/function.rb +19 -13
- data/lib/cassandra/function_collection.rb +85 -0
- data/lib/cassandra/future.rb +101 -49
- data/lib/cassandra/host.rb +25 -5
- data/lib/cassandra/index.rb +118 -0
- data/lib/cassandra/keyspace.rb +169 -33
- data/lib/cassandra/listener.rb +1 -1
- data/lib/cassandra/load_balancing.rb +2 -2
- data/lib/cassandra/load_balancing/policies.rb +1 -1
- data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +39 -25
- data/lib/cassandra/load_balancing/policies/round_robin.rb +8 -1
- data/lib/cassandra/load_balancing/policies/token_aware.rb +22 -13
- data/lib/cassandra/load_balancing/policies/white_list.rb +18 -5
- data/lib/cassandra/materialized_view.rb +90 -0
- data/lib/cassandra/null_logger.rb +27 -6
- data/lib/cassandra/protocol.rb +1 -1
- data/lib/cassandra/protocol/coder.rb +81 -42
- data/lib/cassandra/protocol/cql_byte_buffer.rb +58 -44
- data/lib/cassandra/protocol/cql_protocol_handler.rb +57 -54
- data/lib/cassandra/protocol/request.rb +6 -7
- data/lib/cassandra/protocol/requests/auth_response_request.rb +3 -3
- data/lib/cassandra/protocol/requests/batch_request.rb +17 -8
- data/lib/cassandra/protocol/requests/credentials_request.rb +3 -3
- data/lib/cassandra/protocol/requests/execute_request.rb +39 -20
- data/lib/cassandra/protocol/requests/options_request.rb +1 -1
- data/lib/cassandra/protocol/requests/prepare_request.rb +5 -5
- data/lib/cassandra/protocol/requests/query_request.rb +28 -23
- data/lib/cassandra/protocol/requests/register_request.rb +2 -2
- data/lib/cassandra/protocol/requests/startup_request.rb +8 -8
- data/lib/cassandra/protocol/requests/void_query_request.rb +1 -1
- data/lib/cassandra/protocol/response.rb +3 -4
- data/lib/cassandra/protocol/responses/already_exists_error_response.rb +12 -2
- data/lib/cassandra/protocol/responses/auth_challenge_response.rb +4 -5
- data/lib/cassandra/protocol/responses/auth_success_response.rb +4 -5
- data/lib/cassandra/protocol/responses/authenticate_response.rb +4 -5
- data/lib/cassandra/protocol/responses/error_response.rb +104 -17
- data/lib/cassandra/protocol/responses/event_response.rb +3 -4
- data/lib/cassandra/protocol/responses/function_failure_error_response.rb +13 -2
- data/lib/cassandra/protocol/responses/prepared_result_response.rb +14 -9
- data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +14 -9
- data/lib/cassandra/protocol/responses/read_failure_error_response.rb +26 -4
- data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +22 -3
- data/lib/cassandra/protocol/responses/ready_response.rb +6 -7
- data/lib/cassandra/protocol/responses/result_response.rb +11 -10
- data/lib/cassandra/protocol/responses/rows_result_response.rb +8 -7
- data/lib/cassandra/protocol/responses/schema_change_event_response.rb +8 -8
- data/lib/cassandra/protocol/responses/schema_change_result_response.rb +19 -13
- data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +5 -6
- data/lib/cassandra/protocol/responses/status_change_event_response.rb +5 -6
- data/lib/cassandra/protocol/responses/supported_response.rb +4 -5
- data/lib/cassandra/protocol/responses/topology_change_event_response.rb +4 -5
- data/lib/cassandra/protocol/responses/unavailable_error_response.rb +20 -3
- data/lib/cassandra/protocol/responses/unprepared_error_response.rb +11 -2
- data/lib/cassandra/protocol/responses/void_result_response.rb +4 -5
- data/lib/cassandra/protocol/responses/write_failure_error_response.rb +26 -4
- data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +22 -3
- data/lib/cassandra/protocol/v1.rb +98 -37
- data/lib/cassandra/protocol/v3.rb +121 -50
- data/lib/cassandra/protocol/v4.rb +172 -68
- data/lib/cassandra/reconnection.rb +1 -1
- data/lib/cassandra/reconnection/policies.rb +1 -1
- data/lib/cassandra/reconnection/policies/constant.rb +2 -4
- data/lib/cassandra/reconnection/policies/exponential.rb +6 -6
- data/lib/cassandra/result.rb +55 -20
- data/lib/cassandra/retry.rb +8 -8
- data/lib/cassandra/retry/policies.rb +1 -1
- data/lib/cassandra/retry/policies/default.rb +1 -1
- data/lib/cassandra/retry/policies/downgrading_consistency.rb +4 -2
- data/lib/cassandra/retry/policies/fallthrough.rb +1 -1
- data/lib/cassandra/session.rb +24 -16
- data/lib/cassandra/statement.rb +1 -1
- data/lib/cassandra/statements.rb +1 -1
- data/lib/cassandra/statements/batch.rb +16 -10
- data/lib/cassandra/statements/bound.rb +10 -3
- data/lib/cassandra/statements/prepared.rb +62 -18
- data/lib/cassandra/statements/simple.rb +23 -10
- data/lib/cassandra/statements/void.rb +1 -1
- data/lib/cassandra/table.rb +53 -185
- data/lib/cassandra/time.rb +11 -6
- data/lib/cassandra/time_uuid.rb +12 -14
- data/lib/cassandra/timestamp_generator.rb +37 -0
- data/lib/cassandra/timestamp_generator/simple.rb +38 -0
- data/lib/cassandra/timestamp_generator/ticking_on_duplicate.rb +58 -0
- data/lib/cassandra/tuple.rb +4 -4
- data/lib/cassandra/types.rb +109 -71
- data/lib/cassandra/udt.rb +66 -50
- data/lib/cassandra/util.rb +155 -15
- data/lib/cassandra/uuid.rb +20 -21
- data/lib/cassandra/uuid/generator.rb +7 -5
- data/lib/cassandra/version.rb +2 -2
- data/lib/cassandra_murmur3.jar +0 -0
- data/lib/datastax/cassandra.rb +1 -1
- metadata +27 -16
data/lib/cassandra/keyspace.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
#--
|
4
|
-
# Copyright 2013-
|
4
|
+
# Copyright 2013-2016 DataStax, Inc.
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
# you may not use this file except in compliance with the License.
|
@@ -42,7 +42,7 @@ module Cassandra
|
|
42
42
|
@klass == other.klass &&
|
43
43
|
@options == other.options
|
44
44
|
end
|
45
|
-
alias
|
45
|
+
alias == eql?
|
46
46
|
end
|
47
47
|
|
48
48
|
# @return [String] this keyspace name
|
@@ -51,7 +51,14 @@ module Cassandra
|
|
51
51
|
attr_reader :replication
|
52
52
|
|
53
53
|
# @private
|
54
|
-
def initialize(name,
|
54
|
+
def initialize(name,
|
55
|
+
durable_writes,
|
56
|
+
replication,
|
57
|
+
tables,
|
58
|
+
types,
|
59
|
+
functions,
|
60
|
+
aggregates,
|
61
|
+
views)
|
55
62
|
@name = name
|
56
63
|
@durable_writes = durable_writes
|
57
64
|
@replication = replication
|
@@ -59,6 +66,15 @@ module Cassandra
|
|
59
66
|
@types = types
|
60
67
|
@functions = functions
|
61
68
|
@aggregates = aggregates
|
69
|
+
@views = views
|
70
|
+
|
71
|
+
# Set the keyspace attribute on the tables and views.
|
72
|
+
@tables.each_value do |t|
|
73
|
+
t.set_keyspace(self)
|
74
|
+
end
|
75
|
+
@views.each_value do |v|
|
76
|
+
v.set_keyspace(self)
|
77
|
+
end
|
62
78
|
end
|
63
79
|
|
64
80
|
# @return [Boolean] whether durables writes are enabled for this keyspace
|
@@ -69,7 +85,7 @@ module Cassandra
|
|
69
85
|
# @return [Boolean] whether this keyspace has a table with the given name
|
70
86
|
# @param name [String] table name
|
71
87
|
def has_table?(name)
|
72
|
-
@tables.
|
88
|
+
@tables.key?(name)
|
73
89
|
end
|
74
90
|
|
75
91
|
# @return [Cassandra::Table, nil] a table or nil
|
@@ -92,13 +108,41 @@ module Cassandra
|
|
92
108
|
@tables.values
|
93
109
|
end
|
94
110
|
end
|
95
|
-
alias
|
111
|
+
alias tables each_table
|
112
|
+
|
113
|
+
# @return [Boolean] whether this keyspace has a materialized view with the given name
|
114
|
+
# @param name [String] materialized view name
|
115
|
+
def has_materialized_view?(name)
|
116
|
+
@views.key?(name)
|
117
|
+
end
|
118
|
+
|
119
|
+
# @return [Cassandra::MaterializedView, nil] a materialized view or nil
|
120
|
+
# @param name [String] materialized view name
|
121
|
+
def materialized_view(name)
|
122
|
+
@views[name]
|
123
|
+
end
|
124
|
+
|
125
|
+
# Yield or enumerate each materialized view defined in this keyspace
|
126
|
+
# @overload each_materialized_view
|
127
|
+
# @yieldparam view [Cassandra::MaterializedView] current materialized view
|
128
|
+
# @return [Cassandra::Keyspace] self
|
129
|
+
# @overload each_materialized_view
|
130
|
+
# @return [Array<Cassandra::MaterializedView>] a list of materialized views
|
131
|
+
def each_materialized_view(&block)
|
132
|
+
if block_given?
|
133
|
+
@views.each_value(&block)
|
134
|
+
self
|
135
|
+
else
|
136
|
+
@views.values
|
137
|
+
end
|
138
|
+
end
|
139
|
+
alias materialized_views each_materialized_view
|
96
140
|
|
97
141
|
# @return [Boolean] whether this keyspace has a user-defined type with the
|
98
142
|
# given name
|
99
143
|
# @param name [String] user-defined type name
|
100
144
|
def has_type?(name)
|
101
|
-
@types.
|
145
|
+
@types.key?(name)
|
102
146
|
end
|
103
147
|
|
104
148
|
# @return [Cassandra::Types::UserDefined, nil] a type or nil
|
@@ -121,13 +165,14 @@ module Cassandra
|
|
121
165
|
@types.values
|
122
166
|
end
|
123
167
|
end
|
124
|
-
alias
|
168
|
+
alias types each_type
|
125
169
|
|
126
|
-
# @return [Boolean] whether this keyspace has a function with the given name and
|
170
|
+
# @return [Boolean] whether this keyspace has a function with the given name and
|
171
|
+
# arguments
|
127
172
|
# @param name [String] function name
|
128
173
|
# @param args [Array<String>] (var-args style) function argument types
|
129
174
|
def has_function?(name, *args)
|
130
|
-
|
175
|
+
!@functions.get(name.downcase, args).nil?
|
131
176
|
end
|
132
177
|
|
133
178
|
# @return [Cassandra::Function, nil] a function or nil
|
@@ -136,7 +181,7 @@ module Cassandra
|
|
136
181
|
def function(name, *args)
|
137
182
|
# The functions_hash datastructure is a hash <[func-name, args], Function>.
|
138
183
|
# So construct the array-key we're looking for.
|
139
|
-
@functions
|
184
|
+
@functions.get(name.downcase, args)
|
140
185
|
end
|
141
186
|
|
142
187
|
# Yield or enumerate each function defined in this keyspace
|
@@ -147,27 +192,27 @@ module Cassandra
|
|
147
192
|
# @return [Array<Cassandra::Function>] a list of functions
|
148
193
|
def each_function(&block)
|
149
194
|
if block_given?
|
150
|
-
@functions.
|
195
|
+
@functions.each_function(&block)
|
151
196
|
self
|
152
197
|
else
|
153
|
-
@functions.
|
198
|
+
@functions.functions
|
154
199
|
end
|
155
200
|
end
|
156
|
-
alias
|
201
|
+
alias functions each_function
|
157
202
|
|
158
203
|
# @return [Boolean] whether this keyspace has an aggregate with the given
|
159
204
|
# name and arguments
|
160
205
|
# @param name [String] aggregate name
|
161
206
|
# @param args [Array<String>] (var-args style) aggregate function argument types
|
162
207
|
def has_aggregate?(name, *args)
|
163
|
-
|
208
|
+
!@aggregates.get(name.downcase, args).nil?
|
164
209
|
end
|
165
210
|
|
166
211
|
# @return [Cassandra::Aggregate, nil] an aggregate or nil
|
167
212
|
# @param name [String] aggregate name
|
168
213
|
# @param args [Array<String>] (var-args style) aggregate function argument types
|
169
214
|
def aggregate(name, *args)
|
170
|
-
@aggregates
|
215
|
+
@aggregates.get(name.downcase, args)
|
171
216
|
end
|
172
217
|
|
173
218
|
# Yield or enumerate each aggregate defined in this keyspace
|
@@ -178,17 +223,19 @@ module Cassandra
|
|
178
223
|
# @return [Array<Cassandra::Aggregate>] a list of aggregates
|
179
224
|
def each_aggregate(&block)
|
180
225
|
if block_given?
|
181
|
-
@aggregates.
|
226
|
+
@aggregates.each_function(&block)
|
182
227
|
self
|
183
228
|
else
|
184
|
-
@aggregates.
|
229
|
+
@aggregates.functions
|
185
230
|
end
|
186
231
|
end
|
187
|
-
alias
|
232
|
+
alias aggregates each_aggregate
|
188
233
|
|
189
234
|
# @return [String] a cql representation of this keyspace
|
190
235
|
def to_cql
|
191
|
-
"CREATE KEYSPACE #{Util.escape_name(@name)}
|
236
|
+
"CREATE KEYSPACE #{Util.escape_name(@name)} " \
|
237
|
+
"WITH replication = #{@replication.to_cql} AND " \
|
238
|
+
"durable_writes = #{@durable_writes};"
|
192
239
|
end
|
193
240
|
|
194
241
|
# @private
|
@@ -202,67 +249,151 @@ module Cassandra
|
|
202
249
|
@functions == other.raw_functions &&
|
203
250
|
@aggregates == other.raw_aggregates
|
204
251
|
end
|
205
|
-
alias
|
252
|
+
alias == eql?
|
206
253
|
|
207
254
|
# @private
|
208
255
|
def inspect
|
209
|
-
"#<#{self.class.name}:0x#{
|
256
|
+
"#<#{self.class.name}:0x#{object_id.to_s(16)} @name=#{@name}>"
|
210
257
|
end
|
211
258
|
|
212
259
|
# @private
|
213
260
|
def update_table(table)
|
214
261
|
tables = @tables.dup
|
215
262
|
tables[table.name] = table
|
216
|
-
Keyspace.new(@name,
|
263
|
+
Keyspace.new(@name,
|
264
|
+
@durable_writes,
|
265
|
+
@replication,
|
266
|
+
tables,
|
267
|
+
@types,
|
268
|
+
@functions,
|
269
|
+
@aggregates,
|
270
|
+
@views)
|
217
271
|
end
|
218
272
|
|
219
273
|
# @private
|
220
274
|
def delete_table(table_name)
|
221
275
|
tables = @tables.dup
|
222
276
|
tables.delete(table_name)
|
223
|
-
Keyspace.new(@name,
|
277
|
+
Keyspace.new(@name,
|
278
|
+
@durable_writes,
|
279
|
+
@replication,
|
280
|
+
tables,
|
281
|
+
@types,
|
282
|
+
@functions,
|
283
|
+
@aggregates,
|
284
|
+
@views)
|
285
|
+
end
|
286
|
+
|
287
|
+
# @private
|
288
|
+
def update_materialized_view(view)
|
289
|
+
views = @views.dup
|
290
|
+
views[view.name] = view
|
291
|
+
Keyspace.new(@name,
|
292
|
+
@durable_writes,
|
293
|
+
@replication,
|
294
|
+
@tables,
|
295
|
+
@types,
|
296
|
+
@functions,
|
297
|
+
@aggregates,
|
298
|
+
views)
|
299
|
+
end
|
300
|
+
|
301
|
+
# @private
|
302
|
+
def delete_materialized_view(view_name)
|
303
|
+
views = @views.dup
|
304
|
+
views.delete(view_name)
|
305
|
+
Keyspace.new(@name,
|
306
|
+
@durable_writes,
|
307
|
+
@replication,
|
308
|
+
@tables,
|
309
|
+
@types,
|
310
|
+
@functions,
|
311
|
+
@aggregates,
|
312
|
+
views)
|
224
313
|
end
|
225
314
|
|
226
315
|
# @private
|
227
316
|
def update_type(type)
|
228
317
|
types = @types.dup
|
229
318
|
types[type.name] = type
|
230
|
-
Keyspace.new(@name,
|
319
|
+
Keyspace.new(@name,
|
320
|
+
@durable_writes,
|
321
|
+
@replication,
|
322
|
+
@tables,
|
323
|
+
types,
|
324
|
+
@functions,
|
325
|
+
@aggregates,
|
326
|
+
@views)
|
231
327
|
end
|
232
328
|
|
233
329
|
# @private
|
234
330
|
def delete_type(type_name)
|
235
331
|
types = @types.dup
|
236
332
|
types.delete(type_name)
|
237
|
-
Keyspace.new(@name,
|
333
|
+
Keyspace.new(@name,
|
334
|
+
@durable_writes,
|
335
|
+
@replication,
|
336
|
+
@tables,
|
337
|
+
types,
|
338
|
+
@functions,
|
339
|
+
@aggregates,
|
340
|
+
@views)
|
238
341
|
end
|
239
342
|
|
240
343
|
# @private
|
241
344
|
def update_function(function)
|
242
345
|
functions = @functions.dup
|
243
|
-
functions
|
244
|
-
Keyspace.new(@name,
|
346
|
+
functions.add_or_update(function)
|
347
|
+
Keyspace.new(@name,
|
348
|
+
@durable_writes,
|
349
|
+
@replication,
|
350
|
+
@tables,
|
351
|
+
@types,
|
352
|
+
functions,
|
353
|
+
@aggregates,
|
354
|
+
@views)
|
245
355
|
end
|
246
356
|
|
247
357
|
# @private
|
248
358
|
def delete_function(function_name, function_args)
|
249
359
|
functions = @functions.dup
|
250
|
-
functions.delete(
|
251
|
-
Keyspace.new(@name,
|
360
|
+
functions.delete(function_name, function_args)
|
361
|
+
Keyspace.new(@name,
|
362
|
+
@durable_writes,
|
363
|
+
@replication,
|
364
|
+
@tables,
|
365
|
+
@types,
|
366
|
+
functions,
|
367
|
+
@aggregates,
|
368
|
+
@views)
|
252
369
|
end
|
253
370
|
|
254
371
|
# @private
|
255
372
|
def update_aggregate(aggregate)
|
256
373
|
aggregates = @aggregates.dup
|
257
|
-
aggregates
|
258
|
-
Keyspace.new(@name,
|
374
|
+
aggregates.add_or_update(aggregate)
|
375
|
+
Keyspace.new(@name,
|
376
|
+
@durable_writes,
|
377
|
+
@replication,
|
378
|
+
@tables,
|
379
|
+
@types,
|
380
|
+
@functions,
|
381
|
+
aggregates,
|
382
|
+
@views)
|
259
383
|
end
|
260
384
|
|
261
385
|
# @private
|
262
386
|
def delete_aggregate(aggregate_name, aggregate_args)
|
263
387
|
aggregates = @aggregates.dup
|
264
|
-
aggregates.delete(
|
265
|
-
Keyspace.new(@name,
|
388
|
+
aggregates.delete(aggregate_name, aggregate_args)
|
389
|
+
Keyspace.new(@name,
|
390
|
+
@durable_writes,
|
391
|
+
@replication,
|
392
|
+
@tables,
|
393
|
+
@types,
|
394
|
+
@functions,
|
395
|
+
aggregates,
|
396
|
+
@views)
|
266
397
|
end
|
267
398
|
|
268
399
|
# @private
|
@@ -276,6 +407,11 @@ module Cassandra
|
|
276
407
|
@tables
|
277
408
|
end
|
278
409
|
|
410
|
+
# @private
|
411
|
+
def raw_materialized_views
|
412
|
+
@views
|
413
|
+
end
|
414
|
+
|
279
415
|
# @private
|
280
416
|
def raw_types
|
281
417
|
@types
|
data/lib/cassandra/listener.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
#--
|
4
|
-
# Copyright 2013-
|
4
|
+
# Copyright 2013-2016 DataStax, Inc.
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
# you may not use this file except in compliance with the License.
|
@@ -83,7 +83,7 @@ module Cassandra
|
|
83
83
|
|
84
84
|
# @private
|
85
85
|
def inspect
|
86
|
-
"#<#{self.class.name}:0x#{
|
86
|
+
"#<#{self.class.name}:0x#{object_id.to_s(16)}>"
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
#--
|
4
|
-
# Copyright 2013-
|
4
|
+
# Copyright 2013-2016 DataStax, Inc.
|
5
5
|
#
|
6
6
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
7
|
# you may not use this file except in compliance with the License.
|
@@ -20,6 +20,11 @@ module Cassandra
|
|
20
20
|
module LoadBalancing
|
21
21
|
module Policies
|
22
22
|
class DCAwareRoundRobin < Policy
|
23
|
+
# @private
|
24
|
+
LOCAL_CONSISTENCIES = [:local_quorum, :local_one].freeze
|
25
|
+
# @private
|
26
|
+
EMPTY_ARRAY = [].freeze
|
27
|
+
|
23
28
|
# @private
|
24
29
|
class Plan
|
25
30
|
def initialize(local, remote, index)
|
@@ -56,16 +61,25 @@ module Cassandra
|
|
56
61
|
|
57
62
|
include MonitorMixin
|
58
63
|
|
59
|
-
def initialize(datacenter = nil,
|
60
|
-
|
61
|
-
|
64
|
+
def initialize(datacenter = nil,
|
65
|
+
max_remote_hosts_to_use = 0,
|
66
|
+
use_remote_hosts_for_local_consistency = false)
|
67
|
+
datacenter &&= String(datacenter)
|
68
|
+
max_remote_hosts_to_use &&= Integer(max_remote_hosts_to_use)
|
62
69
|
|
63
|
-
unless datacenter.nil?
|
64
|
-
Util.assert_not_empty(datacenter) { "datacenter cannot be empty" }
|
65
|
-
end
|
70
|
+
Util.assert_not_empty(datacenter) { 'datacenter cannot be empty' } unless datacenter.nil?
|
66
71
|
|
67
72
|
unless max_remote_hosts_to_use.nil?
|
68
|
-
Util.assert(max_remote_hosts_to_use >= 0)
|
73
|
+
Util.assert(max_remote_hosts_to_use >= 0) do
|
74
|
+
'max_remote_hosts_to_use must be nil or >= 0'
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
# If use_remote* is true, max_remote* must be > 0
|
79
|
+
if use_remote_hosts_for_local_consistency
|
80
|
+
Util.assert(max_remote_hosts_to_use.nil? || max_remote_hosts_to_use > 0,
|
81
|
+
'max_remote_hosts_to_use must be nil (meaning unlimited) or > 0 when ' \
|
82
|
+
'use_remote_hosts_for_local_consistency is true')
|
69
83
|
end
|
70
84
|
|
71
85
|
@datacenter = datacenter
|
@@ -80,16 +94,12 @@ module Cassandra
|
|
80
94
|
end
|
81
95
|
|
82
96
|
def host_up(host)
|
83
|
-
if !@datacenter && host.datacenter
|
84
|
-
@datacenter = host.datacenter
|
85
|
-
end
|
97
|
+
@datacenter = host.datacenter if !@datacenter && host.datacenter
|
86
98
|
|
87
99
|
if host.datacenter.nil? || host.datacenter == @datacenter
|
88
100
|
synchronize { @local = @local.dup.push(host) }
|
89
|
-
|
90
|
-
|
91
|
-
synchronize { @remote = @remote.dup.push(host) }
|
92
|
-
end
|
101
|
+
elsif @max_remote.nil? || @remote.size < @max_remote
|
102
|
+
synchronize { @remote = @remote.dup.push(host) }
|
93
103
|
end
|
94
104
|
|
95
105
|
self
|
@@ -130,11 +140,11 @@ module Cassandra
|
|
130
140
|
def plan(keyspace, statement, options)
|
131
141
|
local = @local
|
132
142
|
|
133
|
-
if LOCAL_CONSISTENCIES.include?(options.consistency) && !@use_remote
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
143
|
+
remote = if LOCAL_CONSISTENCIES.include?(options.consistency) && !@use_remote
|
144
|
+
EMPTY_ARRAY
|
145
|
+
else
|
146
|
+
@remote
|
147
|
+
end
|
138
148
|
|
139
149
|
total = local.size + remote.size
|
140
150
|
|
@@ -146,12 +156,16 @@ module Cassandra
|
|
146
156
|
Plan.new(local, remote, position)
|
147
157
|
end
|
148
158
|
|
149
|
-
private
|
150
|
-
|
151
159
|
# @private
|
152
|
-
|
153
|
-
|
154
|
-
|
160
|
+
def inspect
|
161
|
+
"#<#{self.class.name}:0x#{object_id.to_s(16)} " \
|
162
|
+
"datacenter=#{@datacenter.inspect}, " \
|
163
|
+
"use_remote=#{@use_remote.inspect}, " \
|
164
|
+
"max_remote=#{@max_remote.inspect}, " \
|
165
|
+
"local=#{@local.inspect}, " \
|
166
|
+
"remote=#{@remote.inspect}, " \
|
167
|
+
"position=#{@position.inspect}>"
|
168
|
+
end
|
155
169
|
end
|
156
170
|
end
|
157
171
|
end
|