cassandra-driver 3.2.0-java → 3.2.5-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 +30 -30
- data/lib/cassandra.rb +3 -2
- 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 +1 -1
- data/lib/cassandra/argument.rb +1 -1
- data/lib/cassandra/attr_boolean.rb +1 -1
- data/lib/cassandra/auth.rb +1 -1
- data/lib/cassandra/auth/providers.rb +1 -1
- data/lib/cassandra/auth/providers/password.rb +1 -1
- data/lib/cassandra/cassandra_logger.rb +1 -1
- data/lib/cassandra/cluster.rb +1 -1
- data/lib/cassandra/cluster/client.rb +1 -1
- data/lib/cassandra/cluster/connection_pool.rb +1 -1
- data/lib/cassandra/cluster/connector.rb +1 -1
- data/lib/cassandra/cluster/control_connection.rb +1 -1
- data/lib/cassandra/cluster/failed_connection.rb +1 -1
- data/lib/cassandra/cluster/metadata.rb +1 -1
- data/lib/cassandra/cluster/options.rb +1 -1
- data/lib/cassandra/cluster/registry.rb +5 -5
- data/lib/cassandra/cluster/schema.rb +1 -1
- data/lib/cassandra/cluster/schema/cql_type_parser.rb +4 -3
- data/lib/cassandra/cluster/schema/fetchers.rb +2 -2
- data/lib/cassandra/cluster/schema/fqcn_type_parser.rb +4 -5
- data/lib/cassandra/cluster/schema/partitioners.rb +1 -1
- data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +1 -1
- 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 +1 -1
- 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 +1 -1
- data/lib/cassandra/column_container.rb +2 -2
- data/lib/cassandra/compression.rb +1 -1
- data/lib/cassandra/compression/compressors/lz4.rb +1 -1
- data/lib/cassandra/compression/compressors/snappy.rb +1 -1
- data/lib/cassandra/custom_data.rb +1 -1
- data/lib/cassandra/driver.rb +1 -1
- data/lib/cassandra/duration.rb +100 -0
- data/lib/cassandra/errors.rb +1 -1
- data/lib/cassandra/execution/info.rb +1 -1
- data/lib/cassandra/execution/options.rb +1 -1
- data/lib/cassandra/execution/profile.rb +5 -2
- data/lib/cassandra/execution/profile_manager.rb +1 -1
- data/lib/cassandra/execution/trace.rb +1 -1
- data/lib/cassandra/executors.rb +1 -1
- data/lib/cassandra/function.rb +1 -1
- data/lib/cassandra/function_collection.rb +1 -1
- data/lib/cassandra/future.rb +9 -3
- data/lib/cassandra/host.rb +1 -1
- data/lib/cassandra/index.rb +1 -1
- data/lib/cassandra/keyspace.rb +1 -1
- data/lib/cassandra/listener.rb +1 -1
- data/lib/cassandra/load_balancing.rb +1 -1
- data/lib/cassandra/load_balancing/policies.rb +1 -1
- data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +1 -1
- data/lib/cassandra/load_balancing/policies/round_robin.rb +1 -1
- data/lib/cassandra/load_balancing/policies/token_aware.rb +1 -1
- data/lib/cassandra/load_balancing/policies/white_list.rb +1 -1
- data/lib/cassandra/materialized_view.rb +1 -1
- data/lib/cassandra/null_logger.rb +1 -1
- data/lib/cassandra/protocol.rb +1 -1
- data/lib/cassandra/protocol/coder.rb +1 -1
- data/lib/cassandra/protocol/cql_byte_buffer.rb +63 -15
- data/lib/cassandra/protocol/cql_protocol_handler.rb +58 -10
- data/lib/cassandra/protocol/request.rb +1 -1
- data/lib/cassandra/protocol/requests/auth_response_request.rb +1 -1
- data/lib/cassandra/protocol/requests/batch_request.rb +1 -1
- data/lib/cassandra/protocol/requests/credentials_request.rb +1 -1
- data/lib/cassandra/protocol/requests/execute_request.rb +1 -1
- data/lib/cassandra/protocol/requests/options_request.rb +1 -1
- data/lib/cassandra/protocol/requests/prepare_request.rb +1 -1
- data/lib/cassandra/protocol/requests/query_request.rb +11 -3
- data/lib/cassandra/protocol/requests/register_request.rb +1 -1
- data/lib/cassandra/protocol/requests/startup_request.rb +1 -1
- data/lib/cassandra/protocol/requests/void_query_request.rb +1 -1
- data/lib/cassandra/protocol/response.rb +1 -1
- data/lib/cassandra/protocol/responses/already_exists_error_response.rb +1 -1
- data/lib/cassandra/protocol/responses/auth_challenge_response.rb +1 -1
- data/lib/cassandra/protocol/responses/auth_success_response.rb +1 -1
- data/lib/cassandra/protocol/responses/authenticate_response.rb +1 -1
- data/lib/cassandra/protocol/responses/error_response.rb +1 -1
- data/lib/cassandra/protocol/responses/event_response.rb +1 -1
- data/lib/cassandra/protocol/responses/function_failure_error_response.rb +1 -1
- data/lib/cassandra/protocol/responses/prepared_result_response.rb +1 -1
- data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +1 -1
- data/lib/cassandra/protocol/responses/read_failure_error_response.rb +1 -1
- data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +1 -1
- data/lib/cassandra/protocol/responses/ready_response.rb +1 -1
- data/lib/cassandra/protocol/responses/result_response.rb +1 -1
- data/lib/cassandra/protocol/responses/rows_result_response.rb +1 -1
- data/lib/cassandra/protocol/responses/schema_change_event_response.rb +1 -1
- data/lib/cassandra/protocol/responses/schema_change_result_response.rb +1 -1
- data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +1 -1
- data/lib/cassandra/protocol/responses/status_change_event_response.rb +1 -1
- data/lib/cassandra/protocol/responses/supported_response.rb +1 -1
- data/lib/cassandra/protocol/responses/topology_change_event_response.rb +1 -1
- data/lib/cassandra/protocol/responses/unavailable_error_response.rb +1 -1
- data/lib/cassandra/protocol/responses/unprepared_error_response.rb +1 -1
- data/lib/cassandra/protocol/responses/void_result_response.rb +1 -1
- data/lib/cassandra/protocol/responses/write_failure_error_response.rb +1 -1
- data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +1 -1
- data/lib/cassandra/protocol/v1.rb +1 -1
- data/lib/cassandra/protocol/v3.rb +1 -1
- data/lib/cassandra/protocol/v4.rb +4 -1
- data/lib/cassandra/reconnection.rb +1 -1
- data/lib/cassandra/reconnection/policies.rb +1 -1
- data/lib/cassandra/reconnection/policies/constant.rb +1 -1
- data/lib/cassandra/reconnection/policies/exponential.rb +1 -1
- data/lib/cassandra/result.rb +1 -1
- data/lib/cassandra/retry.rb +1 -1
- 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 +1 -1
- data/lib/cassandra/retry/policies/fallthrough.rb +1 -1
- data/lib/cassandra/session.rb +8 -4
- data/lib/cassandra/statement.rb +1 -1
- data/lib/cassandra/statements.rb +1 -1
- data/lib/cassandra/statements/batch.rb +1 -1
- data/lib/cassandra/statements/bound.rb +1 -1
- data/lib/cassandra/statements/prepared.rb +1 -1
- data/lib/cassandra/statements/simple.rb +1 -1
- data/lib/cassandra/statements/void.rb +1 -1
- data/lib/cassandra/table.rb +2 -2
- data/lib/cassandra/time.rb +1 -1
- data/lib/cassandra/time_uuid.rb +1 -1
- data/lib/cassandra/timestamp_generator.rb +1 -1
- data/lib/cassandra/timestamp_generator/simple.rb +1 -1
- data/lib/cassandra/timestamp_generator/ticking_on_duplicate.rb +1 -1
- data/lib/cassandra/trigger.rb +1 -1
- data/lib/cassandra/tuple.rb +1 -1
- data/lib/cassandra/types.rb +73 -2
- data/lib/cassandra/udt.rb +1 -1
- data/lib/cassandra/util.rb +21 -1
- data/lib/cassandra/uuid.rb +1 -1
- data/lib/cassandra/uuid/generator.rb +1 -1
- data/lib/cassandra/version.rb +2 -2
- data/lib/cassandra_murmur3.jar +0 -0
- data/lib/datastax/cassandra.rb +1 -1
- metadata +6 -6
data/lib/cassandra/keyspace.rb
CHANGED
data/lib/cassandra/listener.rb
CHANGED
data/lib/cassandra/protocol.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
#--
|
4
|
-
# Copyright
|
4
|
+
# Copyright 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.
|
@@ -53,24 +53,30 @@ module Cassandra
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def read_decimal(len = bytesize)
|
56
|
-
|
56
|
+
scale = read_signed_int
|
57
57
|
number_string = read_varint(len - 4).to_s
|
58
|
-
if
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
if scale <= 0
|
59
|
+
# Special case where the actual scale is positive; scale in the protocol is actually negative of
|
60
|
+
# reality.
|
61
|
+
BigDecimal(number_string + '0' * -scale)
|
62
|
+
else
|
63
|
+
if number_string.length <= scale
|
64
|
+
if number_string.start_with?(MINUS)
|
65
|
+
number_string = number_string[1, number_string.length - 1]
|
66
|
+
fraction_string = MINUS + ZERO << DECIMAL_POINT
|
67
|
+
else
|
68
|
+
fraction_string = ZERO + DECIMAL_POINT
|
69
|
+
end
|
70
|
+
(scale - number_string.length).times { fraction_string << ZERO }
|
71
|
+
fraction_string << number_string
|
62
72
|
else
|
63
|
-
fraction_string =
|
73
|
+
fraction_string = number_string[0, number_string.length - scale]
|
74
|
+
fraction_string << DECIMAL_POINT
|
75
|
+
fraction_string <<
|
76
|
+
number_string[number_string.length - scale, number_string.length]
|
64
77
|
end
|
65
|
-
(
|
66
|
-
fraction_string << number_string
|
67
|
-
else
|
68
|
-
fraction_string = number_string[0, number_string.length - size]
|
69
|
-
fraction_string << DECIMAL_POINT
|
70
|
-
fraction_string <<
|
71
|
-
number_string[number_string.length - size, number_string.length]
|
78
|
+
BigDecimal(fraction_string)
|
72
79
|
end
|
73
|
-
BigDecimal.new(fraction_string)
|
74
80
|
rescue Errors::DecodingError => e
|
75
81
|
raise Errors::DecodingError, e.message, e.backtrace
|
76
82
|
end
|
@@ -281,6 +287,29 @@ module Cassandra
|
|
281
287
|
"Not enough bytes available to decode a tinyint: #{e.message}", e.backtrace
|
282
288
|
end
|
283
289
|
|
290
|
+
def read_vint
|
291
|
+
n = read_byte
|
292
|
+
|
293
|
+
# Bits are indexed in Integer in little-endian order
|
294
|
+
bytes_to_read = 7.downto(0).take_while {|i| n[i] == 1}.size
|
295
|
+
return n unless bytes_to_read > 0
|
296
|
+
|
297
|
+
rv = n & (0xff >> bytes_to_read)
|
298
|
+
1.upto(bytes_to_read) do |idx|
|
299
|
+
new_byte = read_byte
|
300
|
+
rv <<= 8
|
301
|
+
rv |= (new_byte & 0xff)
|
302
|
+
end
|
303
|
+
|
304
|
+
rv
|
305
|
+
rescue RangeError => e
|
306
|
+
raise Errors::DecodingError, e.message, e.backtrace
|
307
|
+
end
|
308
|
+
|
309
|
+
def read_signed_vint
|
310
|
+
Util.decode_zigzag(read_vint)
|
311
|
+
end
|
312
|
+
|
284
313
|
def append_tinyint(n)
|
285
314
|
append([n].pack(Formats::CHAR_FORMAT))
|
286
315
|
end
|
@@ -403,6 +432,25 @@ module Cassandra
|
|
403
432
|
append([n].pack(Formats::FLOAT_FORMAT))
|
404
433
|
end
|
405
434
|
|
435
|
+
def append_vint(n)
|
436
|
+
send_bytes = Util.to_min_byte_array(n)
|
437
|
+
send_cnt = send_bytes.length
|
438
|
+
|
439
|
+
raise Errors::EncodingError, "Too many bytes (#{bytes_to_send.length}) to send!" if send_cnt > 8
|
440
|
+
|
441
|
+
send_cnt_byte = (0xff << (8 - send_cnt)) & 0xff
|
442
|
+
append([send_cnt_byte].pack(Formats::BYTES_FORMAT))
|
443
|
+
append(send_bytes.pack(Formats::BYTES_FORMAT))
|
444
|
+
end
|
445
|
+
|
446
|
+
def append_signed_vint32(n)
|
447
|
+
append_vint(Util.encode_zigzag32(n))
|
448
|
+
end
|
449
|
+
|
450
|
+
def append_signed_vint64(n)
|
451
|
+
append_vint(Util.encode_zigzag64(n))
|
452
|
+
end
|
453
|
+
|
406
454
|
def eql?(other)
|
407
455
|
other.eql?(to_str)
|
408
456
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
#--
|
4
|
-
# Copyright
|
4
|
+
# Copyright 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.
|
@@ -170,7 +170,7 @@ module Cassandra
|
|
170
170
|
def send_request(request, timeout = nil, with_heartbeat = true)
|
171
171
|
return Ione::Future.failed(Errors::IOError.new('Connection closed')) if closed?
|
172
172
|
schedule_heartbeat if with_heartbeat
|
173
|
-
promise = RequestPromise.new(request, timeout)
|
173
|
+
promise = RequestPromise.new(request, timeout, @scheduler)
|
174
174
|
id = nil
|
175
175
|
@lock.lock
|
176
176
|
begin
|
@@ -256,22 +256,74 @@ module Cassandra
|
|
256
256
|
|
257
257
|
attr_reader :request, :timeout
|
258
258
|
attr_boolean :timed_out
|
259
|
+
attr_accessor :timer
|
259
260
|
|
260
|
-
def initialize(request, timeout)
|
261
|
+
def initialize(request, timeout, scheduler)
|
261
262
|
@request = request
|
262
263
|
@timeout = timeout
|
263
264
|
@timed_out = false
|
265
|
+
@scheduler = scheduler
|
266
|
+
@lock = Mutex.new
|
267
|
+
@timer = nil
|
264
268
|
super()
|
265
269
|
end
|
266
270
|
|
267
271
|
def time_out!
|
268
272
|
unless future.completed?
|
269
273
|
@timed_out = true
|
270
|
-
# rubocop:disable Style/SignalException
|
271
274
|
fail(Errors::TimeoutError.new('Timed out'))
|
272
|
-
# rubocop:enable Style/SignalException
|
273
275
|
end
|
274
276
|
end
|
277
|
+
|
278
|
+
def maybe_start_timer
|
279
|
+
# This is more complicated than one would expect. First, we want to start a timer
|
280
|
+
# if a timeout is set. But there is a race condition where send_request creates
|
281
|
+
# a fresh promise and adds it to @promises, but another thread handles a socket
|
282
|
+
# closure event and fails all known promises. When a promise fails, we want to cancel
|
283
|
+
# the timer, if set. So, we synchronize access to @timer to be sure we don't set up
|
284
|
+
# and cancel the timer at the same time. However, if promise.fail runs first, there
|
285
|
+
# will be no timer to cancel, and then when maybe_start_timer gets called in the other
|
286
|
+
# thread, it'll create a timer on a promise that no one is going to action on going forward.
|
287
|
+
# So, that leads to leaking the timer until it times out. To avoid this, we want to
|
288
|
+
# check that the future of the promise isn't completed before starting the timer.
|
289
|
+
|
290
|
+
return if @timeout.nil?
|
291
|
+
return if @future.completed?
|
292
|
+
|
293
|
+
if @timer.nil?
|
294
|
+
@lock.synchronize do
|
295
|
+
if @timer.nil?
|
296
|
+
return if @future.completed?
|
297
|
+
@timer = @scheduler.schedule_timer(@timeout)
|
298
|
+
@timer.on_value { time_out! }
|
299
|
+
end
|
300
|
+
end
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
def fulfill(response)
|
305
|
+
super
|
306
|
+
maybe_cancel_timer
|
307
|
+
end
|
308
|
+
|
309
|
+
def fail(cause)
|
310
|
+
super
|
311
|
+
maybe_cancel_timer
|
312
|
+
end
|
313
|
+
|
314
|
+
def maybe_cancel_timer
|
315
|
+
return if @timeout.nil?
|
316
|
+
timer = nil
|
317
|
+
if @timer
|
318
|
+
@lock.synchronize do
|
319
|
+
if @timer
|
320
|
+
timer = @timer
|
321
|
+
@timer = nil
|
322
|
+
end
|
323
|
+
end
|
324
|
+
end
|
325
|
+
@scheduler.cancel_timer(timer) if timer
|
326
|
+
end
|
275
327
|
end
|
276
328
|
|
277
329
|
def receive_data(data)
|
@@ -312,11 +364,7 @@ module Cassandra
|
|
312
364
|
@connection.write do |buffer|
|
313
365
|
@frame_encoder.encode(buffer, request_promise.request, id)
|
314
366
|
end
|
315
|
-
|
316
|
-
@scheduler.schedule_timer(request_promise.timeout).on_value do
|
317
|
-
request_promise.time_out!
|
318
|
-
end
|
319
|
-
end
|
367
|
+
request_promise.maybe_start_timer
|
320
368
|
end
|
321
369
|
|
322
370
|
def socket_closed(cause)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
|
3
3
|
#--
|
4
|
-
# Copyright
|
4
|
+
# Copyright 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.
|
@@ -51,6 +51,14 @@ module Cassandra
|
|
51
51
|
!!@payload
|
52
52
|
end
|
53
53
|
|
54
|
+
def append_flags(buffer,flags,protocol_version)
|
55
|
+
if protocol_version < 5
|
56
|
+
buffer.append(flags.chr)
|
57
|
+
else
|
58
|
+
buffer.append_int(flags)
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
54
62
|
def write(buffer, protocol_version, encoder)
|
55
63
|
buffer.append_long_string(@cql)
|
56
64
|
buffer.append_consistency(@consistency)
|
@@ -63,10 +71,10 @@ module Cassandra
|
|
63
71
|
if @values && !@values.empty?
|
64
72
|
flags |= 0x01
|
65
73
|
flags |= 0x40 if protocol_version > 2 && !@names.empty?
|
66
|
-
buffer
|
74
|
+
append_flags(buffer, flags, protocol_version)
|
67
75
|
encoder.write_parameters(buffer, @values, @type_hints, @names)
|
68
76
|
else
|
69
|
-
buffer
|
77
|
+
append_flags(buffer, flags, protocol_version)
|
70
78
|
end
|
71
79
|
buffer.append_int(@page_size) if @page_size
|
72
80
|
buffer.append_bytes(@paging_state) if @paging_state
|