cassandra-driver 3.0.0.beta.1 → 3.0.0.rc.1

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.
Files changed (131) hide show
  1. checksums.yaml +8 -8
  2. data/README.md +90 -38
  3. data/ext/cassandra_murmur3/cassandra_murmur3.c +1 -1
  4. data/lib/cassandra.rb +327 -130
  5. data/lib/cassandra/address_resolution.rb +1 -1
  6. data/lib/cassandra/address_resolution/policies/ec2_multi_region.rb +1 -1
  7. data/lib/cassandra/address_resolution/policies/none.rb +1 -1
  8. data/lib/cassandra/aggregate.rb +21 -7
  9. data/lib/cassandra/argument.rb +2 -2
  10. data/lib/cassandra/auth.rb +4 -4
  11. data/lib/cassandra/auth/providers.rb +1 -1
  12. data/lib/cassandra/auth/providers/password.rb +9 -5
  13. data/lib/cassandra/cassandra_logger.rb +80 -0
  14. data/lib/cassandra/cluster.rb +38 -9
  15. data/lib/cassandra/cluster/client.rb +801 -205
  16. data/lib/cassandra/cluster/connection_pool.rb +2 -2
  17. data/lib/cassandra/cluster/connector.rb +74 -25
  18. data/lib/cassandra/cluster/control_connection.rb +217 -82
  19. data/lib/cassandra/cluster/failed_connection.rb +1 -1
  20. data/lib/cassandra/cluster/metadata.rb +12 -4
  21. data/lib/cassandra/cluster/options.rb +60 -11
  22. data/lib/cassandra/cluster/registry.rb +69 -16
  23. data/lib/cassandra/cluster/schema.rb +25 -7
  24. data/lib/cassandra/cluster/schema/cql_type_parser.rb +15 -10
  25. data/lib/cassandra/cluster/schema/fetchers.rb +263 -106
  26. data/lib/cassandra/cluster/schema/fqcn_type_parser.rb +41 -36
  27. data/lib/cassandra/cluster/schema/partitioners.rb +1 -1
  28. data/lib/cassandra/cluster/schema/partitioners/murmur3.rb +3 -3
  29. data/lib/cassandra/cluster/schema/partitioners/ordered.rb +1 -1
  30. data/lib/cassandra/cluster/schema/partitioners/random.rb +1 -1
  31. data/lib/cassandra/cluster/schema/replication_strategies.rb +1 -1
  32. data/lib/cassandra/cluster/schema/replication_strategies/network_topology.rb +19 -18
  33. data/lib/cassandra/cluster/schema/replication_strategies/none.rb +1 -1
  34. data/lib/cassandra/cluster/schema/replication_strategies/simple.rb +1 -1
  35. data/lib/cassandra/column.rb +3 -3
  36. data/lib/cassandra/compression.rb +1 -1
  37. data/lib/cassandra/compression/compressors/lz4.rb +4 -3
  38. data/lib/cassandra/compression/compressors/snappy.rb +4 -3
  39. data/lib/cassandra/driver.rb +103 -41
  40. data/lib/cassandra/errors.rb +265 -30
  41. data/lib/cassandra/execution/info.rb +16 -5
  42. data/lib/cassandra/execution/options.rb +99 -54
  43. data/lib/cassandra/execution/trace.rb +16 -9
  44. data/lib/cassandra/executors.rb +1 -1
  45. data/lib/cassandra/function.rb +19 -13
  46. data/lib/cassandra/function_collection.rb +85 -0
  47. data/lib/cassandra/future.rb +106 -48
  48. data/lib/cassandra/host.rb +10 -4
  49. data/lib/cassandra/keyspace.rb +90 -33
  50. data/lib/cassandra/listener.rb +1 -1
  51. data/lib/cassandra/load_balancing.rb +2 -2
  52. data/lib/cassandra/load_balancing/policies.rb +1 -1
  53. data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +18 -18
  54. data/lib/cassandra/load_balancing/policies/round_robin.rb +1 -1
  55. data/lib/cassandra/load_balancing/policies/token_aware.rb +15 -13
  56. data/lib/cassandra/load_balancing/policies/white_list.rb +11 -5
  57. data/lib/cassandra/null_logger.rb +27 -6
  58. data/lib/cassandra/protocol.rb +1 -1
  59. data/lib/cassandra/protocol/coder.rb +78 -39
  60. data/lib/cassandra/protocol/cql_byte_buffer.rb +50 -33
  61. data/lib/cassandra/protocol/cql_protocol_handler.rb +44 -45
  62. data/lib/cassandra/protocol/request.rb +2 -2
  63. data/lib/cassandra/protocol/requests/auth_response_request.rb +3 -3
  64. data/lib/cassandra/protocol/requests/batch_request.rb +16 -7
  65. data/lib/cassandra/protocol/requests/credentials_request.rb +3 -3
  66. data/lib/cassandra/protocol/requests/execute_request.rb +41 -20
  67. data/lib/cassandra/protocol/requests/options_request.rb +1 -1
  68. data/lib/cassandra/protocol/requests/prepare_request.rb +5 -5
  69. data/lib/cassandra/protocol/requests/query_request.rb +27 -22
  70. data/lib/cassandra/protocol/requests/register_request.rb +2 -2
  71. data/lib/cassandra/protocol/requests/startup_request.rb +6 -4
  72. data/lib/cassandra/protocol/requests/void_query_request.rb +1 -1
  73. data/lib/cassandra/protocol/response.rb +2 -2
  74. data/lib/cassandra/protocol/responses/already_exists_error_response.rb +12 -2
  75. data/lib/cassandra/protocol/responses/auth_challenge_response.rb +1 -1
  76. data/lib/cassandra/protocol/responses/auth_success_response.rb +1 -1
  77. data/lib/cassandra/protocol/responses/authenticate_response.rb +1 -1
  78. data/lib/cassandra/protocol/responses/error_response.rb +101 -13
  79. data/lib/cassandra/protocol/responses/event_response.rb +1 -1
  80. data/lib/cassandra/protocol/responses/function_failure_error_response.rb +13 -2
  81. data/lib/cassandra/protocol/responses/prepared_result_response.rb +11 -5
  82. data/lib/cassandra/protocol/responses/raw_rows_result_response.rb +14 -9
  83. data/lib/cassandra/protocol/responses/read_failure_error_response.rb +26 -4
  84. data/lib/cassandra/protocol/responses/read_timeout_error_response.rb +22 -3
  85. data/lib/cassandra/protocol/responses/ready_response.rb +3 -3
  86. data/lib/cassandra/protocol/responses/result_response.rb +4 -2
  87. data/lib/cassandra/protocol/responses/rows_result_response.rb +5 -3
  88. data/lib/cassandra/protocol/responses/schema_change_event_response.rb +5 -4
  89. data/lib/cassandra/protocol/responses/schema_change_result_response.rb +16 -9
  90. data/lib/cassandra/protocol/responses/set_keyspace_result_response.rb +2 -2
  91. data/lib/cassandra/protocol/responses/status_change_event_response.rb +2 -2
  92. data/lib/cassandra/protocol/responses/supported_response.rb +1 -1
  93. data/lib/cassandra/protocol/responses/topology_change_event_response.rb +1 -1
  94. data/lib/cassandra/protocol/responses/unavailable_error_response.rb +20 -3
  95. data/lib/cassandra/protocol/responses/unprepared_error_response.rb +11 -2
  96. data/lib/cassandra/protocol/responses/void_result_response.rb +1 -1
  97. data/lib/cassandra/protocol/responses/write_failure_error_response.rb +26 -4
  98. data/lib/cassandra/protocol/responses/write_timeout_error_response.rb +22 -3
  99. data/lib/cassandra/protocol/v1.rb +101 -36
  100. data/lib/cassandra/protocol/v3.rb +124 -51
  101. data/lib/cassandra/protocol/v4.rb +172 -68
  102. data/lib/cassandra/reconnection.rb +1 -1
  103. data/lib/cassandra/reconnection/policies.rb +1 -1
  104. data/lib/cassandra/reconnection/policies/constant.rb +2 -4
  105. data/lib/cassandra/reconnection/policies/exponential.rb +6 -6
  106. data/lib/cassandra/result.rb +53 -19
  107. data/lib/cassandra/retry.rb +8 -8
  108. data/lib/cassandra/retry/policies.rb +1 -1
  109. data/lib/cassandra/retry/policies/default.rb +1 -1
  110. data/lib/cassandra/retry/policies/downgrading_consistency.rb +7 -3
  111. data/lib/cassandra/retry/policies/fallthrough.rb +1 -1
  112. data/lib/cassandra/session.rb +22 -16
  113. data/lib/cassandra/statement.rb +1 -1
  114. data/lib/cassandra/statements.rb +1 -1
  115. data/lib/cassandra/statements/batch.rb +16 -10
  116. data/lib/cassandra/statements/bound.rb +10 -3
  117. data/lib/cassandra/statements/prepared.rb +59 -15
  118. data/lib/cassandra/statements/simple.rb +23 -10
  119. data/lib/cassandra/statements/void.rb +1 -1
  120. data/lib/cassandra/table.rb +79 -30
  121. data/lib/cassandra/time.rb +11 -6
  122. data/lib/cassandra/time_uuid.rb +7 -7
  123. data/lib/cassandra/tuple.rb +16 -8
  124. data/lib/cassandra/types.rb +20 -9
  125. data/lib/cassandra/udt.rb +32 -36
  126. data/lib/cassandra/util.rb +20 -13
  127. data/lib/cassandra/uuid.rb +22 -15
  128. data/lib/cassandra/uuid/generator.rb +7 -5
  129. data/lib/cassandra/version.rb +2 -2
  130. data/lib/datastax/cassandra.rb +1 -1
  131. metadata +5 -3
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
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,7 +20,7 @@ module Cassandra
20
20
  module Protocol
21
21
  class CqlByteBuffer < Ione::ByteBuffer
22
22
  def inspect
23
- "#<#{self.class.name}:0x#{self.object_id.to_s(16)} #{to_str.inspect}>"
23
+ "#<#{self.class.name}:0x#{object_id.to_s(16)} #{to_str.inspect}>"
24
24
  end
25
25
 
26
26
  def read_unsigned_byte
@@ -28,22 +28,20 @@ module Cassandra
28
28
  rescue RangeError => e
29
29
  raise Errors::DecodingError, e.message, e.backtrace
30
30
  end
31
-
32
- def read_varint(len=bytesize, signed=true)
31
+
32
+ def read_varint(len = bytesize, signed = true)
33
33
  bytes = read(len)
34
34
  n = 0
35
35
  bytes.each_byte do |b|
36
36
  n = (n << 8) | b
37
37
  end
38
- if signed && bytes.getbyte(0) & 0x80 == 0x80
39
- n -= 2**(bytes.length * 8)
40
- end
38
+ n -= 2**(bytes.length * 8) if signed && bytes.getbyte(0) & 0x80 == 0x80
41
39
  n
42
40
  rescue RangeError => e
43
41
  raise Errors::DecodingError, e.message, e.backtrace
44
42
  end
45
43
 
46
- def read_decimal(len=bytesize)
44
+ def read_decimal(len = bytesize)
47
45
  size = read_signed_int
48
46
  number_string = read_varint(len - 4).to_s
49
47
  if number_string.length <= size
@@ -58,7 +56,8 @@ module Cassandra
58
56
  else
59
57
  fraction_string = number_string[0, number_string.length - size]
60
58
  fraction_string << DECIMAL_POINT
61
- fraction_string << number_string[number_string.length - size, number_string.length]
59
+ fraction_string <<
60
+ number_string[number_string.length - size, number_string.length]
62
61
  end
63
62
  BigDecimal.new(fraction_string)
64
63
  rescue Errors::DecodingError => e
@@ -78,13 +77,15 @@ module Cassandra
78
77
  def read_double
79
78
  read(8).unpack(Formats::DOUBLE_FORMAT).first
80
79
  rescue RangeError => e
81
- raise Errors::DecodingError, "Not enough bytes available to decode a double: #{e.message}", e.backtrace
80
+ raise Errors::DecodingError,
81
+ "Not enough bytes available to decode a double: #{e.message}", e.backtrace
82
82
  end
83
83
 
84
84
  def read_float
85
85
  read(4).unpack(Formats::FLOAT_FORMAT).first
86
86
  rescue RangeError => e
87
- raise Errors::DecodingError, "Not enough bytes available to decode a float: #{e.message}", e.backtrace
87
+ raise Errors::DecodingError,
88
+ "Not enough bytes available to decode a float: #{e.message}", e.backtrace
88
89
  end
89
90
 
90
91
  def read_signed_int
@@ -92,13 +93,15 @@ module Cassandra
92
93
  return n if n <= 0x7fffffff
93
94
  n - 0xffffffff - 1
94
95
  rescue RangeError => e
95
- raise Errors::DecodingError, "Not enough bytes available to decode an int: #{e.message}", e.backtrace
96
+ raise Errors::DecodingError,
97
+ "Not enough bytes available to decode an int: #{e.message}", e.backtrace
96
98
  end
97
-
99
+
98
100
  def read_unsigned_short
99
101
  read_short
100
102
  rescue RangeError => e
101
- raise Errors::DecodingError, "Not enough bytes available to decode a short: #{e.message}", e.backtrace
103
+ raise Errors::DecodingError,
104
+ "Not enough bytes available to decode a short: #{e.message}", e.backtrace
102
105
  end
103
106
 
104
107
  def read_string
@@ -107,7 +110,8 @@ module Cassandra
107
110
  string.force_encoding(::Encoding::UTF_8)
108
111
  string
109
112
  rescue RangeError => e
110
- raise Errors::DecodingError, "Not enough bytes available to decode a string: #{e.message}", e.backtrace
113
+ raise Errors::DecodingError,
114
+ "Not enough bytes available to decode a string: #{e.message}", e.backtrace
111
115
  end
112
116
 
113
117
  def read_long_string
@@ -116,13 +120,16 @@ module Cassandra
116
120
  string.force_encoding(::Encoding::UTF_8)
117
121
  string
118
122
  rescue RangeError => e
119
- raise Errors::DecodingError, "Not enough bytes available to decode a long string: #{e.message}", e.backtrace
123
+ raise Errors::DecodingError,
124
+ "Not enough bytes available to decode a long string: #{e.message}",
125
+ e.backtrace
120
126
  end
121
127
 
122
- def read_uuid(impl=Uuid)
128
+ def read_uuid(impl = Uuid)
123
129
  impl.new(read_varint(16, false))
124
130
  rescue Errors::DecodingError => e
125
- raise Errors::DecodingError, "Not enough bytes available to decode a UUID: #{e.message}", e.backtrace
131
+ raise Errors::DecodingError,
132
+ "Not enough bytes available to decode a UUID: #{e.message}", e.backtrace
126
133
  end
127
134
 
128
135
  def read_string_list
@@ -135,21 +142,22 @@ module Cassandra
135
142
  return nil if size & 0x80000000 == 0x80000000
136
143
  read(size)
137
144
  rescue RangeError => e
138
- raise Errors::DecodingError, "Not enough bytes available to decode a bytes: #{e.message}", e.backtrace
145
+ raise Errors::DecodingError,
146
+ "Not enough bytes available to decode a bytes: #{e.message}", e.backtrace
139
147
  end
140
148
 
141
149
  def read_short_bytes
142
150
  read(read_unsigned_short)
143
151
  rescue RangeError => e
144
- raise Errors::DecodingError, "Not enough bytes available to decode a short bytes: #{e.message}", e.backtrace
152
+ raise Errors::DecodingError,
153
+ "Not enough bytes available to decode a short bytes: #{e.message}",
154
+ e.backtrace
145
155
  end
146
156
 
147
157
  def read_option
148
158
  id = read_unsigned_short
149
159
  value = nil
150
- if block_given?
151
- value = yield id, self
152
- end
160
+ value = yield id, self if block_given?
153
161
  [id, value]
154
162
  end
155
163
 
@@ -159,12 +167,16 @@ module Cassandra
159
167
  port = read_int
160
168
  [ip_addr, port]
161
169
  rescue RangeError => e
162
- raise Errors::DecodingError, "Not enough bytes available to decode an INET: #{e.message}", e.backtrace
170
+ raise Errors::DecodingError,
171
+ "Not enough bytes available to decode an INET: #{e.message}",
172
+ e.backtrace
163
173
  end
164
174
 
165
175
  def read_consistency
166
176
  index = read_unsigned_short
167
- raise Errors::DecodingError, "Unknown consistency index #{index}" if index >= CONSISTENCIES.size || CONSISTENCIES[index].nil?
177
+ if index >= CONSISTENCIES.size || CONSISTENCIES[index].nil?
178
+ raise Errors::DecodingError, "Unknown consistency index #{index}"
179
+ end
168
180
  CONSISTENCIES[index]
169
181
  end
170
182
 
@@ -203,7 +215,8 @@ module Cassandra
203
215
  return n if n <= 0x7fff
204
216
  n - 0xffff - 1
205
217
  rescue RangeError => e
206
- raise Errors::DecodingError, "Not enough bytes available to decode a smallint: #{e.message}", e.backtrace
218
+ raise Errors::DecodingError,
219
+ "Not enough bytes available to decode a smallint: #{e.message}", e.backtrace
207
220
  end
208
221
 
209
222
  def read_tinyint
@@ -211,7 +224,8 @@ module Cassandra
211
224
  return n if n <= 0x7f
212
225
  n - 0xff - 1
213
226
  rescue RangeError => e
214
- raise Errors::DecodingError, "Not enough bytes available to decode a tinyint: #{e.message}", e.backtrace
227
+ raise Errors::DecodingError,
228
+ "Not enough bytes available to decode a tinyint: #{e.message}", e.backtrace
215
229
  end
216
230
 
217
231
  def append_tinyint(n)
@@ -246,7 +260,7 @@ module Cassandra
246
260
  append_int((v >> 96) & 0xffffffff)
247
261
  append_int((v >> 64) & 0xffffffff)
248
262
  append_int((v >> 32) & 0xffffffff)
249
- append_int((v >> 0) & 0xffffffff)
263
+ append_int((v >> 0) & 0xffffffff)
250
264
  end
251
265
 
252
266
  def append_string_list(strs)
@@ -277,7 +291,9 @@ module Cassandra
277
291
 
278
292
  def append_consistency(consistency)
279
293
  index = CONSISTENCIES.index(consistency)
280
- raise Errors::EncodingError, %(Unknown consistency "#{consistency}") if index.nil? || CONSISTENCIES[index].nil?
294
+ if index.nil? || CONSISTENCIES[index].nil?
295
+ raise Errors::EncodingError, %(Unknown consistency "#{consistency}")
296
+ end
281
297
  append_short(index)
282
298
  end
283
299
 
@@ -313,10 +329,11 @@ module Cassandra
313
329
  def append_varint(n)
314
330
  num = n
315
331
  bytes = []
316
- begin
332
+ loop do
317
333
  bytes << (num & 0xff)
318
334
  num >>= 8
319
- end until (num == 0 || num == -1) && (bytes.last[7] == num[7])
335
+ break if (num == 0 || num == -1) && (bytes.last[7] == num[7])
336
+ end
320
337
  append(bytes.reverse.pack(Formats::BYTES_FORMAT))
321
338
  end
322
339
 
@@ -342,7 +359,7 @@ module Cassandra
342
359
  def eql?(other)
343
360
  other.eql?(to_str)
344
361
  end
345
- alias_method :==, :eql?
362
+ alias == eql?
346
363
 
347
364
  private
348
365
 
@@ -353,4 +370,4 @@ module Cassandra
353
370
  NO_CHAR = ''.freeze
354
371
  end
355
372
  end
356
- end
373
+ end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
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.
@@ -34,20 +34,22 @@ module Cassandra
34
34
  # @return [String] the current keyspace for the underlying connection
35
35
  attr_reader :keyspace, :error
36
36
 
37
- def initialize(connection, scheduler, protocol_version, compressor=nil, heartbeat_interval = 30, idle_timeout = 60)
37
+ def initialize(connection,
38
+ scheduler,
39
+ protocol_version,
40
+ compressor = nil,
41
+ heartbeat_interval = 30,
42
+ idle_timeout = 60,
43
+ requests_per_connection = 128)
38
44
  @connection = connection
39
45
  @scheduler = scheduler
40
46
  @compressor = compressor
41
47
  @connection.on_data(&method(:receive_data))
42
48
  @connection.on_closed(&method(:socket_closed))
43
49
 
44
- if protocol_version > 2
45
- @streams = Array.new(1024) {|i| i}
46
- else
47
- @streams = Array.new(128) {|i| i}
48
- end
50
+ @streams = Array.new(requests_per_connection) {|i| i}
49
51
 
50
- @promises = Hash.new
52
+ @promises = {}
51
53
 
52
54
  if protocol_version > 3
53
55
  @frame_encoder = V4::Encoder.new(@compressor, protocol_version)
@@ -147,20 +149,20 @@ module Cassandra
147
149
  # closes the futures of all active requests will be failed with the error
148
150
  # that caused the connection to close, or nil.
149
151
  #
150
- # When `timeout` is specified the future will fail with {Cassandra::Errors::TimeoutError}
151
- # after that many seconds have passed. If a response arrives after that
152
- # time it will be lost. If a response never arrives for the request the
153
- # channel occupied by the request will _not_ be reused.
152
+ # When `timeout` is specified the future will fail with
153
+ # {Cassandra::Errors::TimeoutError} after that many seconds have passed. If a
154
+ # response arrives after that time it will be lost. If a response never arrives
155
+ # for the request the channel occupied by the request will _not_ be reused.
154
156
  #
155
157
  # @param [Cassandra::Protocol::Request] request
156
158
  # @param [Float] timeout an optional number of seconds to wait until
157
159
  # failing the request
158
160
  # @return [Ione::Future<Cassandra::Protocol::Response>] a future that resolves to
159
161
  # the response
160
- def send_request(request, timeout=nil, with_heartbeat = true)
162
+ def send_request(request, timeout = nil, with_heartbeat = true)
161
163
  return Ione::Future.failed(Errors::IOError.new('Connection closed')) if closed?
162
164
  schedule_heartbeat if with_heartbeat
163
- promise = RequestPromise.new(request)
165
+ promise = RequestPromise.new(request, timeout)
164
166
  id = nil
165
167
  @lock.lock
166
168
  begin
@@ -171,9 +173,7 @@ module Cassandra
171
173
  @lock.unlock
172
174
  end
173
175
  if id
174
- @connection.write do |buffer|
175
- @frame_encoder.encode(buffer, request, id)
176
- end
176
+ write_request(id, promise)
177
177
  else
178
178
  @lock.lock
179
179
  begin
@@ -182,11 +182,6 @@ module Cassandra
182
182
  @lock.unlock
183
183
  end
184
184
  end
185
- if timeout
186
- @scheduler.schedule_timer(timeout).on_value do
187
- promise.time_out!
188
- end
189
- end
190
185
  promise.future
191
186
  end
192
187
 
@@ -237,23 +232,25 @@ module Cassandra
237
232
  if response.is_a?(Protocol::SetKeyspaceResultResponse)
238
233
  @keyspace = response.keyspace
239
234
  end
240
- if response.is_a?(Protocol::SchemaChangeResultResponse) && response.change == 'DROPPED' && response.keyspace == @keyspace && response.target == Protocol::Constants::SCHEMA_CHANGE_TARGET_KEYSPACE
235
+ if response.is_a?(Protocol::SchemaChangeResultResponse) &&
236
+ response.change == 'DROPPED' &&
237
+ response.keyspace == @keyspace &&
238
+ response.target == Protocol::Constants::SCHEMA_CHANGE_TARGET_KEYSPACE
241
239
  @keyspace = nil
242
240
  end
243
241
  flush_request_queue
244
- unless promise.timed_out?
245
- promise.fulfill(response)
246
- end
242
+ promise.fulfill(response) unless promise.timed_out?
247
243
  end
248
244
 
249
245
  private
250
246
 
251
247
  # @private
252
248
  class RequestPromise < Ione::Promise
253
- attr_reader :request
249
+ attr_reader :request, :timeout
254
250
 
255
- def initialize(request)
251
+ def initialize(request, timeout)
256
252
  @request = request
253
+ @timeout = timeout
257
254
  @timed_out = false
258
255
  super()
259
256
  end
@@ -265,7 +262,9 @@ module Cassandra
265
262
  def time_out!
266
263
  unless future.completed?
267
264
  @timed_out = true
265
+ # rubocop:disable Style/SignalException
268
266
  fail(Errors::TimeoutError.new('Timed out'))
267
+ # rubocop:enable Style/SignalException
269
268
  end
270
269
  end
271
270
  end
@@ -285,28 +284,32 @@ module Cassandra
285
284
  ensure
286
285
  @lock.unlock
287
286
  end
288
- while true
287
+ loop do
289
288
  id = nil
290
289
  promise = nil
291
290
  @lock.lock
292
291
  begin
293
292
  if @request_queue_out.any? && (id = next_stream_id)
294
293
  promise = @request_queue_out.shift
295
- if promise.timed_out?
296
- next
297
- else
298
- @promises[id] = promise
299
- end
294
+ next if promise.timed_out?
295
+ @promises[id] = promise
300
296
  end
301
297
  ensure
302
298
  @lock.unlock
303
299
  end
304
- if id
305
- @connection.write do |buffer|
306
- @frame_encoder.encode(buffer, promise.request, id)
307
- end
308
- else
309
- break
300
+
301
+ break unless id
302
+ write_request(id, promise)
303
+ end
304
+ end
305
+
306
+ def write_request(id, request_promise)
307
+ @connection.write do |buffer|
308
+ @frame_encoder.encode(buffer, request_promise.request, id)
309
+ end
310
+ if request_promise.timeout
311
+ @scheduler.schedule_timer(request_promise.timeout).on_value do
312
+ request_promise.time_out!
310
313
  end
311
314
  end
312
315
  end
@@ -382,11 +385,7 @@ module Cassandra
382
385
  end
383
386
 
384
387
  def next_stream_id
385
- if (stream_id = @streams.shift)
386
- stream_id
387
- else
388
- nil
389
- end
388
+ @streams.shift
390
389
  end
391
390
 
392
391
  HEARTBEAT = OptionsRequest.new
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
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.
@@ -21,7 +21,7 @@ module Cassandra
21
21
  class Request
22
22
  attr_reader :opcode, :trace
23
23
 
24
- def initialize(opcode, trace=false)
24
+ def initialize(opcode, trace = false)
25
25
  @opcode = opcode
26
26
  @trace = trace
27
27
  end
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  #--
4
- # Copyright 2013-2015 DataStax, Inc.
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.
@@ -35,9 +35,9 @@ module Cassandra
35
35
  end
36
36
 
37
37
  def eql?(other)
38
- self.token == other.token
38
+ token == other.token
39
39
  end
40
- alias_method :==, :eql?
40
+ alias == eql?
41
41
 
42
42
  def hash
43
43
  @h ||= begin