aerospike 2.9.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +51 -4
- data/README.md +1 -1
- data/lib/aerospike.rb +12 -4
- data/lib/aerospike/aerospike_exception.rb +7 -1
- data/lib/aerospike/atomic/atomic.rb +1 -1
- data/lib/aerospike/bin.rb +1 -1
- data/lib/aerospike/cdt/list_operation.rb +1 -1
- data/lib/aerospike/cdt/map_operation.rb +1 -1
- data/lib/aerospike/cdt/map_order.rb +1 -1
- data/lib/aerospike/cdt/map_policy.rb +1 -1
- data/lib/aerospike/cdt/map_return_type.rb +1 -1
- data/lib/aerospike/cdt/map_write_mode.rb +1 -1
- data/lib/aerospike/client.rb +10 -11
- data/lib/aerospike/cluster.rb +92 -17
- data/lib/aerospike/cluster/partition.rb +1 -1
- data/lib/aerospike/cluster/partition_parser.rb +169 -0
- data/lib/aerospike/command/admin_command.rb +2 -3
- data/lib/aerospike/command/batch_direct_command.rb +1 -1
- data/lib/aerospike/command/batch_direct_exists_command.rb +1 -1
- data/lib/aerospike/command/batch_direct_node.rb +3 -3
- data/lib/aerospike/command/batch_index_command.rb +10 -2
- data/lib/aerospike/command/batch_index_node.rb +2 -2
- data/lib/aerospike/command/batch_item.rb +1 -1
- data/lib/aerospike/command/command.rb +102 -11
- data/lib/aerospike/command/delete_command.rb +21 -5
- data/lib/aerospike/command/execute_command.rb +1 -1
- data/lib/aerospike/command/exists_command.rb +21 -5
- data/lib/aerospike/command/field_type.rb +3 -1
- data/lib/aerospike/command/multi_command.rb +11 -4
- data/lib/aerospike/command/operate_command.rb +6 -1
- data/lib/aerospike/command/read_command.rb +29 -18
- data/lib/aerospike/command/read_header_command.rb +18 -6
- data/lib/aerospike/command/roles.rb +1 -1
- data/lib/aerospike/command/single_command.rb +9 -3
- data/lib/aerospike/command/touch_command.rb +14 -3
- data/lib/aerospike/command/unsupported_particle_type_validator.rb +1 -1
- data/lib/aerospike/command/write_command.rb +13 -4
- data/lib/aerospike/connection/create.rb +1 -1
- data/lib/aerospike/features.rb +1 -1
- data/lib/aerospike/geo_json.rb +70 -1
- data/lib/aerospike/host.rb +1 -1
- data/lib/aerospike/info.rb +1 -1
- data/lib/aerospike/key.rb +1 -1
- data/lib/aerospike/language.rb +1 -1
- data/lib/aerospike/node.rb +3 -6
- data/lib/aerospike/node/refresh/partitions.rb +6 -15
- data/lib/aerospike/node_validator.rb +45 -40
- data/lib/aerospike/operation.rb +6 -1
- data/lib/aerospike/policy/admin_policy.rb +1 -1
- data/lib/aerospike/policy/batch_policy.rb +1 -1
- data/lib/aerospike/policy/client_policy.rb +1 -1
- data/lib/aerospike/policy/commit_level.rb +1 -1
- data/lib/aerospike/policy/consistency_level.rb +1 -1
- data/lib/aerospike/policy/generation_policy.rb +1 -1
- data/lib/aerospike/policy/operate_policy.rb +1 -1
- data/lib/aerospike/policy/policy.rb +57 -3
- data/lib/aerospike/policy/priority.rb +1 -1
- data/lib/aerospike/policy/query_policy.rb +8 -1
- data/lib/aerospike/policy/record_bin_multiplicity.rb +1 -1
- data/lib/aerospike/policy/record_exists_action.rb +1 -1
- data/lib/aerospike/policy/replica.rb +38 -0
- data/lib/aerospike/policy/scan_policy.rb +8 -1
- data/lib/aerospike/policy/write_policy.rb +1 -1
- data/lib/aerospike/query/filter.rb +1 -1
- data/lib/aerospike/query/pred_exp.rb +192 -0
- data/lib/aerospike/query/pred_exp/and_or.rb +32 -0
- data/lib/aerospike/query/pred_exp/geo_json_value.rb +41 -0
- data/lib/aerospike/query/pred_exp/integer_value.rb +32 -0
- data/lib/aerospike/query/pred_exp/op.rb +27 -0
- data/lib/aerospike/query/pred_exp/regex.rb +32 -0
- data/lib/aerospike/query/pred_exp/regex_flags.rb +23 -0
- data/lib/aerospike/query/pred_exp/string_value.rb +29 -0
- data/lib/aerospike/query/query_command.rb +27 -1
- data/lib/aerospike/query/recordset.rb +5 -5
- data/lib/aerospike/query/scan_command.rb +1 -1
- data/lib/aerospike/query/statement.rb +12 -3
- data/lib/aerospike/query/stream_command.rb +9 -10
- data/lib/aerospike/record.rb +1 -1
- data/lib/aerospike/result_code.rb +13 -20
- data/lib/aerospike/socket/base.rb +1 -1
- data/lib/aerospike/task/execute_task.rb +1 -1
- data/lib/aerospike/task/index_task.rb +1 -1
- data/lib/aerospike/task/task.rb +1 -1
- data/lib/aerospike/task/udf_register_task.rb +1 -1
- data/lib/aerospike/task/udf_remove_task.rb +1 -1
- data/lib/aerospike/ttl.rb +1 -1
- data/lib/aerospike/udf.rb +1 -1
- data/lib/aerospike/user_role.rb +1 -1
- data/lib/aerospike/utils/buffer.rb +1 -1
- data/lib/aerospike/utils/packer.rb +1 -1
- data/lib/aerospike/utils/pool.rb +1 -1
- data/lib/aerospike/utils/unpacker.rb +7 -2
- data/lib/aerospike/value/particle_type.rb +1 -1
- data/lib/aerospike/value/value.rb +59 -29
- data/lib/aerospike/version.rb +1 -1
- metadata +15 -8
- data/lib/aerospike/cluster/partition_tokenizer_new.rb +0 -130
- data/lib/aerospike/cluster/partition_tokenizer_old.rb +0 -135
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7bef523a7e7500d8e39cb80f3b9ee6831a5ddc0bd6d782685181cae6a6c6ada5
|
4
|
+
data.tar.gz: 760d626bffac6ed69bcdda048daf39b07a12a85264b67be0677ad5d552c5473c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: df19a0c2900463a35b73ba52bfae3bdb2c5f6cbdaba3ab17172219e96ad3de3878bbc1ff57403fbbffe0fb48cc147ee642297e2fe47c829d768e76b1e4dee0fa
|
7
|
+
data.tar.gz: 528ade6f9abfb9b9e266439fefa6606f2623aec2503ec6c5466a5c3f9ffd9656debea49ff434f715f042c3ae319546e80352aa36cdc925ed351cab2633c75c4b
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,54 @@
|
|
2
2
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
4
4
|
|
5
|
-
## [
|
5
|
+
## [2.13.0] - 2019-07-17
|
6
|
+
|
7
|
+
* **New Features**
|
8
|
+
* Adds support for replica policies.
|
9
|
+
|
10
|
+
* **Improvements**
|
11
|
+
* Remove support for "old" partition tokenizer.
|
12
|
+
* Refactor how partition parser is initialized and called.
|
13
|
+
* Adds support for 'replicas' and remove the old partition table queries from the server.
|
14
|
+
|
15
|
+
## [2.12.0] - 2019-04-21
|
16
|
+
|
17
|
+
* **New Features**
|
18
|
+
* Support for predicate expressions in all transaction.
|
19
|
+
* Support for `operation.delete` in `client#operate`.
|
20
|
+
|
21
|
+
* **Improvements**
|
22
|
+
* Optimize serialization for nested structures. Thanks to [@Kacper Madej](https://github.com/madejejej)! [[#94](https://github.com/aerospike/aerospike-client-ruby/pull/94)]
|
23
|
+
* Remove `Thread#abort_on_exception` from `batch_index_command`. Thanks to [@Kacper Madej](https://github.com/madejejej)! [[#94](https://github.com/aerospike/aerospike-client-ruby/pull/92)]
|
24
|
+
* Does not allow values other than Integer, Float, String, Symbol and nil to be used as keys in Maps.
|
25
|
+
|
26
|
+
* **Bug Fixes**
|
27
|
+
* Fixes tests that weren't using ENV variables for connections. This will allow the tests to be run on any server.
|
28
|
+
|
29
|
+
|
30
|
+
## [2.11.0] - 2019-05-17
|
31
|
+
|
32
|
+
* **New Features**
|
33
|
+
* Support for predicate expressions in queries. Thanks to [@Minus10Degrees](https://github.com/Minus10Degrees)! [[#78](https://github.com/aerospike/aerospike-client-ruby/issues/78)]
|
34
|
+
|
35
|
+
* **Bug Fixes**
|
36
|
+
* Client#execute\_udf\_on\_query should not modify the statement argument. [[#79](https://github.com/aerospike/aerospike-client-ruby/issues/79)]
|
37
|
+
* Encoding::UndefinedConversionError when reading blob data from CDT list/map bin. [[#84](https://github.com/aerospike/aerospike-client-ruby/issues/84)]
|
38
|
+
|
39
|
+
## [2.10.0] - 2019-05-10
|
40
|
+
|
41
|
+
* **New Features**
|
42
|
+
* Add support for LB discovery / seeding. Thanks to [@filiptepper](https://github.com/filiptepper)! [[#80](https://github.com/aerospike/aerospike-client-ruby/issues/80)]
|
43
|
+
|
44
|
+
## [2.9.1] - 2019-04-03
|
45
|
+
|
46
|
+
* **Bug Fixes**
|
47
|
+
* Query fails if one or more cluster nodes do not have records in the set [[#77](https://github.com/aerospike/aerospike-client-ruby/issues/77)]
|
48
|
+
|
49
|
+
* **Updates**
|
50
|
+
* Change admin message version to 2 (from 0)
|
51
|
+
* Remove unused BIN_EXISTS_ERROR (6) and BIN_NOT_FOUND (17) error codes
|
52
|
+
* Tests: Support setting user/password when running specs
|
6
53
|
|
7
54
|
## [2.9.0] - 2018-11-09
|
8
55
|
|
@@ -10,10 +57,10 @@ All notable changes to this project will be documented in this file.
|
|
10
57
|
* Add INFINITY and WILDCARD values for use in CDT map/list comparators. [AER-5945]
|
11
58
|
|
12
59
|
* **Bug Fixes**
|
13
|
-
* Default policies set on Client instance do not get applied [[#74](https://github.com/aerospike/aerospike-client-ruby/
|
60
|
+
* Default policies set on Client instance do not get applied [[#74](https://github.com/aerospike/aerospike-client-ruby/issues/74)]
|
14
61
|
|
15
62
|
* **Updates**
|
16
|
-
* *BREAKING CHANGE*: Change default for send_key write policy to false [[#73](https://github.com/aerospike/aerospike-client-ruby/
|
63
|
+
* *BREAKING CHANGE*: Change default for send_key write policy to false [[#73](https://github.com/aerospike/aerospike-client-ruby/issues/73)]
|
17
64
|
* Support truncate info command argument "lut=now" for servers that require it. [AER-5955]
|
18
65
|
|
19
66
|
## [2.8.0] - 2018-08-06
|
@@ -140,7 +187,7 @@ All notable changes to this project will be documented in this file.
|
|
140
187
|
|
141
188
|
## [2.0.0] - 2016-05-27
|
142
189
|
|
143
|
-
* **Breaking Changes** - Please refer to detailed list of [API changes](docs/
|
190
|
+
* **Breaking Changes** - Please refer to detailed list of [API changes](https://www.aerospike.com/docs/client/ruby/usage/incompatible.html#version-2-0-0) for further details.
|
144
191
|
* Incompatible integer key digests: digests for integer keys computed by v2 and v1 are different; the Aerospike server uses the key digest to retrieve records. This will impact your ability to read records with integer keys that were created by a v1 client version.
|
145
192
|
* Backward incompatible changes to the `Aerospike::Client.new` initializer.
|
146
193
|
* The `Aerospike::Client.new_many` initializer has been removed; use `Aerospike::Client.new` instead.
|
data/README.md
CHANGED
@@ -97,7 +97,7 @@ This library is packaged with a number of tests.
|
|
97
97
|
|
98
98
|
To run all the test cases:
|
99
99
|
|
100
|
-
$ bundle exec rspec
|
100
|
+
$ AEROSPIKE_HOSTS="<host:port>[,<hoist:port>]" AEROSPIKE_USER="<user>" AEROSPIKE_PASSWORD="<pass>" bundle exec rspec
|
101
101
|
|
102
102
|
<a name="Examples"></a>
|
103
103
|
## Examples
|
data/lib/aerospike.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2014-
|
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.
|
@@ -101,11 +101,10 @@ require 'aerospike/connection/create'
|
|
101
101
|
|
102
102
|
require 'aerospike/cluster'
|
103
103
|
require 'aerospike/cluster/create_connection'
|
104
|
-
require 'aerospike/cluster/partition'
|
105
104
|
require 'aerospike/cluster/find_nodes_to_remove'
|
106
105
|
require 'aerospike/cluster/find_node'
|
107
|
-
require 'aerospike/cluster/
|
108
|
-
require 'aerospike/cluster/
|
106
|
+
require 'aerospike/cluster/partition'
|
107
|
+
require 'aerospike/cluster/partition_parser'
|
109
108
|
require 'aerospike/node'
|
110
109
|
require 'aerospike/node/generation'
|
111
110
|
require 'aerospike/node/refresh/failed'
|
@@ -142,6 +141,15 @@ require 'aerospike/query/stream_command'
|
|
142
141
|
require 'aerospike/query/query_command'
|
143
142
|
require 'aerospike/query/scan_command'
|
144
143
|
require 'aerospike/query/statement'
|
144
|
+
require 'aerospike/query/pred_exp'
|
145
|
+
|
146
|
+
require 'aerospike/query/pred_exp/and_or'
|
147
|
+
require 'aerospike/query/pred_exp/geo_json_value'
|
148
|
+
require 'aerospike/query/pred_exp/integer_value'
|
149
|
+
require 'aerospike/query/pred_exp/op'
|
150
|
+
require 'aerospike/query/pred_exp/regex'
|
151
|
+
require 'aerospike/query/pred_exp/regex_flags'
|
152
|
+
require 'aerospike/query/pred_exp/string_value'
|
145
153
|
|
146
154
|
module Aerospike
|
147
155
|
extend Loggable
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
# Copyright 2014-
|
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.
|
@@ -90,5 +90,11 @@ module Aerospike
|
|
90
90
|
super(ResultCode::COMMAND_REJECTED, msg)
|
91
91
|
end
|
92
92
|
end
|
93
|
+
|
94
|
+
class InvalidNamespace < Aerospike
|
95
|
+
def initialize(msg=nil)
|
96
|
+
super(ResultCode::INVALID_NAMESPACE, msg)
|
97
|
+
end
|
98
|
+
end
|
93
99
|
end
|
94
100
|
end
|
data/lib/aerospike/bin.rb
CHANGED
data/lib/aerospike/client.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright 2014-
|
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.
|
@@ -322,11 +322,11 @@ module Aerospike
|
|
322
322
|
|
323
323
|
if policy.use_batch_direct
|
324
324
|
key_map = BatchItem.generate_map(keys)
|
325
|
-
execute_batch_direct_commands(keys) do |node, batch|
|
325
|
+
execute_batch_direct_commands(policy, keys) do |node, batch|
|
326
326
|
BatchDirectCommand.new(node, batch, policy, key_map, bin_names, results, info_flags)
|
327
327
|
end
|
328
328
|
else
|
329
|
-
execute_batch_index_commands(keys) do |node, batch|
|
329
|
+
execute_batch_index_commands(policy, keys) do |node, batch|
|
330
330
|
BatchIndexCommand.new(node, batch, policy, bin_names, results, info_flags)
|
331
331
|
end
|
332
332
|
end
|
@@ -351,11 +351,11 @@ module Aerospike
|
|
351
351
|
|
352
352
|
if policy.use_batch_direct
|
353
353
|
key_map = BatchItem.generate_map(keys)
|
354
|
-
execute_batch_direct_commands(keys) do |node, batch|
|
354
|
+
execute_batch_direct_commands(policy, keys) do |node, batch|
|
355
355
|
BatchDirectExistsCommand.new(node, batch, policy, key_map, results)
|
356
356
|
end
|
357
357
|
else
|
358
|
-
execute_batch_index_commands(keys) do |node, batch|
|
358
|
+
execute_batch_index_commands(policy, keys) do |node, batch|
|
359
359
|
BatchIndexExistsCommand.new(node, batch, policy, results)
|
360
360
|
end
|
361
361
|
end
|
@@ -526,7 +526,7 @@ module Aerospike
|
|
526
526
|
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::SERVER_NOT_AVAILABLE, "Executing UDF failed because cluster is empty.")
|
527
527
|
end
|
528
528
|
|
529
|
-
|
529
|
+
statement = statement.clone
|
530
530
|
statement.set_aggregate_function(package_name, function_name, function_args, false)
|
531
531
|
|
532
532
|
# Use a thread per node
|
@@ -884,17 +884,16 @@ module Aerospike
|
|
884
884
|
command.execute
|
885
885
|
end
|
886
886
|
|
887
|
-
def execute_batch_index_commands(keys)
|
887
|
+
def execute_batch_index_commands(policy, keys)
|
888
888
|
if @cluster.nodes.empty?
|
889
889
|
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::SERVER_NOT_AVAILABLE, "Executing Batch Index command failed because cluster is empty.")
|
890
890
|
end
|
891
891
|
|
892
|
-
batch_nodes = BatchIndexNode.generate_list(@cluster, keys)
|
892
|
+
batch_nodes = BatchIndexNode.generate_list(@cluster, policy.replica, keys)
|
893
893
|
threads = []
|
894
894
|
|
895
895
|
batch_nodes.each do |batch|
|
896
896
|
threads << Thread.new do
|
897
|
-
Thread.current.abort_on_exception = true
|
898
897
|
command = yield batch.node, batch
|
899
898
|
execute_command(command)
|
900
899
|
end
|
@@ -903,12 +902,12 @@ module Aerospike
|
|
903
902
|
threads.each(&:join)
|
904
903
|
end
|
905
904
|
|
906
|
-
def execute_batch_direct_commands(keys)
|
905
|
+
def execute_batch_direct_commands(policy, keys)
|
907
906
|
if @cluster.nodes.empty?
|
908
907
|
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::SERVER_NOT_AVAILABLE, "Executing Batch Direct command failed because cluster is empty.")
|
909
908
|
end
|
910
909
|
|
911
|
-
batch_nodes = BatchDirectNode.generate_list(@cluster, keys)
|
910
|
+
batch_nodes = BatchDirectNode.generate_list(@cluster, policy.replica, keys)
|
912
911
|
threads = []
|
913
912
|
|
914
913
|
# Use a thread per namespace per node
|
data/lib/aerospike/cluster.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Copyright 2014-
|
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.
|
@@ -38,6 +38,8 @@ module Aerospike
|
|
38
38
|
@cluster_name = policy.cluster_name
|
39
39
|
@tls_options = policy.tls
|
40
40
|
|
41
|
+
@replica_index = Atomic.new(0)
|
42
|
+
|
41
43
|
@aliases = {}
|
42
44
|
@cluster_nodes = []
|
43
45
|
@partition_write_map = {}
|
@@ -102,18 +104,92 @@ module Aerospike
|
|
102
104
|
(node_array.length > 0) && !@closed.value
|
103
105
|
end
|
104
106
|
|
105
|
-
|
106
|
-
|
107
|
+
# Returns a node on the cluster for read operations
|
108
|
+
def batch_read_node(partition, replica_policy)
|
109
|
+
case replica_policy
|
110
|
+
when Aerospike::Replica::MASTER, Aerospike::Replica::SEQUENCE
|
111
|
+
return master_node(partition)
|
112
|
+
when Aerospike::Replica::MASTER_PROLES
|
113
|
+
return master_proles_node(partition)
|
114
|
+
when Aerospike::Replica::RANDOM
|
115
|
+
return random_node
|
116
|
+
else
|
117
|
+
raise Aerospike::Exceptions::InvalidNode("invalid policy.replica value")
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
# Returns a node on the cluster for read operations
|
122
|
+
def read_node(partition, replica_policy, seq)
|
123
|
+
case replica_policy
|
124
|
+
when Aerospike::Replica::MASTER
|
125
|
+
return master_node(partition)
|
126
|
+
when Aerospike::Replica::MASTER_PROLES
|
127
|
+
return master_proles_node(partition)
|
128
|
+
when Aerospike::Replica::SEQUENCE
|
129
|
+
return sequence_node(partition, seq)
|
130
|
+
when Aerospike::Replica::RANDOM
|
131
|
+
return random_node
|
132
|
+
else
|
133
|
+
raise Aerospike::Exceptions::InvalidNode("invalid policy.replica value")
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# Returns a node on the cluster for read operations
|
138
|
+
def master_node(partition)
|
139
|
+
partition_map = partitions
|
140
|
+
replica_array = partition_map[partition.namespace]
|
141
|
+
raise Aerospike::Exceptions::InvalidNamespace("namespace not found in the partition map") if !replica_array
|
142
|
+
|
143
|
+
node_array = (replica_array.get)[0]
|
144
|
+
raise Aerospike::Exceptions::InvalidNamespace("namespace not found in the partition map") if !node_array
|
145
|
+
|
146
|
+
node = (node_array.get)[partition.partition_id]
|
147
|
+
raise Aerospike::Exceptions::InvalidNode if !node || !node.active?
|
148
|
+
|
149
|
+
node
|
150
|
+
end
|
151
|
+
|
152
|
+
# Returns a node on the cluster for read operations
|
153
|
+
def master_proles_node(partition)
|
154
|
+
partition_map = partitions
|
155
|
+
replica_array = partition_map[partition.namespace]
|
156
|
+
raise Aerospike::Exceptions::InvalidNamespace("namespace not found in the partition map") if !replica_array
|
157
|
+
|
158
|
+
replica_array = replica_array.get
|
107
159
|
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
node =
|
160
|
+
node = nil
|
161
|
+
for replica in replica_array
|
162
|
+
idx = (@replica_index.update{|v| v.succ} % replica_array.size).abs
|
163
|
+
node = (replica_array[idx].get)[partition.partition_id]
|
112
164
|
|
113
165
|
return node if node && node.active?
|
114
166
|
end
|
115
167
|
|
116
|
-
|
168
|
+
raise Aerospike::Exceptions::InvalidNode
|
169
|
+
end
|
170
|
+
|
171
|
+
# Returns a random node on the cluster
|
172
|
+
def sequence_node(partition, seq)
|
173
|
+
partition_map = partitions
|
174
|
+
replica_array = partition_map[partition.namespace]
|
175
|
+
raise Aerospike::Exceptions::InvalidNamespace("namespace not found in the partition map") if !replica_array
|
176
|
+
|
177
|
+
replica_array = replica_array.get
|
178
|
+
|
179
|
+
node = nil
|
180
|
+
for replica in replica_array
|
181
|
+
idx = (seq.update{|v| v.succ} % replica_array.size).abs
|
182
|
+
node = (replica_array[idx].get)[partition.partition_id]
|
183
|
+
|
184
|
+
return node if node && node.active?
|
185
|
+
end
|
186
|
+
|
187
|
+
raise Aerospike::Exceptions::InvalidNode
|
188
|
+
end
|
189
|
+
|
190
|
+
def get_node_for_key(replica_policy, key)
|
191
|
+
partition = Partition.new_by_key(key)
|
192
|
+
batch_read_node(partition, replica_policy)
|
117
193
|
end
|
118
194
|
|
119
195
|
# Returns a random node on the cluster
|
@@ -124,8 +200,8 @@ module Aerospike
|
|
124
200
|
i = 0
|
125
201
|
while i < length
|
126
202
|
# Must handle concurrency with other non-tending threads, so node_index is consistent.
|
127
|
-
|
128
|
-
node = node_array[
|
203
|
+
idx = (@node_index.update{ |v| v.succ } % node_array.length).abs
|
204
|
+
node = node_array[idx]
|
129
205
|
|
130
206
|
return node if node.active?
|
131
207
|
|
@@ -167,12 +243,9 @@ module Aerospike
|
|
167
243
|
end
|
168
244
|
end
|
169
245
|
|
170
|
-
def update_partitions(
|
171
|
-
nmap =
|
172
|
-
# update partition write map
|
246
|
+
def update_partitions(parser)
|
247
|
+
nmap = parser.update_partitions(partitions)
|
173
248
|
set_partitions(nmap) if nmap
|
174
|
-
|
175
|
-
Aerospike.logger.info("Partitions for node #{node.name} updated")
|
176
249
|
end
|
177
250
|
|
178
251
|
def request_info(policy, *commands)
|
@@ -441,8 +514,10 @@ module Aerospike
|
|
441
514
|
def find_node_in_partition_map(filter)
|
442
515
|
partitions_list = partitions
|
443
516
|
|
444
|
-
partitions_list.values.each do |
|
445
|
-
|
517
|
+
partitions_list.values.each do |replica_array|
|
518
|
+
replica_array.get.each do |node_array|
|
519
|
+
return true if node_array.value.any? { |node| node == filter }
|
520
|
+
end
|
446
521
|
end
|
447
522
|
false
|
448
523
|
end
|