aerospike 2.12.0 → 2.13.0

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 (89) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/lib/aerospike.rb +3 -4
  4. data/lib/aerospike/aerospike_exception.rb +7 -1
  5. data/lib/aerospike/atomic/atomic.rb +1 -1
  6. data/lib/aerospike/bin.rb +1 -1
  7. data/lib/aerospike/cdt/list_operation.rb +1 -1
  8. data/lib/aerospike/cdt/map_operation.rb +1 -1
  9. data/lib/aerospike/cdt/map_order.rb +1 -1
  10. data/lib/aerospike/cdt/map_policy.rb +1 -1
  11. data/lib/aerospike/cdt/map_return_type.rb +1 -1
  12. data/lib/aerospike/cdt/map_write_mode.rb +1 -1
  13. data/lib/aerospike/client.rb +9 -9
  14. data/lib/aerospike/cluster.rb +92 -17
  15. data/lib/aerospike/cluster/partition.rb +1 -1
  16. data/lib/aerospike/cluster/partition_parser.rb +169 -0
  17. data/lib/aerospike/command/admin_command.rb +1 -1
  18. data/lib/aerospike/command/batch_direct_command.rb +1 -1
  19. data/lib/aerospike/command/batch_direct_exists_command.rb +1 -1
  20. data/lib/aerospike/command/batch_direct_node.rb +3 -3
  21. data/lib/aerospike/command/batch_index_node.rb +2 -2
  22. data/lib/aerospike/command/batch_item.rb +1 -1
  23. data/lib/aerospike/command/command.rb +21 -4
  24. data/lib/aerospike/command/delete_command.rb +5 -1
  25. data/lib/aerospike/command/execute_command.rb +1 -1
  26. data/lib/aerospike/command/exists_command.rb +5 -1
  27. data/lib/aerospike/command/field_type.rb +2 -1
  28. data/lib/aerospike/command/multi_command.rb +5 -1
  29. data/lib/aerospike/command/operate_command.rb +6 -1
  30. data/lib/aerospike/command/read_command.rb +5 -1
  31. data/lib/aerospike/command/read_header_command.rb +5 -1
  32. data/lib/aerospike/command/roles.rb +1 -1
  33. data/lib/aerospike/command/single_command.rb +9 -3
  34. data/lib/aerospike/command/touch_command.rb +5 -1
  35. data/lib/aerospike/command/unsupported_particle_type_validator.rb +1 -1
  36. data/lib/aerospike/command/write_command.rb +5 -1
  37. data/lib/aerospike/connection/create.rb +1 -1
  38. data/lib/aerospike/features.rb +1 -1
  39. data/lib/aerospike/geo_json.rb +1 -1
  40. data/lib/aerospike/host.rb +1 -1
  41. data/lib/aerospike/info.rb +1 -1
  42. data/lib/aerospike/key.rb +1 -1
  43. data/lib/aerospike/language.rb +1 -1
  44. data/lib/aerospike/node.rb +3 -6
  45. data/lib/aerospike/node/refresh/partitions.rb +6 -15
  46. data/lib/aerospike/node_validator.rb +4 -19
  47. data/lib/aerospike/operation.rb +1 -1
  48. data/lib/aerospike/policy/admin_policy.rb +1 -1
  49. data/lib/aerospike/policy/batch_policy.rb +1 -1
  50. data/lib/aerospike/policy/client_policy.rb +1 -1
  51. data/lib/aerospike/policy/commit_level.rb +1 -1
  52. data/lib/aerospike/policy/consistency_level.rb +1 -1
  53. data/lib/aerospike/policy/generation_policy.rb +1 -1
  54. data/lib/aerospike/policy/operate_policy.rb +1 -1
  55. data/lib/aerospike/policy/policy.rb +12 -3
  56. data/lib/aerospike/policy/priority.rb +1 -1
  57. data/lib/aerospike/policy/query_policy.rb +8 -1
  58. data/lib/aerospike/policy/record_bin_multiplicity.rb +1 -1
  59. data/lib/aerospike/policy/record_exists_action.rb +1 -1
  60. data/lib/aerospike/policy/replica.rb +38 -0
  61. data/lib/aerospike/policy/scan_policy.rb +8 -1
  62. data/lib/aerospike/policy/write_policy.rb +1 -1
  63. data/lib/aerospike/query/filter.rb +1 -1
  64. data/lib/aerospike/query/query_command.rb +10 -1
  65. data/lib/aerospike/query/recordset.rb +1 -1
  66. data/lib/aerospike/query/scan_command.rb +1 -1
  67. data/lib/aerospike/query/statement.rb +1 -1
  68. data/lib/aerospike/query/stream_command.rb +1 -1
  69. data/lib/aerospike/record.rb +1 -1
  70. data/lib/aerospike/result_code.rb +1 -1
  71. data/lib/aerospike/socket/base.rb +1 -1
  72. data/lib/aerospike/task/execute_task.rb +1 -1
  73. data/lib/aerospike/task/index_task.rb +1 -1
  74. data/lib/aerospike/task/task.rb +1 -1
  75. data/lib/aerospike/task/udf_register_task.rb +1 -1
  76. data/lib/aerospike/task/udf_remove_task.rb +1 -1
  77. data/lib/aerospike/ttl.rb +1 -1
  78. data/lib/aerospike/udf.rb +1 -1
  79. data/lib/aerospike/user_role.rb +1 -1
  80. data/lib/aerospike/utils/buffer.rb +1 -1
  81. data/lib/aerospike/utils/packer.rb +1 -1
  82. data/lib/aerospike/utils/pool.rb +1 -1
  83. data/lib/aerospike/utils/unpacker.rb +1 -1
  84. data/lib/aerospike/value/particle_type.rb +1 -1
  85. data/lib/aerospike/value/value.rb +1 -1
  86. data/lib/aerospike/version.rb +1 -1
  87. metadata +6 -6
  88. data/lib/aerospike/cluster/partition_tokenizer_new.rb +0 -130
  89. data/lib/aerospike/cluster/partition_tokenizer_old.rb +0 -135
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2017 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -1,4 +1,4 @@
1
- # Copyright 2014-2018 Aerospike, Inc.
1
+ # Copyright 2014-2020 Aerospike, Inc.
2
2
  #
3
3
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
4
4
  # license agreements.
@@ -1,4 +1,4 @@
1
- # Copyright 2014-2018 Aerospike, Inc.
1
+ # Copyright 2014-2020 Aerospike, Inc.
2
2
  #
3
3
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
4
4
  # license agreements.
@@ -1,4 +1,4 @@
1
- # Copyright 2014-2018 Aerospike, Inc.
1
+ # Copyright 2014-2020 Aerospike, Inc.
2
2
  #
3
3
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
4
4
  # license agreements.
@@ -24,8 +24,8 @@ module Aerospike
24
24
  attr_accessor :node
25
25
  attr_accessor :batch_namespaces
26
26
 
27
- def self.generate_list(cluster, keys)
28
- keys.group_by { |key| cluster.get_node_for_key(key) }
27
+ def self.generate_list(cluster, replica_policy, keys)
28
+ keys.group_by { |key| cluster.get_node_for_key(replica_policy, key) }
29
29
  .map { |node, keys_for_node| BatchDirectNode.new(node, keys_for_node) }
30
30
  end
31
31
 
@@ -22,9 +22,9 @@ module Aerospike
22
22
  attr_accessor :node
23
23
  attr_accessor :keys_by_idx
24
24
 
25
- def self.generate_list(cluster, keys)
25
+ def self.generate_list(cluster, replica_policy, keys)
26
26
  keys.each_with_index
27
- .group_by { |key, _| cluster.get_node_for_key(key) }
27
+ .group_by { |key, _| cluster.get_node_for_key(replica_policy, key) }
28
28
  .map { |node, keys_with_idx| BatchIndexNode.new(node, keys_with_idx) }
29
29
  end
30
30
 
@@ -1,4 +1,4 @@
1
- # Copyright 2014-2018 Aerospike, Inc.
1
+ # Copyright 2014-2020 Aerospike, Inc.
2
2
  #
3
3
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
4
4
  # license agreements.
@@ -1,4 +1,4 @@
1
- # Copyright 2014-2018 Aerospike, Inc.
1
+ # Copyright 2014-2020 Aerospike, Inc.
2
2
  #
3
3
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
4
4
  # license agreements.
@@ -77,12 +77,15 @@ module Aerospike
77
77
 
78
78
  class Command #:nodoc:
79
79
 
80
- def initialize(node)
80
+ def initialize(node=nil)
81
81
  @data_offset = 0
82
82
  @data_buffer = nil
83
83
 
84
84
  @node = node
85
85
 
86
+ # will add before use
87
+ @sequence = Atomic.new(-1)
88
+
86
89
  self
87
90
  end
88
91
 
@@ -324,6 +327,11 @@ module Aerospike
324
327
  field_count += 1
325
328
  end
326
329
 
330
+ if policy.records_per_second > 0
331
+ @data_offset += 4 + FIELD_HEADER_SIZE
332
+ field_count += 1
333
+ end
334
+
327
335
  predexp_size = estimate_predexp(policy.predexp)
328
336
  field_count += 1 if predexp_size > 0
329
337
 
@@ -363,6 +371,10 @@ module Aerospike
363
371
  write_field_string(set_name, Aerospike::FieldType::TABLE)
364
372
  end
365
373
 
374
+ if policy.records_per_second > 0
375
+ write_field_int(policy.records_per_second, Aerospike::FieldType::RECORDS_PER_SECOND)
376
+ end
377
+
366
378
  write_predexp(policy.predexp, predexp_size)
367
379
 
368
380
  write_field_header(2, Aerospike::FieldType::SCAN_OPTIONS)
@@ -410,6 +422,7 @@ module Aerospike
410
422
  break if @policy.timeout > 0 && Time.now > limit
411
423
 
412
424
  begin
425
+ @node = get_node
413
426
  @conn = @node.get_connection(@policy.timeout)
414
427
  rescue => e
415
428
  # Socket connection error has occurred. Decrease health and retry.
@@ -746,15 +759,19 @@ module Aerospike
746
759
  @data_offset += len
747
760
  end
748
761
 
762
+ def write_field_int(i, ftype)
763
+ @data_buffer.write_int32(i, @data_offset+FIELD_HEADER_SIZE)
764
+ write_field_header(4, ftype)
765
+ @data_offset += 4
766
+ end
767
+
749
768
  def write_field_bytes(bytes, ftype)
750
769
  @data_buffer.write_binary(bytes, @data_offset+FIELD_HEADER_SIZE)
751
-
752
770
  write_field_header(bytes.bytesize, ftype)
753
771
  @data_offset += bytes.bytesize
754
772
  end
755
773
 
756
774
  def write_field_header(size, ftype)
757
- # Buffer.Int32ToBytes(size+1), @data_buffer, @data_offset
758
775
  @data_buffer.write_int32(size+1, @data_offset)
759
776
  @data_offset += 4
760
777
  @data_buffer.write_byte(ftype, @data_offset)
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2017 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -33,6 +33,10 @@ module Aerospike
33
33
  self
34
34
  end
35
35
 
36
+ def get_node
37
+ @cluster.master_node(@partition)
38
+ end
39
+
36
40
  def write_buffer
37
41
  set_delete(@policy, @key)
38
42
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2017 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2017 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -33,6 +33,10 @@ module Aerospike
33
33
  self
34
34
  end
35
35
 
36
+ def get_node
37
+ @cluster.read_node(@partition, @policy.replica, @sequence)
38
+ end
39
+
36
40
  def write_buffer
37
41
  set_exists(@policy, @key)
38
42
  end
@@ -1,4 +1,4 @@
1
- # Copyright 2014-2018 Aerospike, Inc.
1
+ # Copyright 2014-2020 Aerospike, Inc.
2
2
  #
3
3
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
4
4
  # license agreements.
@@ -31,6 +31,7 @@ module Aerospike
31
31
  TRAN_ID = 7 # user supplied transaction id, which is simply passed back
32
32
  SCAN_OPTIONS = 8
33
33
  SCAN_TIMEOUT = 9
34
+ RECORDS_PER_SECOND = 10
34
35
  INDEX_NAME = 21
35
36
  INDEX_RANGE = 22
36
37
  INDEX_FILTER = 23
@@ -1,4 +1,4 @@
1
- # Copyright 2014-2018 Aerospike, Inc.
1
+ # Copyright 2014-2020 Aerospike, Inc.
2
2
  #
3
3
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
4
4
  # license agreements.
@@ -32,6 +32,10 @@ module Aerospike
32
32
  self
33
33
  end
34
34
 
35
+ def get_node
36
+ @node
37
+ end
38
+
35
39
  def parse_result
36
40
  # Read socket into receive buffer one record at a time. Do not read entire receive size
37
41
  # because the receive buffer would be too big.
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2017 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -28,6 +28,11 @@ module Aerospike
28
28
  @operations = operations
29
29
  end
30
30
 
31
+ def get_node
32
+ @cluster.master_node(@partition)
33
+ end
34
+
35
+
31
36
  def write_bins
32
37
  @operations.select{|op| op.op_type == Aerospike::Operation::WRITE}.map(&:bin).compact
33
38
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2014-2017 Aerospike, Inc.
3
+ # Copyright 2014-2020 Aerospike, Inc.
4
4
  #
5
5
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
6
6
  # license agreements.
@@ -39,6 +39,10 @@ module Aerospike
39
39
  self
40
40
  end
41
41
 
42
+ def get_node
43
+ @cluster.read_node(@partition, @policy.replica, @sequence)
44
+ end
45
+
42
46
  def write_buffer
43
47
  set_read(@policy, @key, @bin_names)
44
48
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2017 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -33,6 +33,10 @@ module Aerospike
33
33
  self
34
34
  end
35
35
 
36
+ def get_node
37
+ @cluster.read_node(@partition, @policy.replica, @sequence)
38
+ end
39
+
36
40
  def write_buffer
37
41
  set_read_header(@policy, @key)
38
42
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2017 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -1,4 +1,4 @@
1
- # Copyright 2014-2018 Aerospike, Inc.
1
+ # Copyright 2014-2020 Aerospike, Inc.
2
2
  #
3
3
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
4
4
  # license agreements.
@@ -27,12 +27,18 @@ module Aerospike
27
27
  @cluster = cluster
28
28
  @key = key
29
29
 
30
- node = cluster.get_node_for_key(key)
31
- super(node)
30
+ @partition = Partition.new_by_key(key)
31
+
32
+ super()
32
33
  end
33
34
 
34
35
  protected
35
36
 
37
+ def get_node
38
+ # abstract method
39
+ raise Aerospike::Exceptions::InvalidNode
40
+ end
41
+
36
42
  def empty_socket
37
43
  # There should not be any more bytes.
38
44
  # Empty the socket to be safe.
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2017 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -30,6 +30,10 @@ module Aerospike
30
30
  self
31
31
  end
32
32
 
33
+ def get_node
34
+ @cluster.master_node(@partition)
35
+ end
36
+
33
37
  def write_buffer
34
38
  set_touch(@policy, @key)
35
39
  end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2015-2017 Aerospike, Inc.
2
+ # Copyright 2015-2020 Aerospike, Inc.
3
3
  #
4
4
  # Licensed under the Apache License, Version 2.0 (the "License")
5
5
  # you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2017 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -33,6 +33,10 @@ module Aerospike
33
33
  self
34
34
  end
35
35
 
36
+ def get_node
37
+ @cluster.master_node(@partition)
38
+ end
39
+
36
40
  def write_bins
37
41
  @bins
38
42
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2014-2018 Aerospike, Inc.
3
+ # Copyright 2014-2020 Aerospike, Inc.
4
4
  #
5
5
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
6
6
  # license agreements.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2014-2017 Aerospike, Inc.
3
+ # Copyright 2014-2020 Aerospike, Inc.
4
4
  #
5
5
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
6
6
  # license agreements.
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2015-2017 Aerospike, Inc.
2
+ # Copyright 2015-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2018 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2017 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2017 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
- # Copyright 2014-2017 Aerospike, Inc.
2
+ # Copyright 2014-2020 Aerospike, Inc.
3
3
  #
4
4
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
5
  # license agreements.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2014-2018 Aerospike, Inc.
3
+ # Copyright 2014-2020 Aerospike, Inc.
4
4
  #
5
5
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
6
6
  # license agreements.
@@ -33,7 +33,6 @@ module Aerospike
33
33
  @name = nv.name
34
34
  @aliases = Atomic.new(nv.aliases)
35
35
  @host = nv.host
36
- @use_new_info = Atomic.new(nv.use_new_info)
37
36
  @features = nv.features
38
37
  @cluster_name = nv.cluster_name
39
38
 
@@ -52,6 +51,8 @@ module Aerospike
52
51
  @active = Atomic.new(true)
53
52
  @failures = Atomic.new(0)
54
53
 
54
+ @replica_index = Atomic.new(0)
55
+
55
56
  @connections = ::Aerospike::ConnectionPool.new(cluster, host)
56
57
  end
57
58
 
@@ -178,10 +179,6 @@ module Aerospike
178
179
  end
179
180
  alias eql? ==
180
181
 
181
- def use_new_info?
182
- @use_new_info.value
183
- end
184
-
185
182
  def hash
186
183
  @name.hash
187
184
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- # Copyright 2018 Aerospike, Inc.
3
+ # Copyright 2018-2020 Aerospike, Inc.
4
4
  #
5
5
  # Portions may be licensed to Aerospike, Inc. under one or more contributor
6
6
  # license agreements.
@@ -25,24 +25,15 @@ module Aerospike
25
25
  def call(node, peers)
26
26
  return unless should_refresh?(node, peers)
27
27
 
28
- node.cluster.update_partitions(tokenizer(node), node)
28
+ Aerospike.logger.info("Updating partitions for node #{node.name}")
29
+ conn = node.tend_connection
30
+ parser = PartitionParser.new(node, conn)
31
+ node.cluster.update_partitions(parser)
29
32
  rescue ::Aerospike::Exceptions::Aerospike => e
30
- node.tend_connection.close
33
+ conn.close
31
34
  Refresh::Failed.(node, e)
32
35
  end
33
36
 
34
- # Return correct tokenizer depending on version
35
- def tokenizer(node)
36
- conn = node.tend_connection
37
- if node.use_new_info?
38
- Aerospike.logger.info("Updating partitions for node #{node.name} using new protocol")
39
- PartitionTokenizerNew.new(conn)
40
- else
41
- Aerospike.logger.info("Updating partitions for node #{node.name} using old protocol")
42
- PartitionTokenizerOld.new(conn)
43
- end
44
- end
45
-
46
37
  # Do not refresh partitions when node connection has already failed
47
38
  # during this cluster tend iteration. Also, avoid "split cluster"
48
39
  # case where this node thinks it's a 1-node cluster. Unchecked, such