cassandra-driver 3.0.3 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +8 -8
  2. data/README.md +46 -31
  3. data/lib/cassandra.rb +35 -44
  4. data/lib/cassandra/cluster.rb +40 -11
  5. data/lib/cassandra/cluster/client.rb +193 -159
  6. data/lib/cassandra/cluster/connector.rb +12 -10
  7. data/lib/cassandra/cluster/control_connection.rb +38 -10
  8. data/lib/cassandra/cluster/options.rb +8 -4
  9. data/lib/cassandra/cluster/registry.rb +1 -2
  10. data/lib/cassandra/cluster/schema/fetchers.rb +122 -26
  11. data/lib/cassandra/column_container.rb +9 -4
  12. data/lib/cassandra/custom_data.rb +24 -22
  13. data/lib/cassandra/driver.rb +30 -13
  14. data/lib/cassandra/errors.rb +12 -2
  15. data/lib/cassandra/execution/options.rb +52 -16
  16. data/lib/cassandra/execution/profile.rb +150 -0
  17. data/lib/cassandra/execution/profile_manager.rb +71 -0
  18. data/lib/cassandra/execution/trace.rb +5 -4
  19. data/lib/cassandra/executors.rb +1 -1
  20. data/lib/cassandra/index.rb +1 -1
  21. data/lib/cassandra/keyspace.rb +36 -1
  22. data/lib/cassandra/protocol.rb +5 -0
  23. data/lib/cassandra/protocol/coder.rb +2 -1
  24. data/lib/cassandra/protocol/cql_byte_buffer.rb +21 -0
  25. data/lib/cassandra/protocol/responses/read_failure_error_response.rb +10 -4
  26. data/lib/cassandra/protocol/responses/write_failure_error_response.rb +14 -8
  27. data/lib/cassandra/protocol/v3.rb +2 -1
  28. data/lib/cassandra/protocol/v4.rb +58 -20
  29. data/lib/cassandra/result.rb +1 -1
  30. data/lib/cassandra/session.rb +43 -16
  31. data/lib/cassandra/statements/bound.rb +5 -1
  32. data/lib/cassandra/statements/prepared.rb +8 -3
  33. data/lib/cassandra/table.rb +72 -0
  34. data/lib/cassandra/trigger.rb +67 -0
  35. data/lib/cassandra/types.rb +12 -24
  36. data/lib/cassandra/udt.rb +3 -6
  37. data/lib/cassandra/uuid/generator.rb +6 -3
  38. data/lib/cassandra/version.rb +1 -1
  39. metadata +5 -2
@@ -29,9 +29,8 @@ module Cassandra
29
29
  cluster_schema,
30
30
  io_reactor,
31
31
  connector,
32
- load_balancing_policy,
32
+ profile_manager,
33
33
  reconnection_policy,
34
- retry_policy,
35
34
  address_resolution_policy,
36
35
  connection_options,
37
36
  futures_factory,
@@ -41,15 +40,14 @@ module Cassandra
41
40
  @schema = cluster_schema
42
41
  @reactor = io_reactor
43
42
  @connector = connector
44
- @load_balancing_policy = load_balancing_policy
43
+ @profile_manager = profile_manager
45
44
  @reconnection_policy = reconnection_policy
46
- @retry_policy = retry_policy
47
45
  @address_resolver = address_resolution_policy
48
46
  @connection_options = connection_options
49
47
  @futures = futures_factory
50
48
  @connections = ::Hash.new
51
49
  @prepared_statements = ::Hash.new
52
- @preparing_statements = ::Hash.new
50
+ @preparing_statements = ::Hash.new {|hash, host| hash[host] = {}}
53
51
  @pending_connections = ::Hash.new
54
52
  @keyspace = nil
55
53
  @state = :idle
@@ -67,7 +65,7 @@ module Cassandra
67
65
 
68
66
  @state = :connecting
69
67
  @registry.each_host do |host|
70
- distance = @load_balancing_policy.distance(host)
68
+ distance = @profile_manager.distance(host)
71
69
 
72
70
  case distance
73
71
  when :ignore
@@ -85,7 +83,6 @@ module Cassandra
85
83
 
86
84
  connecting_hosts[host] = pool_size
87
85
  @pending_connections[host] = 0
88
- @prepared_statements[host] = {}
89
86
  @preparing_statements[host] = {}
90
87
  @connections[host] = ConnectionPool.new
91
88
  end
@@ -168,7 +165,7 @@ module Cassandra
168
165
  pool_size = 0
169
166
 
170
167
  synchronize do
171
- distance = @load_balancing_policy.distance(host)
168
+ distance = @profile_manager.distance(host)
172
169
  case distance
173
170
  when :ignore
174
171
  return Ione::Future.resolved
@@ -184,7 +181,6 @@ module Cassandra
184
181
  end
185
182
 
186
183
  @pending_connections[host] ||= 0
187
- @prepared_statements[host] = {}
188
184
  @preparing_statements[host] = {}
189
185
  @connections[host] = ConnectionPool.new
190
186
  end
@@ -199,7 +195,6 @@ module Cassandra
199
195
  return Ione::Future.resolved unless @connections.key?(host)
200
196
 
201
197
  @pending_connections.delete(host) unless @pending_connections[host] > 0
202
- @prepared_statements.delete(host)
203
198
  @preparing_statements.delete(host)
204
199
  pool = @connections.delete(host)
205
200
  end
@@ -227,7 +222,9 @@ module Cassandra
227
222
  return @futures.error(
228
223
  Errors::ClientError.new(
229
224
  'Positional arguments are not supported by the current version of ' \
230
- 'Apache Cassandra'))
225
+ 'Apache Cassandra'
226
+ )
227
+ )
231
228
  end
232
229
 
233
230
  timestamp = @timestamp_generator.next if @timestamp_generator && @connection_options.protocol_version > 2
@@ -248,7 +245,7 @@ module Cassandra
248
245
  promise = @futures.promise
249
246
 
250
247
  keyspace = @keyspace
251
- plan = @load_balancing_policy.plan(keyspace, statement, options)
248
+ plan = options.load_balancing_policy.plan(keyspace, statement, options)
252
249
 
253
250
  send_request_by_plan(promise,
254
251
  keyspace,
@@ -270,7 +267,7 @@ module Cassandra
270
267
 
271
268
  keyspace = @keyspace
272
269
  statement = VOID_STATEMENT
273
- plan = @load_balancing_policy.plan(keyspace, statement, options)
270
+ plan = options.load_balancing_policy.plan(keyspace, statement, options)
274
271
 
275
272
  send_request_by_plan(promise,
276
273
  keyspace,
@@ -303,7 +300,7 @@ module Cassandra
303
300
  promise = @futures.promise
304
301
 
305
302
  keyspace = @keyspace
306
- plan = @load_balancing_policy.plan(keyspace, statement, options)
303
+ plan = options.load_balancing_policy.plan(keyspace, statement, options)
307
304
 
308
305
  execute_by_plan(promise, keyspace, statement, options, request, plan, timeout)
309
306
 
@@ -315,7 +312,9 @@ module Cassandra
315
312
  return @futures.error(
316
313
  Errors::ClientError.new(
317
314
  'Batch statements are not supported by the current version of ' \
318
- 'Apache Cassandra'))
315
+ 'Apache Cassandra'
316
+ )
317
+ )
319
318
  end
320
319
 
321
320
  timestamp = @timestamp_generator.next if @timestamp_generator && @connection_options.protocol_version > 2
@@ -329,7 +328,7 @@ module Cassandra
329
328
  timestamp,
330
329
  payload)
331
330
  keyspace = @keyspace
332
- plan = @load_balancing_policy.plan(keyspace, statement, options)
331
+ plan = options.load_balancing_policy.plan(keyspace, statement, options)
333
332
  promise = @futures.promise
334
333
 
335
334
  batch_by_plan(promise, keyspace, statement, options, request, plan, timeout)
@@ -366,13 +365,15 @@ module Cassandra
366
365
  'SELECT peer, rpc_address, schema_version FROM system.peers',
367
366
  EMPTY_LIST,
368
367
  EMPTY_LIST,
369
- :one)
368
+ :one
369
+ )
370
370
  SELECT_SCHEMA_LOCAL =
371
371
  Protocol::QueryRequest.new(
372
372
  "SELECT schema_version FROM system.local WHERE key='local'",
373
373
  EMPTY_LIST,
374
374
  EMPTY_LIST,
375
- :one)
375
+ :one
376
+ )
376
377
 
377
378
  def connected(f)
378
379
  if f.resolved?
@@ -472,7 +473,7 @@ module Cassandra
472
473
  @pending_connections[host] += size
473
474
  end
474
475
 
475
- @logger.debug("Creating #{size} connections to #{host.ip}")
476
+ @logger.debug("Creating #{size} request connections to #{host.ip}")
476
477
  futures = size.times.map do
477
478
  @connector.connect(host).recover do |e|
478
479
  FailedConnection.new(e, host)
@@ -491,7 +492,7 @@ module Cassandra
491
492
  end
492
493
  end
493
494
 
494
- @logger.debug("Created #{connections.size} connections to #{host.ip}")
495
+ @logger.debug("Created #{connections.size} request connections to #{host.ip}")
495
496
 
496
497
  pool = nil
497
498
 
@@ -510,6 +511,12 @@ module Cassandra
510
511
 
511
512
  connections.each do |connection|
512
513
  connection.on_closed do |cause|
514
+ if cause
515
+ @logger.info('Request connection closed ' \
516
+ "(#{cause.class.name}: #{cause.message})")
517
+ else
518
+ @logger.info('Request connection closed')
519
+ end
513
520
  connect_to_host_maybe_retry(host, pool_size) if cause
514
521
  end
515
522
  end
@@ -533,13 +540,16 @@ module Cassandra
533
540
  plan,
534
541
  timeout,
535
542
  errors = nil,
536
- hosts = [])
543
+ hosts = [],
544
+ retries = -1)
537
545
  unless plan.has_next?
538
546
  promise.break(Errors::NoHostsAvailable.new(errors))
539
547
  return
540
548
  end
541
549
 
542
550
  hosts << host = plan.next
551
+ retries += 1
552
+
543
553
  pool = nil
544
554
  synchronize { pool = @connections[host] }
545
555
 
@@ -554,7 +564,8 @@ module Cassandra
554
564
  plan,
555
565
  timeout,
556
566
  errors,
557
- hosts)
567
+ hosts,
568
+ retries)
558
569
  end
559
570
 
560
571
  connection = pool.random_connection
@@ -573,7 +584,8 @@ module Cassandra
573
584
  plan,
574
585
  timeout,
575
586
  errors,
576
- hosts)
587
+ hosts,
588
+ retries)
577
589
  else
578
590
  s.on_failure do |e|
579
591
  if e.is_a?(Errors::HostError) ||
@@ -588,7 +600,8 @@ module Cassandra
588
600
  plan,
589
601
  timeout,
590
602
  errors,
591
- hosts)
603
+ hosts,
604
+ retries)
592
605
  else
593
606
  promise.break(e)
594
607
  end
@@ -606,7 +619,8 @@ module Cassandra
606
619
  plan,
607
620
  timeout,
608
621
  errors,
609
- hosts)
622
+ hosts,
623
+ retries)
610
624
  end
611
625
  rescue => e
612
626
  errors ||= {}
@@ -619,7 +633,8 @@ module Cassandra
619
633
  plan,
620
634
  timeout,
621
635
  errors,
622
- hosts)
636
+ hosts,
637
+ retries)
623
638
  end
624
639
 
625
640
  def prepare_and_send_request_by_plan(host,
@@ -632,17 +647,16 @@ module Cassandra
632
647
  plan,
633
648
  timeout,
634
649
  errors,
635
- hosts)
650
+ hosts,
651
+ retries)
636
652
  cql = statement.cql
637
- id = nil
638
- host_is_up = true
639
- synchronize do
640
- if @prepared_statements[host].nil?
641
- host_is_up = false
642
- else
643
- id = @prepared_statements[host][cql]
644
- end
645
- end
653
+
654
+ # Get the prepared statement id for this statement from our cache if possible. We are optimistic
655
+ # that the statement has previously been prepared on all hosts, so the id will be valid. However, if
656
+ # we're in the midst of preparing the statement on the given host, we know that executing with the id
657
+ # will fail. So, act like we don't have the prepared-statement id in that case.
658
+
659
+ id = synchronize { @preparing_statements[host][cql] ? nil : @prepared_statements[cql] }
646
660
 
647
661
  if id
648
662
  request.id = id
@@ -656,20 +670,8 @@ module Cassandra
656
670
  plan,
657
671
  timeout,
658
672
  errors,
659
- hosts)
660
- elsif !host_is_up
661
- # We've hit a race condition where the plan says we can query this host, but the host has gone
662
- # down in the mean time. Just execute the plan again on the next host.
663
- @logger.debug("#{host} is down; executing plan on next host")
664
- execute_by_plan(promise,
665
- keyspace,
666
- statement,
667
- options,
668
- request,
669
- plan,
670
- timeout,
671
- errors,
672
- hosts)
673
+ hosts,
674
+ retries)
673
675
  else
674
676
  prepare = prepare_statement(host, connection, cql, timeout)
675
677
  prepare.on_complete do |_|
@@ -685,7 +687,8 @@ module Cassandra
685
687
  plan,
686
688
  timeout,
687
689
  errors,
688
- hosts)
690
+ hosts,
691
+ retries)
689
692
  else
690
693
  prepare.on_failure do |e|
691
694
  if e.is_a?(Errors::HostError) ||
@@ -700,7 +703,8 @@ module Cassandra
700
703
  plan,
701
704
  timeout,
702
705
  errors,
703
- hosts)
706
+ hosts,
707
+ retries)
704
708
  else
705
709
  promise.break(e)
706
710
  end
@@ -720,13 +724,15 @@ module Cassandra
720
724
  plan,
721
725
  timeout,
722
726
  errors = nil,
723
- hosts = [])
727
+ hosts = [],
728
+ retries = -1)
724
729
  unless plan.has_next?
725
730
  promise.break(Errors::NoHostsAvailable.new(errors))
726
731
  return
727
732
  end
728
733
 
729
734
  hosts << host = plan.next
735
+ retries += 1
730
736
  pool = nil
731
737
  synchronize { pool = @connections[host] }
732
738
 
@@ -741,7 +747,8 @@ module Cassandra
741
747
  plan,
742
748
  timeout,
743
749
  errors,
744
- hosts)
750
+ hosts,
751
+ retries)
745
752
  end
746
753
 
747
754
  connection = pool.random_connection
@@ -760,7 +767,8 @@ module Cassandra
760
767
  plan,
761
768
  timeout,
762
769
  errors,
763
- hosts)
770
+ hosts,
771
+ retries)
764
772
  else
765
773
  s.on_failure do |e|
766
774
  if e.is_a?(Errors::HostError) ||
@@ -775,7 +783,8 @@ module Cassandra
775
783
  plan,
776
784
  timeout,
777
785
  errors,
778
- hosts)
786
+ hosts,
787
+ retries)
779
788
  else
780
789
  promise.break(e)
781
790
  end
@@ -793,7 +802,8 @@ module Cassandra
793
802
  plan,
794
803
  timeout,
795
804
  errors,
796
- hosts)
805
+ hosts,
806
+ retries)
797
807
  end
798
808
  rescue => e
799
809
  errors ||= {}
@@ -806,7 +816,8 @@ module Cassandra
806
816
  plan,
807
817
  timeout,
808
818
  errors,
809
- hosts)
819
+ hosts,
820
+ retries)
810
821
  end
811
822
 
812
823
  def batch_and_send_request_by_plan(host,
@@ -819,7 +830,8 @@ module Cassandra
819
830
  plan,
820
831
  timeout,
821
832
  errors,
822
- hosts)
833
+ hosts,
834
+ retries)
823
835
  request.clear
824
836
  unprepared = Hash.new {|hash, cql| hash[cql] = []}
825
837
 
@@ -827,29 +839,15 @@ module Cassandra
827
839
  cql = statement.cql
828
840
 
829
841
  if statement.is_a?(Statements::Bound)
830
- host_is_up = true
831
- id = nil
832
- synchronize do
833
- if @prepared_statements[host].nil?
834
- host_is_up = false
835
- else
836
- id = @prepared_statements[host][cql]
837
- end
838
- end
842
+ # Get the prepared statement id for this statement from our cache if possible. We are optimistic
843
+ # that the statement has previously been prepared on all hosts, so the id will be valid. However, if
844
+ # we're in the midst of preparing the statement on the given host, we know that executing with the id
845
+ # will fail. So, act like we don't have the prepared-statement id in that case.
846
+
847
+ id = synchronize { @preparing_statements[host][cql] ? nil : @prepared_statements[cql] }
839
848
 
840
849
  if id
841
850
  request.add_prepared(id, statement.params, statement.params_types)
842
- elsif !host_is_up
843
- @logger.debug("#{host} is down; executing on next host in plan")
844
- return batch_by_plan(promise,
845
- keyspace,
846
- batch_statement,
847
- options,
848
- request,
849
- plan,
850
- timeout,
851
- errors,
852
- hosts)
853
851
  else
854
852
  unprepared[cql] << statement
855
853
  end
@@ -869,7 +867,8 @@ module Cassandra
869
867
  plan,
870
868
  timeout,
871
869
  errors,
872
- hosts)
870
+ hosts,
871
+ retries)
873
872
  else
874
873
  to_prepare = unprepared.to_a
875
874
  futures = to_prepare.map do |cql, _|
@@ -897,7 +896,8 @@ module Cassandra
897
896
  plan,
898
897
  timeout,
899
898
  errors,
900
- hosts)
899
+ hosts,
900
+ retries)
901
901
  else
902
902
  f.on_failure do |e|
903
903
  if e.is_a?(Errors::HostError) ||
@@ -912,7 +912,8 @@ module Cassandra
912
912
  plan,
913
913
  timeout,
914
914
  errors,
915
- hosts)
915
+ hosts,
916
+ retries)
916
917
  else
917
918
  promise.break(e)
918
919
  end
@@ -930,13 +931,15 @@ module Cassandra
930
931
  plan,
931
932
  timeout,
932
933
  errors = nil,
933
- hosts = [])
934
+ hosts = [],
935
+ retries = -1)
934
936
  unless plan.has_next?
935
937
  promise.break(Errors::NoHostsAvailable.new(errors))
936
938
  return
937
939
  end
938
940
 
939
941
  hosts << host = plan.next
942
+ retries += 1
940
943
  pool = nil
941
944
  synchronize { pool = @connections[host] }
942
945
 
@@ -951,7 +954,8 @@ module Cassandra
951
954
  plan,
952
955
  timeout,
953
956
  errors,
954
- hosts)
957
+ hosts,
958
+ retries)
955
959
  end
956
960
 
957
961
  connection = pool.random_connection
@@ -970,7 +974,8 @@ module Cassandra
970
974
  plan,
971
975
  timeout,
972
976
  errors,
973
- hosts)
977
+ hosts,
978
+ retries)
974
979
  else
975
980
  s.on_failure do |e|
976
981
  if e.is_a?(Errors::HostError) ||
@@ -985,7 +990,8 @@ module Cassandra
985
990
  plan,
986
991
  timeout,
987
992
  errors,
988
- hosts)
993
+ hosts,
994
+ retries)
989
995
  else
990
996
  promise.break(e)
991
997
  end
@@ -1003,7 +1009,8 @@ module Cassandra
1003
1009
  plan,
1004
1010
  timeout,
1005
1011
  errors,
1006
- hosts)
1012
+ hosts,
1013
+ retries)
1007
1014
  end
1008
1015
  rescue => e
1009
1016
  errors ||= {}
@@ -1016,7 +1023,8 @@ module Cassandra
1016
1023
  plan,
1017
1024
  timeout,
1018
1025
  errors,
1019
- hosts)
1026
+ hosts,
1027
+ retries)
1020
1028
  end
1021
1029
 
1022
1030
  def do_send_request_by_plan(host,
@@ -1030,7 +1038,7 @@ module Cassandra
1030
1038
  timeout,
1031
1039
  errors,
1032
1040
  hosts,
1033
- retries = 0)
1041
+ retries)
1034
1042
  request.retries = retries
1035
1043
 
1036
1044
  f = connection.send_request(request, timeout)
@@ -1075,37 +1083,43 @@ module Cassandra
1075
1083
 
1076
1084
  case r
1077
1085
  when Protocol::UnavailableErrorResponse
1078
- decision = @retry_policy.unavailable(statement,
1079
- r.consistency,
1080
- r.required,
1081
- r.alive,
1082
- retries)
1086
+ decision = options.retry_policy.unavailable(statement,
1087
+ r.consistency,
1088
+ r.required,
1089
+ r.alive,
1090
+ retries)
1083
1091
  when Protocol::WriteTimeoutErrorResponse
1084
- decision = @retry_policy.write_timeout(statement,
1085
- r.consistency,
1086
- r.write_type,
1087
- r.blockfor,
1088
- r.received,
1089
- retries)
1092
+ decision = options.retry_policy.write_timeout(statement,
1093
+ r.consistency,
1094
+ r.write_type,
1095
+ r.blockfor,
1096
+ r.received,
1097
+ retries)
1090
1098
  when Protocol::ReadTimeoutErrorResponse
1091
- decision = @retry_policy.read_timeout(statement,
1092
- r.consistency,
1093
- r.blockfor,
1094
- r.received,
1095
- r.data_present,
1096
- retries)
1099
+ decision = options.retry_policy.read_timeout(statement,
1100
+ r.consistency,
1101
+ r.blockfor,
1102
+ r.received,
1103
+ r.data_present,
1104
+ retries)
1097
1105
  when Protocol::UnpreparedErrorResponse
1098
- cql = statement.cql
1099
-
1100
- synchronize do
1101
- @preparing_statements[host].delete(cql)
1102
- @prepared_statements[host].delete(cql)
1106
+ cql = nil
1107
+ if statement.is_a?(Cassandra::Statements::Batch)
1108
+ # Find the prepared statement with the prepared-statement-id reported by the node.
1109
+ unprepared_child = statement.statements.select do |s|
1110
+ (s.is_a?(Cassandra::Statements::Prepared) || s.is_a?(Cassandra::Statements::Bound)) && s.id == r.id
1111
+ end.first
1112
+ cql = unprepared_child ? unprepared_child.cql : nil
1113
+ else
1114
+ # This is a normal statement, so we have everything we need.
1115
+ cql = statement.cql
1116
+ synchronize { @preparing_statements[host].delete(cql) }
1103
1117
  end
1104
1118
 
1105
1119
  prepare = prepare_statement(host, connection, cql, timeout)
1106
1120
  prepare.on_complete do |_|
1107
1121
  if prepare.resolved?
1108
- request.id = prepare.value
1122
+ request.id = prepare.value unless request.is_a?(Cassandra::Protocol::BatchRequest)
1109
1123
  do_send_request_by_plan(host,
1110
1124
  connection,
1111
1125
  promise,
@@ -1116,7 +1130,8 @@ module Cassandra
1116
1130
  plan,
1117
1131
  timeout,
1118
1132
  errors,
1119
- hosts)
1133
+ hosts,
1134
+ retries)
1120
1135
  else
1121
1136
  prepare.on_failure do |e|
1122
1137
  if e.is_a?(Errors::HostError) ||
@@ -1130,7 +1145,8 @@ module Cassandra
1130
1145
  plan,
1131
1146
  timeout,
1132
1147
  errors,
1133
- hosts)
1148
+ hosts,
1149
+ retries)
1134
1150
  else
1135
1151
  promise.break(e)
1136
1152
  end
@@ -1159,7 +1175,8 @@ module Cassandra
1159
1175
  plan,
1160
1176
  timeout,
1161
1177
  errors,
1162
- hosts)
1178
+ hosts,
1179
+ retries)
1163
1180
  when Protocol::ExecuteRequest
1164
1181
  execute_by_plan(promise,
1165
1182
  keyspace,
@@ -1169,7 +1186,8 @@ module Cassandra
1169
1186
  plan,
1170
1187
  timeout,
1171
1188
  errors,
1172
- hosts)
1189
+ hosts,
1190
+ retries)
1173
1191
  when Protocol::BatchRequest
1174
1192
  batch_by_plan(promise,
1175
1193
  keyspace,
@@ -1179,7 +1197,8 @@ module Cassandra
1179
1197
  plan,
1180
1198
  timeout,
1181
1199
  errors,
1182
- hosts)
1200
+ hosts,
1201
+ retries)
1183
1202
  end
1184
1203
  else
1185
1204
  promise.break(error)
@@ -1200,7 +1219,7 @@ module Cassandra
1200
1219
  when Protocol::PreparedResultResponse
1201
1220
  cql = request.cql
1202
1221
  synchronize do
1203
- @prepared_statements[host][cql] = r.id
1222
+ @prepared_statements[cql] = r.id
1204
1223
  @preparing_statements[host].delete(cql)
1205
1224
  end
1206
1225
 
@@ -1209,7 +1228,8 @@ module Cassandra
1209
1228
  pk_idx ||= @schema.get_pk_idx(metadata)
1210
1229
 
1211
1230
  promise.fulfill(
1212
- Statements::Prepared.new(r.custom_payload,
1231
+ Statements::Prepared.new(r.id,
1232
+ r.custom_payload,
1213
1233
  r.warnings,
1214
1234
  cql,
1215
1235
  metadata,
@@ -1223,7 +1243,8 @@ module Cassandra
1223
1243
  request.consistency,
1224
1244
  retries,
1225
1245
  self,
1226
- @connection_options))
1246
+ @connection_options)
1247
+ )
1227
1248
  when Protocol::RawRowsResultResponse
1228
1249
  r.materialize(statement.result_metadata)
1229
1250
  promise.fulfill(
@@ -1239,7 +1260,8 @@ module Cassandra
1239
1260
  request.consistency,
1240
1261
  retries,
1241
1262
  self,
1242
- @futures))
1263
+ @futures)
1264
+ )
1243
1265
  when Protocol::RowsResultResponse
1244
1266
  promise.fulfill(
1245
1267
  Results::Paged.new(r.custom_payload,
@@ -1254,7 +1276,8 @@ module Cassandra
1254
1276
  request.consistency,
1255
1277
  retries,
1256
1278
  self,
1257
- @futures))
1279
+ @futures)
1280
+ )
1258
1281
  when Protocol::SchemaChangeResultResponse
1259
1282
  if r.change == 'DROPPED' &&
1260
1283
  r.target == Protocol::Constants::SCHEMA_CHANGE_TARGET_KEYSPACE
@@ -1267,7 +1290,8 @@ module Cassandra
1267
1290
  unless f.resolved?
1268
1291
  f.on_failure do |e|
1269
1292
  @logger.error(
1270
- "Schema agreement failure (#{e.class.name}: #{e.message})")
1293
+ "Schema agreement failure (#{e.class.name}: #{e.message})"
1294
+ )
1271
1295
  end
1272
1296
  end
1273
1297
  promise.fulfill(
@@ -1281,7 +1305,8 @@ module Cassandra
1281
1305
  request.consistency,
1282
1306
  retries,
1283
1307
  self,
1284
- @futures))
1308
+ @futures)
1309
+ )
1285
1310
  end
1286
1311
  else
1287
1312
  promise.fulfill(Results::Void.new(r.custom_payload,
@@ -1330,7 +1355,8 @@ module Cassandra
1330
1355
  plan,
1331
1356
  timeout,
1332
1357
  errors,
1333
- hosts)
1358
+ hosts,
1359
+ retries)
1334
1360
  when Protocol::ExecuteRequest
1335
1361
  execute_by_plan(promise,
1336
1362
  keyspace,
@@ -1340,7 +1366,8 @@ module Cassandra
1340
1366
  plan,
1341
1367
  timeout,
1342
1368
  errors,
1343
- hosts)
1369
+ hosts,
1370
+ retries)
1344
1371
  when Protocol::BatchRequest
1345
1372
  batch_by_plan(promise,
1346
1373
  keyspace,
@@ -1350,7 +1377,8 @@ module Cassandra
1350
1377
  plan,
1351
1378
  timeout,
1352
1379
  errors,
1353
- hosts)
1380
+ hosts,
1381
+ retries)
1354
1382
  else
1355
1383
  promise.break(e)
1356
1384
  end
@@ -1366,7 +1394,8 @@ module Cassandra
1366
1394
  request.consistency,
1367
1395
  retries,
1368
1396
  self,
1369
- @futures))
1397
+ @futures)
1398
+ )
1370
1399
  when Retry::Decisions::Reraise
1371
1400
  promise.break(
1372
1401
  r.to_error(keyspace,
@@ -1374,7 +1403,8 @@ module Cassandra
1374
1403
  options,
1375
1404
  hosts,
1376
1405
  request.consistency,
1377
- retries))
1406
+ retries)
1407
+ )
1378
1408
  else
1379
1409
  promise.break(
1380
1410
  r.to_error(keyspace,
@@ -1382,7 +1412,8 @@ module Cassandra
1382
1412
  options,
1383
1413
  hosts,
1384
1414
  request.consistency,
1385
- retries))
1415
+ retries)
1416
+ )
1386
1417
  end
1387
1418
  end
1388
1419
  rescue => e
@@ -1391,32 +1422,23 @@ module Cassandra
1391
1422
  else
1392
1423
  response_future.on_failure do |ex|
1393
1424
  if ex.is_a?(Errors::HostError) ||
1394
- (ex.is_a?(Errors::TimeoutError) && statement.idempotent?)
1425
+ (ex.is_a?(Errors::TimeoutError) && statement.idempotent?)
1395
1426
 
1396
1427
  errors[host] = ex
1397
1428
  case request
1398
- when Protocol::QueryRequest, Protocol::PrepareRequest
1399
- send_request_by_plan(promise,
1400
- keyspace,
1401
- statement,
1402
- options,
1403
- request,
1404
- plan,
1405
- timeout,
1406
- errors,
1407
- hosts)
1408
- when Protocol::ExecuteRequest
1409
- execute_by_plan(promise,
1410
- keyspace,
1411
- statement,
1412
- options,
1413
- request,
1414
- plan,
1415
- timeout,
1416
- errors,
1417
- hosts)
1418
- when Protocol::BatchRequest
1419
- batch_by_plan(promise,
1429
+ when Protocol::QueryRequest, Protocol::PrepareRequest
1430
+ send_request_by_plan(promise,
1431
+ keyspace,
1432
+ statement,
1433
+ options,
1434
+ request,
1435
+ plan,
1436
+ timeout,
1437
+ errors,
1438
+ hosts,
1439
+ retries)
1440
+ when Protocol::ExecuteRequest
1441
+ execute_by_plan(promise,
1420
1442
  keyspace,
1421
1443
  statement,
1422
1444
  options,
@@ -1424,9 +1446,21 @@ module Cassandra
1424
1446
  plan,
1425
1447
  timeout,
1426
1448
  errors,
1427
- hosts)
1428
- else
1429
- promise.break(ex)
1449
+ hosts,
1450
+ retries)
1451
+ when Protocol::BatchRequest
1452
+ batch_by_plan(promise,
1453
+ keyspace,
1454
+ statement,
1455
+ options,
1456
+ request,
1457
+ plan,
1458
+ timeout,
1459
+ errors,
1460
+ hosts,
1461
+ retries)
1462
+ else
1463
+ promise.break(ex)
1430
1464
  end
1431
1465
  else
1432
1466
  promise.break(ex)
@@ -1445,7 +1479,7 @@ module Cassandra
1445
1479
  unless local.empty?
1446
1480
  host = @registry.host(connection.host)
1447
1481
 
1448
- if host && @load_balancing_policy.distance(host) != :ignore
1482
+ if host && @profile_manager.distance(host) != :ignore
1449
1483
  versions << version = local.first['schema_version']
1450
1484
  @logger.debug("Host #{host.ip} schema version is #{version}")
1451
1485
  end
@@ -1453,7 +1487,7 @@ module Cassandra
1453
1487
 
1454
1488
  peers.each do |row|
1455
1489
  host = @registry.host(peer_ip(row))
1456
- next unless host && @load_balancing_policy.distance(host) != :ignore
1490
+ next unless host && @profile_manager.distance(host) != :ignore
1457
1491
 
1458
1492
  versions << version = row['schema_version']
1459
1493
  @logger.debug("Host #{host.ip} schema version is #{version}")
@@ -1533,7 +1567,7 @@ module Cassandra
1533
1567
  when Protocol::PreparedResultResponse
1534
1568
  id = r.id
1535
1569
  synchronize do
1536
- @prepared_statements[host][cql] = id
1570
+ @prepared_statements[cql] = id
1537
1571
  @preparing_statements[host].delete(cql)
1538
1572
  end
1539
1573
  id