cassandra-driver 1.0.0.rc.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +8 -8
  2. data/README.md +45 -10
  3. data/lib/cassandra.rb +82 -82
  4. data/lib/cassandra/cluster.rb +3 -0
  5. data/lib/cassandra/cluster/client.rb +17 -5
  6. data/lib/cassandra/{client/connection_manager.rb → cluster/connection_pool.rb} +3 -3
  7. data/lib/cassandra/cluster/connector.rb +101 -30
  8. data/lib/cassandra/cluster/control_connection.rb +6 -7
  9. data/lib/cassandra/{client/null_logger.rb → cluster/failed_connection.rb} +12 -14
  10. data/lib/cassandra/cluster/options.rb +8 -0
  11. data/lib/cassandra/column.rb +5 -0
  12. data/lib/cassandra/driver.rb +3 -3
  13. data/lib/cassandra/errors.rb +5 -5
  14. data/lib/cassandra/execution/options.rb +13 -6
  15. data/lib/cassandra/execution/trace.rb +4 -4
  16. data/lib/cassandra/future.rb +4 -0
  17. data/lib/cassandra/keyspace.rb +5 -0
  18. data/lib/cassandra/load_balancing/policies/dc_aware_round_robin.rb +7 -2
  19. data/lib/cassandra/load_balancing/policies/token_aware.rb +1 -3
  20. data/lib/cassandra/load_balancing/policies/white_list.rb +3 -6
  21. data/lib/cassandra/null_logger.rb +35 -0
  22. data/lib/cassandra/protocol/cql_protocol_handler.rb +4 -0
  23. data/lib/cassandra/protocol/requests/query_request.rb +1 -11
  24. data/lib/cassandra/result.rb +4 -6
  25. data/lib/cassandra/session.rb +3 -0
  26. data/lib/cassandra/statements/prepared.rb +5 -1
  27. data/lib/cassandra/table.rb +5 -0
  28. data/lib/cassandra/util.rb +130 -0
  29. data/lib/cassandra/version.rb +1 -1
  30. metadata +9 -20
  31. data/lib/cassandra/client.rb +0 -144
  32. data/lib/cassandra/client/batch.rb +0 -212
  33. data/lib/cassandra/client/client.rb +0 -591
  34. data/lib/cassandra/client/column_metadata.rb +0 -54
  35. data/lib/cassandra/client/connector.rb +0 -273
  36. data/lib/cassandra/client/execute_options_decoder.rb +0 -59
  37. data/lib/cassandra/client/peer_discovery.rb +0 -50
  38. data/lib/cassandra/client/prepared_statement.rb +0 -314
  39. data/lib/cassandra/client/query_result.rb +0 -230
  40. data/lib/cassandra/client/request_runner.rb +0 -70
  41. data/lib/cassandra/client/result_metadata.rb +0 -48
  42. data/lib/cassandra/client/void_result.rb +0 -78
@@ -191,6 +191,7 @@ module Cassandra
191
191
 
192
192
  @control_connection.close_async.on_complete do |f|
193
193
  if f.resolved?
194
+ @load_balancing_policy.teardown(self) rescue nil
194
195
  promise.fulfill(self)
195
196
  else
196
197
  f.on_failure {|e| promise.break(e)}
@@ -217,8 +218,10 @@ module Cassandra
217
218
  end
218
219
 
219
220
  require 'cassandra/cluster/client'
221
+ require 'cassandra/cluster/connection_pool'
220
222
  require 'cassandra/cluster/connector'
221
223
  require 'cassandra/cluster/control_connection'
224
+ require 'cassandra/cluster/failed_connection'
222
225
  require 'cassandra/cluster/metadata'
223
226
  require 'cassandra/cluster/options'
224
227
  require 'cassandra/cluster/registry'
@@ -63,11 +63,12 @@ module Cassandra
63
63
  @connected_future = begin
64
64
  @logger.info('Creating session')
65
65
  @registry.add_listener(self)
66
+ @schema.add_listener(self)
66
67
 
67
68
  futures = @connecting_hosts.map do |(host, distance)|
68
69
  f = connect_to_host(host, distance)
69
70
  f.recover do |error|
70
- Cassandra::Client::FailedConnection.new(error, host)
71
+ FailedConnection.new(error, host)
71
72
  end
72
73
  end
73
74
 
@@ -100,6 +101,7 @@ module Cassandra
100
101
 
101
102
  @closed_future = begin
102
103
  @registry.remove_listener(self)
104
+ @schema.remove_listener(self)
103
105
 
104
106
  if state == :connecting
105
107
  f = @connected_future.recover.flat_map { close_connections }
@@ -157,6 +159,18 @@ module Cassandra
157
159
  end
158
160
  end
159
161
 
162
+ def keyspace_created(keyspace)
163
+ end
164
+
165
+ def keyspace_changed(keyspace)
166
+ end
167
+
168
+ def keyspace_dropped(keyspace)
169
+ @keyspace = nil if @keyspace == keyspace.name
170
+ nil
171
+ end
172
+
173
+
160
174
  def query(statement, options, paging_state = nil)
161
175
  request = Protocol::QueryRequest.new(statement.cql, statement.params, nil, options.consistency, options.serial_consistency, options.page_size, paging_state, options.trace?)
162
176
  timeout = options.timeout
@@ -340,7 +354,7 @@ module Cassandra
340
354
  @connecting_hosts.delete(host)
341
355
  @prepared_statements[host] = {}
342
356
  @preparing_statements[host] = {}
343
- manager = @connections[host] ||= Cassandra::Client::ConnectionManager.new
357
+ manager = @connections[host] ||= ConnectionPool.new
344
358
  end
345
359
 
346
360
  manager.add_connections(connections)
@@ -671,9 +685,7 @@ module Cassandra
671
685
  when Protocol::RowsResultResponse
672
686
  promise.fulfill(Results::Paged.new(r.rows, r.paging_state, r.trace_id, keyspace, statement, options, hosts, request.consistency, retries, self, @futures))
673
687
  when Protocol::SchemaChangeResultResponse
674
- if r.change == 'DROPPED' && r.keyspace == @keyspace && r.table.empty?
675
- @keyspace = nil
676
- end
688
+ @schema.delete_keyspace(r.keyspace) if r.change == 'DROPPED' && r.table.empty?
677
689
 
678
690
  @logger.debug('Waiting for schema to propagate to all hosts after a change')
679
691
  wait_for_schema_agreement(connection, @reconnection_policy.schedule).on_complete do |f|
@@ -17,14 +17,14 @@
17
17
  #++
18
18
 
19
19
  module Cassandra
20
- module Client
20
+ class Cluster
21
21
  # @private
22
- class ConnectionManager
22
+ class ConnectionPool
23
23
  include Enumerable
24
24
 
25
25
  def initialize
26
26
  @connections = []
27
- @lock = Mutex.new
27
+ @lock = ::Mutex.new
28
28
  end
29
29
 
30
30
  def add_connections(connections)
@@ -22,13 +22,14 @@ module Cassandra
22
22
  class Connector
23
23
  include MonitorMixin
24
24
 
25
- def initialize(logger, io_reactor, cluster_registry, connection_options)
26
- @logger = logger
27
- @reactor = io_reactor
28
- @registry = cluster_registry
29
- @options = connection_options
30
- @connections = ::Hash.new
31
- @open_connections = ::Hash.new
25
+ def initialize(logger, io_reactor, cluster_registry, connection_options, execution_options)
26
+ @logger = logger
27
+ @reactor = io_reactor
28
+ @registry = cluster_registry
29
+ @connection_options = connection_options
30
+ @execution_options = execution_options
31
+ @connections = ::Hash.new
32
+ @open_connections = ::Hash.new
32
33
 
33
34
  mon_initialize
34
35
  end
@@ -115,13 +116,33 @@ module Cassandra
115
116
  UNCLAIMED_TIMEOUT = 5 # close unclaimed connections in five seconds
116
117
 
117
118
  def do_connect(host)
118
- create_connector.connect(host.ip.to_s).fallback do |error|
119
+ f = @reactor.connect(host.ip.to_s, @connection_options.port, {:timeout => @connection_options.connect_timeout, :ssl => @connection_options.ssl}) do |connection|
120
+ raise Errors::ClientError, 'Not connected, reactor stopped' unless connection
121
+ Protocol::CqlProtocolHandler.new(connection, @reactor, @connection_options.protocol_version, @connection_options.compressor, @connection_options.heartbeat_interval, @connection_options.idle_timeout)
122
+ end
123
+ f = f.flat_map do |connection|
124
+ request_options(connection).flat_map do |options|
125
+ compression = @connection_options.compression
126
+ supported_algorithms = options['COMPRESSION']
127
+
128
+ if compression && !supported_algorithms.include?(compression)
129
+ @logger.warn("Compression with #{compression.inspect} is not supported by host at #{host.ip}, supported algorithms are #{supported_algorithms.inspect}")
130
+ compression = nil
131
+ end
132
+
133
+ supported_cql_versions = options['CQL_VERSION']
134
+ cql_version = (supported_cql_versions && !supported_cql_versions.empty?) ? supported_cql_versions.first : '3.1.0'
135
+
136
+ startup_connection(connection, cql_version, compression)
137
+ end
138
+ end
139
+ f.fallback do |error|
119
140
  case error
120
141
  when Errors::ProtocolError
121
142
  synchronize do
122
- if @options.protocol_version > 1
123
- @logger.info("Host #{host.ip} doesn't support protocol version #{@options.protocol_version}, downgrading")
124
- @options.protocol_version -= 1
143
+ if @connection_options.protocol_version > 1
144
+ @logger.info("Host #{host.ip} doesn't support protocol version #{@connection_options.protocol_version}, downgrading")
145
+ @connection_options.protocol_version -= 1
125
146
  do_connect(host)
126
147
  else
127
148
  Ione::Future.failed(error)
@@ -137,32 +158,82 @@ module Cassandra
137
158
  end
138
159
  end
139
160
 
140
- def create_connector
141
- authentication_step = @options.protocol_version == 1 ? Cassandra::Client::CredentialsAuthenticationStep.new(@options.credentials) : Cassandra::Client::SaslAuthenticationStep.new(@options.auth_provider)
142
- protocol_handler_factory = lambda do |connection|
143
- raise Errors::ClientError, 'Not connected, reactor stopped' unless connection
144
- Protocol::CqlProtocolHandler.new(connection, @reactor, @options.protocol_version, @options.compressor, @options.heartbeat_interval, @options.idle_timeout)
161
+ def startup_connection(connection, cql_version, compression)
162
+ connection.send_request(Protocol::StartupRequest.new(cql_version, compression), @execution_options.timeout).flat_map do |r|
163
+ case r
164
+ when Protocol::AuthenticateResponse
165
+ if @connection_options.protocol_version == 1
166
+ credentials = @connection_options.credentials
167
+ if credentials
168
+ send_credentials(connection, credentials)
169
+ else
170
+ Ione::Future.failed(Errors::AuthenticationError.new('Server requested authentication, but client was not configured to authenticate'))
171
+ end
172
+ else
173
+ authenticator = @connection_options.create_authenticator(r.authentication_class)
174
+ if authenticator
175
+ challenge_response_cycle(connection, authenticator, authenticator.initial_response)
176
+ else
177
+ Ione::Future.failed(Errors::AuthenticationError.new('Server requested authentication, but client was not configured to authenticate'))
178
+ end
179
+ end
180
+ when Protocol::ReadyResponse
181
+ ::Ione::Future.resolved(connection)
182
+ when Protocol::ErrorResponse
183
+ ::Ione::Future.failed(r.to_error(VOID_STATEMENT))
184
+ else
185
+ ::Ione::Future.failed(Errors::InternalError.new("Unexpected response #{r.inspect}"))
186
+ end
187
+ end
188
+ end
189
+
190
+ def request_options(connection)
191
+ connection.send_request(Protocol::OptionsRequest.new, @execution_options.timeout).map do |r|
192
+ case r
193
+ when Protocol::SupportedResponse
194
+ r.options
195
+ when Protocol::ErrorResponse
196
+ raise r.to_error(VOID_STATEMENT)
197
+ else
198
+ raise Errors::InternalError, "Unexpected response #{r.inspect}"
199
+ end
145
200
  end
201
+ end
146
202
 
147
- Cassandra::Client::Connector.new([
148
- Cassandra::Client::ConnectStep.new(
149
- @reactor,
150
- protocol_handler_factory,
151
- @options.port,
152
- {:timeout => @options.connect_timeout, :ssl => @options.ssl},
153
- @logger
154
- ),
155
- Cassandra::Client::CacheOptionsStep.new(@options.connect_timeout),
156
- Cassandra::Client::InitializeStep.new(@options.compressor, @logger),
157
- authentication_step,
158
- Cassandra::Client::CachePropertiesStep.new,
159
- ])
203
+ def send_credentials(connection, credentials)
204
+ connection.send_request(Protocol::CredentialsRequest.new(credentials), @execution_options.timeout).map do |r|
205
+ case r
206
+ when Protocol::ReadyResponse
207
+ connection
208
+ when Protocol::ErrorResponse
209
+ raise r.to_error(VOID_STATEMENT)
210
+ else
211
+ raise Errors::InternalError, "Unexpected response #{r.inspect}"
212
+ end
213
+ end
214
+ end
215
+
216
+ def challenge_response_cycle(connection, authenticator, token)
217
+ connection.send_request(Protocol::AuthResponseRequest.new(token), @execution_options.timeout).flat_map do |r|
218
+ case r
219
+ when Protocol::AuthChallengeResponse
220
+ token = authenticator.challenge_response(r.token)
221
+ challenge_response_cycle(pending_connection, authenticator, token)
222
+ when Protocol::AuthSuccessResponse
223
+ authenticator.authentication_successful(r.token) rescue nil
224
+ ::Ione::Future.resolved(connection)
225
+ when Protocol::ErrorResponse
226
+ ::Ione::Future.failed(r.to_error(VOID_STATEMENT))
227
+ else
228
+ ::Ione::Future.failed(Errors::InternalError.new("Unexpected response #{r.inspect}"))
229
+ end
230
+ end
160
231
  end
161
232
 
162
233
  def create_additional_connections(host, count, established_connections, error = nil)
163
234
  futures = count.times.map do
164
235
  connect(host).recover do |e|
165
- Cassandra::Client::FailedConnection.new(e, host)
236
+ FailedConnection.new(e, host)
166
237
  end
167
238
  end
168
239
 
@@ -333,10 +333,9 @@ module Cassandra
333
333
 
334
334
  return Ione::Future.failed(Errors::ClientError.new('Not connected')) if connection.nil?
335
335
 
336
- params = [keyspace]
337
- keyspaces = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_keyspaces WHERE keyspace_name = ?", params, nil, :one))
338
- tables = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columnfamilies WHERE keyspace_name = ?", params, nil, :one))
339
- columns = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columns WHERE keyspace_name = ?", params, nil, :one))
336
+ keyspaces = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_keyspaces WHERE keyspace_name = '%s'" % keyspace, nil, nil, :one))
337
+ tables = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columnfamilies WHERE keyspace_name = '%s'" % keyspace, nil, nil, :one))
338
+ columns = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columns WHERE keyspace_name = '%s'" % keyspace, nil, nil, :one))
340
339
 
341
340
  Ione::Future.all(keyspaces, tables, columns).map do |(keyspaces, tables, columns)|
342
341
  host = @registry.host(connection.host)
@@ -396,8 +395,8 @@ module Cassandra
396
395
  return Ione::Future.failed(Errors::ClientError.new('Not connected')) if connection.nil?
397
396
 
398
397
  params = [keyspace, table]
399
- table = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columnfamilies WHERE keyspace_name = ? AND columnfamily_name = ?", params, nil, :one))
400
- columns = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columns WHERE keyspace_name = ? AND columnfamily_name = ?", params, nil, :one))
398
+ table = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columnfamilies WHERE keyspace_name = '%s' AND columnfamily_name = '%s'" % params, nil, nil, :one))
399
+ columns = send_select_request(connection, Protocol::QueryRequest.new("SELECT * FROM system.schema_columns WHERE keyspace_name = '%s' AND columnfamily_name = '%s'" % params, nil, nil, :one))
401
400
 
402
401
  Ione::Future.all(table, columns).map do |(table, columns)|
403
402
  host = @registry.host(connection.host)
@@ -563,7 +562,7 @@ module Cassandra
563
562
  if ip == connection.host
564
563
  request = SELECT_LOCAL
565
564
  else
566
- request = Protocol::QueryRequest.new('SELECT rack, data_center, host_id, rpc_address, release_version, tokens FROM system.peers WHERE peer = ?', [address], nil, :one)
565
+ request = Protocol::QueryRequest.new("SELECT rack, data_center, host_id, rpc_address, release_version, tokens FROM system.peers WHERE peer = '%s'" % address, nil, nil, :one)
567
566
  end
568
567
 
569
568
  send_select_request(connection, request).map do |rows|
@@ -17,21 +17,19 @@
17
17
  #++
18
18
 
19
19
  module Cassandra
20
- module Client
20
+ class Cluster
21
21
  # @private
22
- class NullLogger
23
- def close(*); end
24
- def debug(*); end
25
- def debug?; false end
26
- def error(*); end
27
- def error?; false end
28
- def fatal(*); end
29
- def fatal?; false end
30
- def info(*); end
31
- def info?; false end
32
- def unknown(*); end
33
- def warn(*); end
34
- def warn?; false end
22
+ class FailedConnection
23
+ attr_reader :error, :host
24
+
25
+ def initialize(error, host)
26
+ @error = error
27
+ @host = host
28
+ end
29
+
30
+ def connected?
31
+ false
32
+ end
35
33
  end
36
34
  end
37
35
  end
@@ -40,6 +40,14 @@ module Cassandra
40
40
  @connections_per_local_node = connections_per_local_node
41
41
  @connections_per_remote_node = connections_per_remote_node
42
42
  end
43
+
44
+ def compression
45
+ @compressor && @compressor.algorithm
46
+ end
47
+
48
+ def create_authenticator(authentication_class)
49
+ @auth_provider && @auth_provider.create_authenticator(authentication_class)
50
+ end
43
51
  end
44
52
  end
45
53
  end
@@ -78,6 +78,11 @@ module Cassandra
78
78
  cql
79
79
  end
80
80
 
81
+ # @return [String] a CLI-friendly column representation
82
+ def inspect
83
+ "#<#{self.class.name}:0x#{self.object_id.to_s(16)} @name=#{@name}>"
84
+ end
85
+
81
86
  # @return [Boolean] whether this column is equal to the other
82
87
  def eql?(other)
83
88
  other.is_a?(Column) &&
@@ -54,7 +54,7 @@ module Cassandra
54
54
  let(:ordered_partitioner) { Cluster::Schema::Partitioners::Ordered.new }
55
55
  let(:random_partitioner) { Cluster::Schema::Partitioners::Random.new }
56
56
 
57
- let(:connector) { Cluster::Connector.new(logger, io_reactor, cluster_registry, connection_options) }
57
+ let(:connector) { Cluster::Connector.new(logger, io_reactor, cluster_registry, connection_options, execution_options) }
58
58
 
59
59
  let(:control_connection) { Cluster::ControlConnection.new(logger, io_reactor, cluster_registry, cluster_schema, cluster_metadata, load_balancing_policy, reconnection_policy, address_resolution_policy, connector) }
60
60
 
@@ -75,7 +75,7 @@ module Cassandra
75
75
  let(:protocol_version) { 2 }
76
76
  let(:connect_timeout) { 10 }
77
77
  let(:ssl) { false }
78
- let(:logger) { Client::NullLogger.new }
78
+ let(:logger) { NullLogger.new }
79
79
  let(:compressor) { nil }
80
80
  let(:credentials) { nil }
81
81
  let(:auth_provider) { nil }
@@ -86,7 +86,7 @@ module Cassandra
86
86
  let(:address_resolution_policy) { AddressResolution::Policies::None.new }
87
87
  let(:consistency) { :one }
88
88
  let(:trace) { false }
89
- let(:page_size) { nil }
89
+ let(:page_size) { 10000 }
90
90
  let(:heartbeat_interval) { 30 }
91
91
  let(:idle_timeout) { 60 }
92
92
  let(:timeout) { 10 }
@@ -49,28 +49,28 @@ module Cassandra
49
49
  end
50
50
 
51
51
  # Mixed into all internal driver errors.
52
- module InternalError
52
+ class InternalError < ::RuntimeError
53
53
  include Error, HostError
54
54
  end
55
55
 
56
56
  # Raised when data decoding fails.
57
57
  class DecodingError < ::RuntimeError
58
- include InternalError
58
+ include Error, HostError
59
59
  end
60
60
 
61
61
  # Raised when data encoding fails.
62
62
  class EncodingError < ::RuntimeError
63
- include InternalError
63
+ include Error, HostError
64
64
  end
65
65
 
66
66
  # Raised when a connection level error occured.
67
67
  class IOError < ::IOError
68
- include InternalError
68
+ include Error, HostError
69
69
  end
70
70
 
71
71
  # Raised when a timeout has occured.
72
72
  class TimeoutError < ::Timeout::Error
73
- include InternalError
73
+ include Error, HostError
74
74
  end
75
75
 
76
76
  # Mixed into all request execution errors.
@@ -39,14 +39,21 @@ module Cassandra
39
39
  timeout = options[:timeout]
40
40
  serial_consistency = options[:serial_consistency]
41
41
 
42
- raise ::ArgumentError, ":consistency must be one of #{CONSISTENCIES.inspect}, #{consistency.inspect} given" unless CONSISTENCIES.include?(consistency)
43
- raise ::ArgumentError, ":serial_consistency must be one of #{SERIAL_CONSISTENCIES.inspect}, #{serial_consistency.inspect} given" if serial_consistency && !SERIAL_CONSISTENCIES.include?(serial_consistency)
42
+ Util.assert_one_of(CONSISTENCIES, consistency) { ":consistency must be one of #{CONSISTENCIES.inspect}, #{consistency.inspect} given" }
44
43
 
45
- page_size = page_size && Integer(page_size)
46
- timeout = timeout && Integer(timeout)
44
+ unless serial_consistency.nil?
45
+ Util.assert_one_of(SERIAL_CONSISTENCIES, serial_consistency) { ":serial_consistency must be one of #{SERIAL_CONSISTENCIES.inspect}, #{serial_consistency.inspect} given" }
46
+ end
47
47
 
48
- raise ::ArgumentError, ":page_size must be greater than 0, #{page_size.inspect} given" if page_size && page_size <= 0
49
- raise ::ArgumentError, ":timeout must be greater than 0, #{timeout.inspect} given" if timeout && timeout <= 0
48
+ unless page_size.nil?
49
+ page_size = options[:page_size] = Integer(page_size)
50
+ Util.assert(page_size > 0) { ":page_size must be a positive integer, #{page_size.inspect} given" }
51
+ end
52
+
53
+ unless timeout.nil?
54
+ Util.assert_instance_of(::Numeric, timeout) { ":timeout must be a number of seconds, #{timeout} given" }
55
+ Util.assert(timeout > 0) { ":timeout must be greater than 0, #{timeout} given" }
56
+ end
50
57
 
51
58
  @consistency = consistency
52
59
  @page_size = page_size
@@ -108,16 +108,16 @@ module Cassandra
108
108
  private
109
109
 
110
110
  # @private
111
- SELECT_SESSION = "SELECT * FROM system_traces.sessions WHERE session_id = ?"
111
+ SELECT_SESSION = "SELECT * FROM system_traces.sessions WHERE session_id = %s"
112
112
  # @private
113
- SELECT_EVENTS = "SELECT * FROM system_traces.events WHERE session_id = ?"
113
+ SELECT_EVENTS = "SELECT * FROM system_traces.events WHERE session_id = %s"
114
114
 
115
115
  # @private
116
116
  def load
117
117
  synchronize do
118
118
  return if @loaded
119
119
 
120
- data = @client.query(Statements::Simple.new(SELECT_SESSION, @id), VOID_OPTIONS).get.first
120
+ data = @client.query(Statements::Simple.new(SELECT_SESSION % @id), VOID_OPTIONS).get.first
121
121
  raise ::RuntimeError, "unable to load trace #{@id}" if data.nil?
122
122
 
123
123
  @coordinator = data['coordinator']
@@ -138,7 +138,7 @@ module Cassandra
138
138
 
139
139
  @events = []
140
140
 
141
- @client.query(Statements::Simple.new(SELECT_EVENTS, @id), VOID_OPTIONS).get.each do |row|
141
+ @client.query(Statements::Simple.new(SELECT_EVENTS % @id), VOID_OPTIONS).get.each do |row|
142
142
  @events << Event.new(row['event_id'], row['activity'], row['source'], row['source_elapsed'], row['thread'])
143
143
  end
144
144