cassandra-driver 3.0.3-java → 3.1.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 +46 -31
- data/lib/cassandra.rb +35 -44
- data/lib/cassandra/cluster.rb +40 -11
- data/lib/cassandra/cluster/client.rb +193 -159
- data/lib/cassandra/cluster/connector.rb +12 -10
- data/lib/cassandra/cluster/control_connection.rb +38 -10
- data/lib/cassandra/cluster/options.rb +8 -4
- data/lib/cassandra/cluster/registry.rb +1 -2
- data/lib/cassandra/cluster/schema/fetchers.rb +122 -26
- data/lib/cassandra/column_container.rb +9 -4
- data/lib/cassandra/custom_data.rb +24 -22
- data/lib/cassandra/driver.rb +30 -13
- data/lib/cassandra/errors.rb +12 -2
- data/lib/cassandra/execution/options.rb +52 -16
- data/lib/cassandra/execution/profile.rb +150 -0
- data/lib/cassandra/execution/profile_manager.rb +71 -0
- data/lib/cassandra/execution/trace.rb +5 -4
- data/lib/cassandra/executors.rb +1 -1
- data/lib/cassandra/index.rb +1 -1
- data/lib/cassandra/keyspace.rb +36 -1
- data/lib/cassandra/protocol.rb +5 -0
- data/lib/cassandra/protocol/coder.rb +2 -1
- data/lib/cassandra/protocol/cql_byte_buffer.rb +21 -0
- data/lib/cassandra/protocol/responses/read_failure_error_response.rb +10 -4
- data/lib/cassandra/protocol/responses/write_failure_error_response.rb +14 -8
- data/lib/cassandra/protocol/v3.rb +2 -1
- data/lib/cassandra/protocol/v4.rb +58 -20
- data/lib/cassandra/result.rb +1 -1
- data/lib/cassandra/session.rb +43 -16
- data/lib/cassandra/statements/bound.rb +5 -1
- data/lib/cassandra/statements/prepared.rb +8 -3
- data/lib/cassandra/table.rb +72 -0
- data/lib/cassandra/trigger.rb +67 -0
- data/lib/cassandra/types.rb +12 -24
- data/lib/cassandra/udt.rb +3 -6
- data/lib/cassandra/uuid/generator.rb +6 -3
- data/lib/cassandra/version.rb +1 -1
- data/lib/cassandra_murmur3.jar +0 -0
- metadata +5 -2
@@ -60,8 +60,10 @@ module Cassandra
|
|
60
60
|
# @return [ColumnContainer::Compaction] the compaction strategy of this column-container.
|
61
61
|
attr_reader :compaction_strategy
|
62
62
|
|
63
|
+
# @return whether or not change data capture is enabled on this table.
|
64
|
+
attr_reader :cdc
|
65
|
+
|
63
66
|
# @private
|
64
|
-
# rubocop:disable Metrics/ParameterLists
|
65
67
|
def initialize(comment,
|
66
68
|
read_repair_chance,
|
67
69
|
local_read_repair_chance,
|
@@ -80,7 +82,8 @@ module Cassandra
|
|
80
82
|
compression,
|
81
83
|
compact_storage,
|
82
84
|
crc_check_chance,
|
83
|
-
extensions
|
85
|
+
extensions,
|
86
|
+
cdc)
|
84
87
|
@comment = comment
|
85
88
|
@read_repair_chance = read_repair_chance
|
86
89
|
@local_read_repair_chance = local_read_repair_chance
|
@@ -100,6 +103,7 @@ module Cassandra
|
|
100
103
|
@compact_storage = compact_storage
|
101
104
|
@crc_check_chance = crc_check_chance
|
102
105
|
@extensions = extensions
|
106
|
+
@cdc = cdc
|
103
107
|
end
|
104
108
|
|
105
109
|
# Return whether to replicate counter updates to other replicas. It is *strongly* recommended
|
@@ -130,6 +134,7 @@ module Cassandra
|
|
130
134
|
options << "bloom_filter_fp_chance = #{Util.encode_object(@bloom_filter_fp_chance)}"
|
131
135
|
end
|
132
136
|
options << "caching = #{Util.encode_object(@caching)}" unless @caching.nil?
|
137
|
+
options << 'cdc = true' if @cdc
|
133
138
|
options << "comment = #{Util.encode_object(@comment)}" unless @comment.nil?
|
134
139
|
options << "compaction = #{@compaction_strategy.to_cql}" unless @compaction_strategy.nil?
|
135
140
|
options << "compression = #{Util.encode_object(@compression)}" unless @compression.nil?
|
@@ -153,7 +158,6 @@ module Cassandra
|
|
153
158
|
options << "read_repair_chance = #{Util.encode_object(@read_repair_chance)}" unless @read_repair_chance.nil?
|
154
159
|
options << "replicate_on_write = '#{@replicate_on_write}'" unless @replicate_on_write.nil?
|
155
160
|
options << "speculative_retry = #{Util.encode_object(@speculative_retry)}" unless @speculative_retry.nil?
|
156
|
-
|
157
161
|
options.join("\nAND ")
|
158
162
|
end
|
159
163
|
|
@@ -176,7 +180,8 @@ module Cassandra
|
|
176
180
|
@compression == other.compression &&
|
177
181
|
@compact_storage == other.compact_storage? &&
|
178
182
|
@crc_check_chance == other.crc_check_chance &&
|
179
|
-
@extensions == other.extensions
|
183
|
+
@extensions == other.extensions &&
|
184
|
+
@cdc == other.cdc
|
180
185
|
end
|
181
186
|
alias == eql?
|
182
187
|
end
|
@@ -20,32 +20,34 @@
|
|
20
20
|
# columns in C*. This module has no logic of its own, but indicates that the marked class has
|
21
21
|
# certain methods.
|
22
22
|
# @private
|
23
|
-
module Cassandra
|
24
|
-
|
25
|
-
base
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
module ClassMethods
|
30
|
-
# @return [Cassandra::Types::Custom] the custom type that this class represents.
|
31
|
-
def type
|
32
|
-
raise NotImplementedError, "#{self.class} must implement the :type class method"
|
23
|
+
module Cassandra
|
24
|
+
module CustomData
|
25
|
+
def self.included(base)
|
26
|
+
base.send :include, InstanceMethods
|
27
|
+
base.extend ClassMethods
|
33
28
|
end
|
34
29
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
30
|
+
module ClassMethods
|
31
|
+
# @return [Cassandra::Types::Custom] the custom type that this class represents.
|
32
|
+
def type
|
33
|
+
raise NotImplementedError, "#{self.class} must implement the :type class method"
|
34
|
+
end
|
35
|
+
|
36
|
+
# Deserialize the given data into an instance of this domain object class.
|
37
|
+
# @param data [String] byte-array representation of a column value of this custom type.
|
38
|
+
# @return An instance of the domain object class.
|
39
|
+
# @raise [Cassandra::Errors::DecodingError] upon failure.
|
40
|
+
def deserialize(data)
|
41
|
+
raise NotImplementedError, "#{self.class} must implement the :deserialize class method"
|
42
|
+
end
|
41
43
|
end
|
42
|
-
end
|
43
44
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
45
|
+
module InstanceMethods
|
46
|
+
# Serialize this domain object into a byte array to send to C*.
|
47
|
+
# @return [String] byte-array representation of this domain object.
|
48
|
+
def serialize
|
49
|
+
raise NotImplementedError, "#{self.class} must implement the :serialize instance method"
|
50
|
+
end
|
49
51
|
end
|
50
52
|
end
|
51
53
|
end
|
data/lib/cassandra/driver.rb
CHANGED
@@ -84,7 +84,7 @@ module Cassandra
|
|
84
84
|
cluster_registry,
|
85
85
|
cluster_schema,
|
86
86
|
cluster_metadata,
|
87
|
-
load_balancing_policy,
|
87
|
+
profile_manager.default_profile.load_balancing_policy,
|
88
88
|
reconnection_policy,
|
89
89
|
address_resolution_policy,
|
90
90
|
connector,
|
@@ -104,21 +104,22 @@ module Cassandra
|
|
104
104
|
cluster_metadata,
|
105
105
|
execution_options,
|
106
106
|
connection_options,
|
107
|
-
|
107
|
+
profile_manager,
|
108
108
|
reconnection_policy,
|
109
|
-
retry_policy,
|
110
109
|
address_resolution_policy,
|
111
110
|
connector,
|
112
111
|
futures_factory,
|
113
|
-
|
112
|
+
timestamp_generator)
|
114
113
|
end
|
115
114
|
|
116
115
|
let(:execution_options) do
|
117
|
-
Execution::Options.new(consistency: consistency,
|
116
|
+
Execution::Options.new(consistency: profile_manager.default_profile.consistency,
|
118
117
|
trace: trace,
|
119
118
|
page_size: page_size,
|
120
|
-
timeout: timeout,
|
121
|
-
idempotent: false
|
119
|
+
timeout: profile_manager.default_profile.timeout,
|
120
|
+
idempotent: false,
|
121
|
+
load_balancing_policy: profile_manager.default_profile.load_balancing_policy,
|
122
|
+
retry_policy: profile_manager.default_profile.retry_policy)
|
122
123
|
end
|
123
124
|
|
124
125
|
let(:connection_options) do
|
@@ -140,13 +141,15 @@ module Cassandra
|
|
140
141
|
schema_refresh_timeout,
|
141
142
|
nodelay,
|
142
143
|
requests_per_connection,
|
143
|
-
custom_types
|
144
|
+
custom_types,
|
145
|
+
allow_beta_protocol
|
144
146
|
)
|
145
147
|
end
|
146
148
|
|
147
|
-
let(:custom_types)
|
149
|
+
let(:custom_types) { [] }
|
148
150
|
let(:port) { 9042 }
|
149
151
|
let(:protocol_version) { nil }
|
152
|
+
let(:allow_beta_protocol) { false }
|
150
153
|
let(:connect_timeout) { 10 }
|
151
154
|
let(:ssl) { false }
|
152
155
|
let(:logger) { NullLogger.new }
|
@@ -157,7 +160,8 @@ module Cassandra
|
|
157
160
|
let(:load_balancing_policy) do
|
158
161
|
LoadBalancing::Policies::TokenAware.new(
|
159
162
|
LoadBalancing::Policies::DCAwareRoundRobin.new(datacenter, 0),
|
160
|
-
shuffle_replicas
|
163
|
+
shuffle_replicas
|
164
|
+
)
|
161
165
|
end
|
162
166
|
let(:reconnection_policy) do
|
163
167
|
Reconnection::Policies::Exponential.new(0.5, 30, 2)
|
@@ -180,7 +184,14 @@ module Cassandra
|
|
180
184
|
let(:connections_per_local_node) { nil }
|
181
185
|
let(:connections_per_remote_node) { nil }
|
182
186
|
let(:requests_per_connection) { nil }
|
183
|
-
|
187
|
+
let(:default_execution_profile) {
|
188
|
+
Cassandra::Execution::Profile.new(load_balancing_policy: load_balancing_policy,
|
189
|
+
retry_policy: retry_policy,
|
190
|
+
consistency: consistency,
|
191
|
+
timeout: timeout)
|
192
|
+
}
|
193
|
+
let(:execution_profiles) { {} }
|
194
|
+
let(:profile_manager) { Cassandra::Execution::ProfileManager.new(default_execution_profile, execution_profiles) }
|
184
195
|
let(:listeners) { [] }
|
185
196
|
|
186
197
|
def initialize(defaults = {})
|
@@ -188,8 +199,11 @@ module Cassandra
|
|
188
199
|
end
|
189
200
|
|
190
201
|
def connect(addresses)
|
191
|
-
|
192
|
-
|
202
|
+
profile_manager.load_balancing_policies.each do |lbp|
|
203
|
+
lbp.setup(cluster)
|
204
|
+
cluster_registry.add_listener(lbp)
|
205
|
+
end
|
206
|
+
|
193
207
|
cluster_registry.add_listener(control_connection)
|
194
208
|
listeners.each do |listener|
|
195
209
|
cluster.register(listener)
|
@@ -236,6 +250,9 @@ module Cassandra
|
|
236
250
|
picker.when('3.') do
|
237
251
|
Cluster::Schema::Fetchers::V3_0_x.new(schema_cql_type_parser, cluster_schema)
|
238
252
|
end
|
253
|
+
picker.when('4.') do
|
254
|
+
Cluster::Schema::Fetchers::V3_0_x.new(schema_cql_type_parser, cluster_schema)
|
255
|
+
end
|
239
256
|
|
240
257
|
picker
|
241
258
|
end
|
data/lib/cassandra/errors.rb
CHANGED
@@ -348,6 +348,9 @@ module Cassandra
|
|
348
348
|
attr_reader :received
|
349
349
|
# @return [Integer] the number of writes failed
|
350
350
|
attr_reader :failed
|
351
|
+
# @return [Hash<IPAddr, Integer>] map of <ip, error-code>. This is new in v5 and is nil in previous versions
|
352
|
+
# of the Casssandra protocol.
|
353
|
+
attr_reader :failures_by_node
|
351
354
|
|
352
355
|
# @private
|
353
356
|
def initialize(message,
|
@@ -363,7 +366,8 @@ module Cassandra
|
|
363
366
|
consistency,
|
364
367
|
required,
|
365
368
|
failed,
|
366
|
-
received
|
369
|
+
received,
|
370
|
+
failures_by_node)
|
367
371
|
super(message,
|
368
372
|
payload,
|
369
373
|
warnings,
|
@@ -378,6 +382,7 @@ module Cassandra
|
|
378
382
|
@required = required
|
379
383
|
@failed = failed
|
380
384
|
@received = received
|
385
|
+
@failures_by_node = failures_by_node
|
381
386
|
end
|
382
387
|
end
|
383
388
|
|
@@ -400,6 +405,9 @@ module Cassandra
|
|
400
405
|
attr_reader :received
|
401
406
|
# @return [Integer] the number of reads failed
|
402
407
|
attr_reader :failed
|
408
|
+
# @return [Hash<IPaddr, Integer>] map of <ip, error-code>. This is new in v5 and is nil in previous versions
|
409
|
+
# of the Casssandra protocol.
|
410
|
+
attr_reader :failures_by_node
|
403
411
|
|
404
412
|
# @private
|
405
413
|
def initialize(message,
|
@@ -415,7 +423,8 @@ module Cassandra
|
|
415
423
|
consistency,
|
416
424
|
required,
|
417
425
|
failed,
|
418
|
-
received
|
426
|
+
received,
|
427
|
+
failures_by_node)
|
419
428
|
super(message,
|
420
429
|
payload,
|
421
430
|
warnings,
|
@@ -430,6 +439,7 @@ module Cassandra
|
|
430
439
|
@required = required
|
431
440
|
@failed = failed
|
432
441
|
@received = received
|
442
|
+
@failures_by_node = failures_by_node
|
433
443
|
end
|
434
444
|
|
435
445
|
def retrieved?
|
@@ -50,11 +50,11 @@ module Cassandra
|
|
50
50
|
attr_reader :paging_state
|
51
51
|
|
52
52
|
# @return [nil, Hash<String, String>] custom outgoing payload, a map of
|
53
|
-
#
|
53
|
+
# string and byte buffers.
|
54
54
|
#
|
55
55
|
# @see https://github.com/apache/cassandra/blob/cassandra-3.4/doc/native_protocol_v4.spec#L125-L131 Description
|
56
56
|
# of custom payload in Cassandra native protocol v4.
|
57
|
-
# @see http://
|
57
|
+
# @see http://dsdocs30_java/manual/custom_payloads/#enabling-custom-payloads-on-c-nodes
|
58
58
|
# Enabling custom payloads on Cassandra nodes.
|
59
59
|
#
|
60
60
|
# @example Sending a custom payload
|
@@ -64,21 +64,31 @@ module Cassandra
|
|
64
64
|
# })
|
65
65
|
attr_reader :payload
|
66
66
|
|
67
|
+
# @return [Cassandra::LoadBalancing::Policy] load-balancing policy that determines which node will run the
|
68
|
+
# next statement.
|
69
|
+
attr_reader :load_balancing_policy
|
70
|
+
|
71
|
+
# @return [Cassandra::Retry::Policy] retry policy that determines how request retries should be handled for
|
72
|
+
# different failure modes.
|
73
|
+
attr_reader :retry_policy
|
74
|
+
|
67
75
|
# @private
|
68
76
|
# @param options [Hash] execution options to validate and encapsulate
|
69
77
|
# @param trusted_options [Options] (optional) base Execution::Options from which
|
70
78
|
# to create this new Options object.
|
71
79
|
def initialize(options, trusted_options = nil)
|
72
|
-
consistency
|
73
|
-
page_size
|
74
|
-
trace
|
75
|
-
timeout
|
76
|
-
serial_consistency
|
77
|
-
paging_state
|
78
|
-
arguments
|
79
|
-
type_hints
|
80
|
-
idempotent
|
81
|
-
payload
|
80
|
+
consistency = options[:consistency]
|
81
|
+
page_size = options[:page_size]
|
82
|
+
trace = options[:trace]
|
83
|
+
timeout = options[:timeout]
|
84
|
+
serial_consistency = options[:serial_consistency]
|
85
|
+
paging_state = options[:paging_state]
|
86
|
+
arguments = options[:arguments]
|
87
|
+
type_hints = options[:type_hints]
|
88
|
+
idempotent = options[:idempotent]
|
89
|
+
payload = options[:payload]
|
90
|
+
load_balancing_policy = options[:load_balancing_policy]
|
91
|
+
retry_policy = options[:retry_policy]
|
82
92
|
|
83
93
|
# consistency is a required attribute of an Options object. If we are creating
|
84
94
|
# an Options object from scratch (e.g. no trusted_options as base) validate the
|
@@ -91,6 +101,22 @@ module Cassandra
|
|
91
101
|
end
|
92
102
|
end
|
93
103
|
|
104
|
+
# load_balancing_policy and retry_policy are required, but can fallback to trusted_options, just like
|
105
|
+
# consistency.
|
106
|
+
if trusted_options.nil? || !load_balancing_policy.nil?
|
107
|
+
methods = [:host_up, :host_down, :host_found, :host_lost, :setup, :teardown,
|
108
|
+
:distance, :plan]
|
109
|
+
Util.assert_responds_to_all(methods, load_balancing_policy,
|
110
|
+
":load_balancing_policy #{load_balancing_policy.inspect} must respond " \
|
111
|
+
"to #{methods.inspect}, but doesn't")
|
112
|
+
end
|
113
|
+
if trusted_options.nil? || !retry_policy.nil?
|
114
|
+
methods = [:read_timeout, :write_timeout, :unavailable]
|
115
|
+
Util.assert_responds_to_all(methods, retry_policy,
|
116
|
+
":retry_policy #{retry_policy.inspect} must respond to #{methods.inspect}, " \
|
117
|
+
"but doesn't")
|
118
|
+
end
|
119
|
+
|
94
120
|
unless serial_consistency.nil?
|
95
121
|
Util.assert_one_of(SERIAL_CONSISTENCIES, serial_consistency) do
|
96
122
|
":serial_consistency must be one of #{SERIAL_CONSISTENCIES.inspect}, " \
|
@@ -173,6 +199,8 @@ module Cassandra
|
|
173
199
|
@serial_consistency = serial_consistency
|
174
200
|
@arguments = arguments
|
175
201
|
@type_hints = type_hints
|
202
|
+
@load_balancing_policy = load_balancing_policy
|
203
|
+
@retry_policy = retry_policy
|
176
204
|
else
|
177
205
|
@consistency = consistency || trusted_options.consistency
|
178
206
|
@page_size = page_size || trusted_options.page_size
|
@@ -181,6 +209,8 @@ module Cassandra
|
|
181
209
|
@serial_consistency = serial_consistency || trusted_options.serial_consistency
|
182
210
|
@arguments = arguments || trusted_options.arguments
|
183
211
|
@type_hints = type_hints || trusted_options.type_hints
|
212
|
+
@load_balancing_policy = load_balancing_policy || trusted_options.load_balancing_policy
|
213
|
+
@retry_policy = retry_policy || trusted_options.retry_policy
|
184
214
|
end
|
185
215
|
|
186
216
|
# The following fields are *not* inherited from trusted_options, so we always
|
@@ -210,18 +240,24 @@ module Cassandra
|
|
210
240
|
other.serial_consistency == @serial_consistency &&
|
211
241
|
other.paging_state == @paging_state &&
|
212
242
|
other.arguments == @arguments &&
|
213
|
-
other.type_hints == @type_hints
|
243
|
+
other.type_hints == @type_hints &&
|
244
|
+
other.load_balancing_policy == @load_balancing_policy &&
|
245
|
+
other.retry_policy == @retry_policy
|
214
246
|
end
|
215
247
|
alias == eql?
|
216
248
|
|
217
249
|
# @private
|
218
250
|
def override(*options)
|
219
251
|
merged = options.unshift({}).inject do |base, opts|
|
252
|
+
# Skip nil args
|
220
253
|
next base unless opts
|
221
|
-
|
222
|
-
|
254
|
+
|
255
|
+
if opts.is_a?(Cassandra::Execution::Profile)
|
256
|
+
base.merge!(opts.to_h)
|
257
|
+
else
|
258
|
+
Util.assert_instance_of(::Hash, opts, "options must be a Hash, #{opts.inspect} given")
|
259
|
+
base.merge!(opts)
|
223
260
|
end
|
224
|
-
base.merge!(opts)
|
225
261
|
end
|
226
262
|
|
227
263
|
Options.new(merged, self)
|
@@ -0,0 +1,150 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
#--
|
4
|
+
# Copyright 2013-2016 DataStax, Inc.
|
5
|
+
#
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
7
|
+
# you may not use this file except in compliance with the License.
|
8
|
+
# You may obtain a copy of the License at
|
9
|
+
#
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
11
|
+
#
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
15
|
+
# See the License for the specific language governing permissions and
|
16
|
+
# limitations under the License.
|
17
|
+
#++
|
18
|
+
|
19
|
+
module Cassandra
|
20
|
+
module Execution
|
21
|
+
# A profile is a collection of settings to use when executing and preparing statements. Register different
|
22
|
+
# profiles when creating the {Cassandra::Cluster} and execute/prepare statements with a particular profile
|
23
|
+
# by providing its name to the relevant method in {Session}.
|
24
|
+
#
|
25
|
+
# @see Cassandra.cluster
|
26
|
+
# @see Session#execute_async
|
27
|
+
# @see Session#execute
|
28
|
+
# @see Session#prepare_async
|
29
|
+
# @see Session#prepare
|
30
|
+
class Profile
|
31
|
+
# @return [Cassandra::LoadBalancing::Policy] load-balancing policy that determines which node will run the
|
32
|
+
# next statement.
|
33
|
+
attr_reader :load_balancing_policy
|
34
|
+
|
35
|
+
# @return [Cassandra::Retry::Policy] retry policy that determines how request retries should be handled for
|
36
|
+
# different failure modes.
|
37
|
+
attr_reader :retry_policy
|
38
|
+
|
39
|
+
# @return [Symbol] consistency level with which to run statements.
|
40
|
+
attr_reader :consistency
|
41
|
+
|
42
|
+
# @return [Numeric] request execution timeout in seconds. `nil` means there is no timeout.
|
43
|
+
attr_reader :timeout
|
44
|
+
|
45
|
+
# @private
|
46
|
+
DEFAULT_OPTIONS = { consistency: :local_one, timeout: 12 }.freeze
|
47
|
+
|
48
|
+
# @param options [Hash] hash of attributes. Unspecified attributes fall back to system defaults.
|
49
|
+
# @option options [Numeric] :timeout (12) Request execution timeout in
|
50
|
+
# seconds. Setting value to `nil` will remove request timeout.
|
51
|
+
# @option options [Cassandra::LoadBalancing::Policy] :load_balancing_policy (
|
52
|
+
# LoadBalancing::Policies::TokenAware(LoadBalancing::Policies::DCAwareRoundRobin)) Load-balancing policy
|
53
|
+
# that determines which node will run the next statement.
|
54
|
+
# @option options [Cassandra::Retry::Policy] :retry_policy (Retry::Policies::Default) Retry policy that
|
55
|
+
# determines how request retries should be handled for different failure modes.
|
56
|
+
# @option options [Symbol] :consistency (:local_one) Consistency level with which to run statements. Must be one
|
57
|
+
# of {Cassandra::CONSISTENCIES}.
|
58
|
+
def initialize(options = {})
|
59
|
+
validate(options)
|
60
|
+
options = DEFAULT_OPTIONS.merge(options)
|
61
|
+
@load_balancing_policy = options[:load_balancing_policy] ||
|
62
|
+
LoadBalancing::Policies::TokenAware.new(
|
63
|
+
LoadBalancing::Policies::DCAwareRoundRobin.new,
|
64
|
+
true)
|
65
|
+
@retry_policy = options[:retry_policy] || Retry::Policies::Default.new
|
66
|
+
@consistency = options[:consistency]
|
67
|
+
@timeout = options[:timeout]
|
68
|
+
end
|
69
|
+
|
70
|
+
# @private
|
71
|
+
def to_h
|
72
|
+
{
|
73
|
+
load_balancing_policy: @load_balancing_policy,
|
74
|
+
retry_policy: @retry_policy,
|
75
|
+
consistency: @consistency,
|
76
|
+
timeout: @timeout
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
# @private
|
81
|
+
def eql?(other)
|
82
|
+
other.is_a?(Profile) && \
|
83
|
+
@load_balancing_policy == other.load_balancing_policy && \
|
84
|
+
@retry_policy == other.retry_policy && \
|
85
|
+
@consistency == other.consistency && \
|
86
|
+
@timeout == other.timeout
|
87
|
+
end
|
88
|
+
alias == eql?
|
89
|
+
|
90
|
+
# @private
|
91
|
+
def hash
|
92
|
+
@hash ||= begin
|
93
|
+
h = 17
|
94
|
+
h = 31 * h + @load_balancing_policy.hash
|
95
|
+
h = 31 * h + @retry_policy.hash
|
96
|
+
h = 31 * h + @consistency.hash
|
97
|
+
h = 31 * h + @timeout.hash
|
98
|
+
h
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
# @private
|
103
|
+
def inspect
|
104
|
+
"#<#{self.class.name}:0x#{object_id.to_s(16)} " \
|
105
|
+
"load_balancing_policy=#{@load_balancing_policy.inspect}, " \
|
106
|
+
"retry_policy=#{@retry_policy.inspect}, " \
|
107
|
+
"consistency=#{@consistency.inspect}, " \
|
108
|
+
"timeout=#{@timeout.inspect}>"
|
109
|
+
end
|
110
|
+
|
111
|
+
# @private
|
112
|
+
def validate(options)
|
113
|
+
if options.key?(:timeout)
|
114
|
+
timeout = options[:timeout]
|
115
|
+
|
116
|
+
unless timeout.nil?
|
117
|
+
Util.assert_instance_of(::Numeric, timeout, ":timeout must be a number of seconds, #{timeout.inspect} given")
|
118
|
+
Util.assert(timeout > 0, ":timeout must be greater than 0, #{timeout} given")
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
if options.key?(:load_balancing_policy)
|
123
|
+
load_balancing_policy = options[:load_balancing_policy]
|
124
|
+
methods = [:host_up, :host_down, :host_found, :host_lost, :setup, :teardown,
|
125
|
+
:distance, :plan]
|
126
|
+
Util.assert_responds_to_all(methods, load_balancing_policy) do
|
127
|
+
":load_balancing_policy #{load_balancing_policy.inspect} must respond " \
|
128
|
+
"to #{methods.inspect}, but doesn't"
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
if options.key?(:retry_policy)
|
133
|
+
retry_policy = options[:retry_policy]
|
134
|
+
methods = [:read_timeout, :write_timeout, :unavailable]
|
135
|
+
Util.assert_responds_to_all(methods, retry_policy) do
|
136
|
+
":retry_policy #{retry_policy.inspect} must respond to #{methods.inspect}, " \
|
137
|
+
"but doesn't"
|
138
|
+
end
|
139
|
+
end
|
140
|
+
|
141
|
+
if options.key?(:consistency)
|
142
|
+
consistency = options[:consistency]
|
143
|
+
Util.assert_one_of(CONSISTENCIES, consistency,
|
144
|
+
":consistency must be one of #{CONSISTENCIES.inspect}, " \
|
145
|
+
"#{consistency.inspect} given")
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|