aerospike 2.22.0 → 2.24.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +307 -262
- data/lib/aerospike/atomic/atomic.rb +1 -1
- data/lib/aerospike/cdt/context.rb +7 -7
- data/lib/aerospike/cdt/list_return_type.rb +4 -0
- data/lib/aerospike/cdt/map_operation.rb +6 -6
- data/lib/aerospike/cdt/map_return_type.rb +4 -0
- data/lib/aerospike/client.rb +59 -84
- data/lib/aerospike/command/admin_command.rb +1 -1
- data/lib/aerospike/command/batch_index_node.rb +1 -1
- data/lib/aerospike/command/batch_item.rb +1 -1
- data/lib/aerospike/command/command.rb +65 -25
- data/lib/aerospike/command/field_type.rb +25 -25
- data/lib/aerospike/command/login_command.rb +4 -4
- data/lib/aerospike/command/multi_command.rb +8 -2
- data/lib/aerospike/command/read_command.rb +2 -2
- data/lib/aerospike/connection/authenticate.rb +3 -3
- data/lib/aerospike/exp/exp.rb +1262 -0
- data/lib/aerospike/features.rb +9 -9
- data/lib/aerospike/host/parse.rb +2 -2
- data/lib/aerospike/key.rb +10 -1
- data/lib/aerospike/node/refresh/info.rb +1 -1
- data/lib/aerospike/node/verify/name.rb +1 -1
- data/lib/aerospike/node/verify/partition_generation.rb +1 -1
- data/lib/aerospike/node/verify/peers_generation.rb +1 -1
- data/lib/aerospike/node/verify/rebalance_generation.rb +1 -1
- data/lib/aerospike/policy/policy.rb +4 -1
- data/lib/aerospike/policy/query_policy.rb +35 -2
- data/lib/aerospike/policy/scan_policy.rb +19 -2
- data/lib/aerospike/privilege.rb +1 -1
- data/lib/aerospike/query/node_partitions.rb +39 -0
- data/lib/aerospike/query/partition_filter.rb +66 -0
- data/lib/aerospike/query/partition_status.rb +36 -0
- data/lib/aerospike/query/partition_tracker.rb +347 -0
- data/lib/aerospike/query/query_command.rb +1 -1
- data/lib/aerospike/query/query_executor.rb +73 -0
- data/lib/aerospike/query/query_partition_command.rb +266 -0
- data/lib/aerospike/query/scan_command.rb +3 -3
- data/lib/aerospike/query/scan_executor.rb +69 -0
- data/lib/aerospike/query/scan_partition_command.rb +49 -0
- data/lib/aerospike/query/statement.rb +8 -1
- data/lib/aerospike/query/stream_command.rb +15 -1
- data/lib/aerospike/result_code.rb +79 -4
- data/lib/aerospike/role.rb +2 -2
- data/lib/aerospike/task/execute_task.rb +2 -2
- data/lib/aerospike/task/index_task.rb +1 -1
- data/lib/aerospike/user_role.rb +1 -1
- data/lib/aerospike/utils/buffer.rb +32 -7
- data/lib/aerospike/utils/pool.rb +1 -1
- data/lib/aerospike/value/value.rb +6 -6
- data/lib/aerospike/version.rb +1 -1
- data/lib/aerospike.rb +8 -0
- metadata +14 -5
@@ -52,7 +52,7 @@ module Aerospike
|
|
52
52
|
def self.list_index(index)
|
53
53
|
Context.new(0x10, index)
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
##
|
57
57
|
# Lookup list by rank.
|
58
58
|
# 0 = smallest value
|
@@ -61,13 +61,13 @@ module Aerospike
|
|
61
61
|
def self.list_rank(rank)
|
62
62
|
Context.new(0x11, rank)
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
##
|
66
66
|
# Lookup list by value.
|
67
67
|
def self.list_value(key)
|
68
68
|
Context.new(0x13, key)
|
69
69
|
end
|
70
|
-
|
70
|
+
|
71
71
|
##
|
72
72
|
# Lookup map by index offset.
|
73
73
|
# If the index is negative, the resolved index starts backwards from end of list.
|
@@ -80,7 +80,7 @@ module Aerospike
|
|
80
80
|
def self.map_index(index)
|
81
81
|
Context.new(0x20, index)
|
82
82
|
end
|
83
|
-
|
83
|
+
|
84
84
|
##
|
85
85
|
# Lookup map by rank.
|
86
86
|
# 0 = smallest value
|
@@ -89,13 +89,13 @@ module Aerospike
|
|
89
89
|
def self.map_rank(rank)
|
90
90
|
Context.new(0x21, rank)
|
91
91
|
end
|
92
|
-
|
92
|
+
|
93
93
|
##
|
94
94
|
# Lookup map by key.
|
95
95
|
def self.map_key(key)
|
96
96
|
Context.new(0x22, key)
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
##
|
100
100
|
# Create map with given type at map key.
|
101
101
|
def self.map_key_create(key, order)
|
@@ -106,7 +106,7 @@ module Aerospike
|
|
106
106
|
# Lookup map by value.
|
107
107
|
def self.map_value(key)
|
108
108
|
Context.new(0x23, key)
|
109
|
-
end
|
109
|
+
end
|
110
110
|
|
111
111
|
end
|
112
112
|
end
|
@@ -138,9 +138,7 @@ module Aerospike
|
|
138
138
|
# The map policy dictates the type of map to create when it does not exist.
|
139
139
|
# The map policy also specifies the flags used when writing items to the map.
|
140
140
|
def self.put(bin_name, key, value, ctx: nil, policy: MapPolicy::DEFAULT)
|
141
|
-
if policy.flags
|
142
|
-
MapOperation.new(Operation::CDT_MODIFY, PUT, bin_name, key, value, policy.order[:attr], policy.flags, ctx: ctx)
|
143
|
-
else
|
141
|
+
if policy.flags == MapWriteFlags::DEFAULT
|
144
142
|
case policy.write_mode
|
145
143
|
when MapWriteMode::UPDATE_ONLY
|
146
144
|
# Replace doesn't allow map order because it does not create on non-existing key.
|
@@ -150,6 +148,8 @@ module Aerospike
|
|
150
148
|
else
|
151
149
|
MapOperation.new(Operation::CDT_MODIFY, PUT, bin_name, key, value, policy.order[:attr], ctx: ctx)
|
152
150
|
end
|
151
|
+
else
|
152
|
+
MapOperation.new(Operation::CDT_MODIFY, PUT, bin_name, key, value, policy.order[:attr], policy.flags, ctx: ctx)
|
153
153
|
end
|
154
154
|
end
|
155
155
|
|
@@ -160,9 +160,7 @@ module Aerospike
|
|
160
160
|
# The map policy dictates the type of map to create when it does not exist.
|
161
161
|
# The map policy also specifies the flags used when writing items to the map.
|
162
162
|
def self.put_items(bin_name, values, ctx: nil, policy: MapPolicy::DEFAULT)
|
163
|
-
if policy.flags
|
164
|
-
MapOperation.new(Operation::CDT_MODIFY, PUT_ITEMS, bin_name, values, policy.order[:attr], policy.flags, ctx: ctx)
|
165
|
-
else
|
163
|
+
if policy.flags == MapWriteFlags::DEFAULT
|
166
164
|
case policy.write_mode
|
167
165
|
when MapWriteMode::UPDATE_ONLY
|
168
166
|
# Replace doesn't allow map order because it does not create on non-existing key.
|
@@ -172,6 +170,8 @@ module Aerospike
|
|
172
170
|
else
|
173
171
|
MapOperation.new(Operation::CDT_MODIFY, PUT_ITEMS, bin_name, values, policy.order[:attr], ctx: ctx)
|
174
172
|
end
|
173
|
+
else
|
174
|
+
MapOperation.new(Operation::CDT_MODIFY, PUT_ITEMS, bin_name, values, policy.order[:attr], policy.flags, ctx: ctx)
|
175
175
|
end
|
176
176
|
end
|
177
177
|
|
data/lib/aerospike/client.rb
CHANGED
@@ -624,13 +624,15 @@ module Aerospike
|
|
624
624
|
# Scan Operations
|
625
625
|
#-------------------------------------------------------
|
626
626
|
|
627
|
-
|
627
|
+
# Reads records in specified namespace and set using partition filter.
|
628
|
+
# If the policy's concurrent_nodes is specified, each server node will be read in
|
629
|
+
# parallel. Otherwise, server nodes are read sequentially.
|
630
|
+
# If partition_filter is nil, all partitions will be scanned.
|
631
|
+
# If the policy is nil, the default relevant policy will be used.
|
632
|
+
# This method is only supported by Aerospike 4.9+ servers.
|
633
|
+
def scan_partitions(partition_filter, namespace, set_name, bin_names = nil, options = nil)
|
628
634
|
policy = create_policy(options, ScanPolicy, default_scan_policy)
|
629
635
|
|
630
|
-
# wait until all migrations are finished
|
631
|
-
# TODO: implement
|
632
|
-
# @cluster.WaitUntillMigrationIsFinished(policy.timeout)
|
633
|
-
|
634
636
|
# Retry policy must be one-shot for scans.
|
635
637
|
# copy on write for policy
|
636
638
|
new_policy = policy.clone
|
@@ -640,122 +642,95 @@ module Aerospike
|
|
640
642
|
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::SERVER_NOT_AVAILABLE, "Scan failed because cluster is empty.")
|
641
643
|
end
|
642
644
|
|
643
|
-
|
644
|
-
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
partitions = node.cluster.node_partitions(node, namespace)
|
649
|
-
Thread.new do
|
650
|
-
Thread.current.abort_on_exception = true
|
651
|
-
command = ScanCommand.new(node, new_policy, namespace, set_name, bin_names, recordset, partitions)
|
652
|
-
begin
|
653
|
-
execute_command(command)
|
654
|
-
rescue => e
|
655
|
-
Aerospike.logger.error(e.backtrace.join("\n")) unless e == SCAN_TERMINATED_EXCEPTION
|
656
|
-
recordset.cancel(e)
|
657
|
-
ensure
|
658
|
-
recordset.thread_finished
|
659
|
-
end
|
660
|
-
end
|
661
|
-
end
|
662
|
-
else
|
663
|
-
Thread.new do
|
664
|
-
Thread.current.abort_on_exception = true
|
665
|
-
nodes.each do |node|
|
666
|
-
partitions = node.cluster.node_partitions(node, namespace)
|
667
|
-
command = ScanCommand.new(node, new_policy, namespace, set_name, bin_names, recordset, partitions)
|
668
|
-
begin
|
669
|
-
execute_command(command)
|
670
|
-
rescue => e
|
671
|
-
Aerospike.logger.error(e.backtrace.join("\n")) unless e == SCAN_TERMINATED_EXCEPTION
|
672
|
-
recordset.cancel(e)
|
673
|
-
ensure
|
674
|
-
recordset.thread_finished
|
675
|
-
end
|
676
|
-
end
|
677
|
-
end
|
645
|
+
tracker = Aerospike::PartitionTracker.new(policy, nodes, partition_filter)
|
646
|
+
recordset = Recordset.new(policy.record_queue_size, 1, :scan)
|
647
|
+
Thread.new do
|
648
|
+
Thread.current.abort_on_exception = true
|
649
|
+
ScanExecutor.scan_partitions(policy, @cluster, tracker, namespace, set_name, recordset, bin_names)
|
678
650
|
end
|
679
651
|
|
680
652
|
recordset
|
681
653
|
end
|
682
654
|
|
683
|
-
#
|
684
|
-
#
|
685
|
-
def
|
655
|
+
# Reads all records in specified namespace and set for one node only.
|
656
|
+
# If the policy is nil, the default relevant policy will be used.
|
657
|
+
def scan_node_partitions(node, namespace, set_name, bin_names = nil, options = nil)
|
686
658
|
policy = create_policy(options, ScanPolicy, default_scan_policy)
|
687
|
-
# wait until all migrations are finished
|
688
|
-
# TODO: implement
|
689
|
-
# @cluster.WaitUntillMigrationIsFinished(policy.timeout)
|
690
659
|
|
691
660
|
# Retry policy must be one-shot for scans.
|
692
661
|
# copy on write for policy
|
693
662
|
new_policy = policy.clone
|
694
|
-
new_policy.max_retries = 0
|
695
663
|
|
696
|
-
|
664
|
+
unless node.active?
|
665
|
+
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::SERVER_NOT_AVAILABLE, "Scan failed because cluster is empty.")
|
666
|
+
end
|
697
667
|
|
668
|
+
tracker = Aerospike::PartitionTracker.new(policy, [node])
|
698
669
|
recordset = Recordset.new(policy.record_queue_size, 1, :scan)
|
699
|
-
|
700
|
-
partitions = node.cluster.node_partitions(node, namespace)
|
701
670
|
Thread.new do
|
702
671
|
Thread.current.abort_on_exception = true
|
703
|
-
|
704
|
-
begin
|
705
|
-
execute_command(command)
|
706
|
-
rescue => e
|
707
|
-
Aerospike.logger.error(e.backtrace.join("\n")) unless e == SCAN_TERMINATED_EXCEPTION
|
708
|
-
recordset.cancel(e)
|
709
|
-
ensure
|
710
|
-
recordset.thread_finished
|
711
|
-
end
|
672
|
+
ScanExecutor.scan_partitions(policy, @cluster, tracker, namespace, set_name, recordset, bin_names)
|
712
673
|
end
|
713
674
|
|
714
675
|
recordset
|
715
676
|
end
|
716
677
|
|
678
|
+
# Reads all records in specified namespace and set from all nodes.
|
679
|
+
# If the policy's concurrent_nodes is specified, each server node will be read in
|
680
|
+
# parallel. Otherwise, server nodes are read sequentially.
|
681
|
+
# If the policy is nil, the default relevant policy will be used.
|
682
|
+
def scan_all(namespace, set_name, bin_names = nil, options = nil)
|
683
|
+
scan_partitions(Aerospike::PartitionFilter.all, namespace, set_name, bin_names, options)
|
684
|
+
end
|
685
|
+
|
686
|
+
# ScanNode reads all records in specified namespace and set, from one node only.
|
687
|
+
# The policy can be used to specify timeouts.
|
688
|
+
def scan_node(node, namespace, set_name, bin_names = nil, options = nil)
|
689
|
+
scan_node_partitions(node, namespace, set_name, bin_names, options)
|
690
|
+
end
|
691
|
+
|
717
692
|
#--------------------------------------------------------
|
718
693
|
# Query functions (Supported by Aerospike 3 servers only)
|
719
694
|
#--------------------------------------------------------
|
720
695
|
|
721
|
-
#
|
722
|
-
# The query executor puts records on
|
723
|
-
# The caller can concurrently
|
724
|
-
#
|
696
|
+
# Executes a query for specified partitions and returns a recordset.
|
697
|
+
# The query executor puts records on the queue from separate threads.
|
698
|
+
# The caller can concurrently pop records off the queue through the
|
699
|
+
# recordset.records API.
|
725
700
|
#
|
726
|
-
# This method is only supported by Aerospike
|
727
|
-
# If the policy is nil,
|
728
|
-
def
|
701
|
+
# This method is only supported by Aerospike 4.9+ servers.
|
702
|
+
# If the policy is nil, the default relevant policy will be used.
|
703
|
+
def query_partitions(partition_filter, statement, options = nil)
|
729
704
|
policy = create_policy(options, QueryPolicy, default_query_policy)
|
730
705
|
new_policy = policy.clone
|
731
706
|
|
732
707
|
nodes = @cluster.nodes
|
733
708
|
if nodes.empty?
|
734
|
-
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::SERVER_NOT_AVAILABLE, "
|
709
|
+
raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::SERVER_NOT_AVAILABLE, "Query failed because cluster is empty.")
|
735
710
|
end
|
736
711
|
|
737
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
741
|
-
|
742
|
-
|
743
|
-
Thread.current.abort_on_exception = true
|
744
|
-
command = QueryCommand.new(node, new_policy, statement, recordset, partitions)
|
745
|
-
begin
|
746
|
-
execute_command(command)
|
747
|
-
rescue => e
|
748
|
-
Aerospike.logger.error(e.backtrace.join("\n")) unless e == QUERY_TERMINATED_EXCEPTION
|
749
|
-
recordset.cancel(e)
|
750
|
-
ensure
|
751
|
-
recordset.thread_finished
|
752
|
-
end
|
753
|
-
end
|
712
|
+
# result recordset
|
713
|
+
recordset = Recordset.new(policy.record_queue_size, 1, :query)
|
714
|
+
tracker = PartitionTracker.new(policy, nodes, partition_filter)
|
715
|
+
Thread.new do
|
716
|
+
Thread.current.abort_on_exception = true
|
717
|
+
QueryExecutor.query_partitions(@cluster, policy, tracker, statement, recordset)
|
754
718
|
end
|
755
719
|
|
756
720
|
recordset
|
757
721
|
end
|
758
722
|
|
723
|
+
# Query executes a query and returns a recordset.
|
724
|
+
# The query executor puts records on a channel from separate threads.
|
725
|
+
# The caller can concurrently pops records off the channel through the
|
726
|
+
# record channel.
|
727
|
+
#
|
728
|
+
# This method is only supported by Aerospike 3 servers.
|
729
|
+
# If the policy is nil, a default policy will be generated.
|
730
|
+
def query(statement, options = nil)
|
731
|
+
query_partitions(Aerospike::PartitionFilter.all, statement, options)
|
732
|
+
end
|
733
|
+
|
759
734
|
#-------------------------------------------------------
|
760
735
|
# User administration
|
761
736
|
#-------------------------------------------------------
|
@@ -34,6 +34,8 @@ module Aerospike
|
|
34
34
|
INFO1_READ = Integer(1 << 0)
|
35
35
|
# Get all bins.
|
36
36
|
INFO1_GET_ALL = Integer(1 << 1)
|
37
|
+
# Short query
|
38
|
+
INFO1_SHORT_QUERY = Integer(1 << 2)
|
37
39
|
|
38
40
|
|
39
41
|
INFO1_BATCH = Integer(1 << 3)
|
@@ -112,7 +114,7 @@ module Aerospike
|
|
112
114
|
def set_write(policy, operation, key, bins)
|
113
115
|
begin_cmd
|
114
116
|
field_count = estimate_key_size(key, policy)
|
115
|
-
|
117
|
+
|
116
118
|
predexp_size = estimate_predexp(policy.predexp)
|
117
119
|
field_count += 1 if predexp_size > 0
|
118
120
|
|
@@ -138,7 +140,7 @@ module Aerospike
|
|
138
140
|
def set_delete(policy, key)
|
139
141
|
begin_cmd
|
140
142
|
field_count = estimate_key_size(key)
|
141
|
-
|
143
|
+
|
142
144
|
predexp_size = estimate_predexp(policy.predexp)
|
143
145
|
field_count += 1 if predexp_size > 0
|
144
146
|
|
@@ -153,7 +155,7 @@ module Aerospike
|
|
153
155
|
def set_touch(policy, key)
|
154
156
|
begin_cmd
|
155
157
|
field_count = estimate_key_size(key)
|
156
|
-
|
158
|
+
|
157
159
|
predexp_size = estimate_predexp(policy.predexp)
|
158
160
|
field_count += 1 if predexp_size > 0
|
159
161
|
|
@@ -170,7 +172,7 @@ module Aerospike
|
|
170
172
|
def set_exists(policy, key)
|
171
173
|
begin_cmd
|
172
174
|
field_count = estimate_key_size(key)
|
173
|
-
|
175
|
+
|
174
176
|
predexp_size = estimate_predexp(policy.predexp)
|
175
177
|
field_count += 1 if predexp_size > 0
|
176
178
|
|
@@ -185,7 +187,7 @@ module Aerospike
|
|
185
187
|
def set_read_for_key_only(policy, key)
|
186
188
|
begin_cmd
|
187
189
|
field_count = estimate_key_size(key)
|
188
|
-
|
190
|
+
|
189
191
|
predexp_size = estimate_predexp(policy.predexp)
|
190
192
|
field_count += 1 if predexp_size > 0
|
191
193
|
|
@@ -201,7 +203,7 @@ module Aerospike
|
|
201
203
|
if bin_names && bin_names.length > 0
|
202
204
|
begin_cmd
|
203
205
|
field_count = estimate_key_size(key)
|
204
|
-
|
206
|
+
|
205
207
|
predexp_size = estimate_predexp(policy.predexp)
|
206
208
|
field_count += 1 if predexp_size > 0
|
207
209
|
|
@@ -229,7 +231,7 @@ module Aerospike
|
|
229
231
|
def set_read_header(policy, key)
|
230
232
|
begin_cmd
|
231
233
|
field_count = estimate_key_size(key)
|
232
|
-
|
234
|
+
|
233
235
|
predexp_size = estimate_predexp(policy.predexp)
|
234
236
|
field_count += 1 if predexp_size > 0
|
235
237
|
|
@@ -252,7 +254,7 @@ module Aerospike
|
|
252
254
|
def set_operate(policy, key, operations)
|
253
255
|
begin_cmd
|
254
256
|
field_count = estimate_key_size(key, policy)
|
255
|
-
|
257
|
+
|
256
258
|
predexp_size = estimate_predexp(policy.predexp)
|
257
259
|
field_count += 1 if predexp_size > 0
|
258
260
|
|
@@ -263,7 +265,7 @@ module Aerospike
|
|
263
265
|
|
264
266
|
operations.each do |operation|
|
265
267
|
case operation.op_type
|
266
|
-
when Aerospike::Operation::READ, Aerospike::Operation::CDT_READ,
|
268
|
+
when Aerospike::Operation::READ, Aerospike::Operation::CDT_READ,
|
267
269
|
Aerospike::Operation::HLL_READ, Aerospike::Operation::BIT_READ
|
268
270
|
read_attr |= INFO1_READ
|
269
271
|
|
@@ -282,7 +284,7 @@ module Aerospike
|
|
282
284
|
write_attr = INFO2_WRITE
|
283
285
|
end
|
284
286
|
|
285
|
-
if [Aerospike::Operation::HLL_MODIFY, Aerospike::Operation::HLL_READ,
|
287
|
+
if [Aerospike::Operation::HLL_MODIFY, Aerospike::Operation::HLL_READ,
|
286
288
|
Aerospike::Operation::BIT_MODIFY, Aerospike::Operation::BIT_READ].include?(operation.op_type)
|
287
289
|
record_bin_multiplicity = true
|
288
290
|
end
|
@@ -294,10 +296,10 @@ module Aerospike
|
|
294
296
|
|
295
297
|
write_attr |= INFO2_RESPOND_ALL_OPS if write_attr != 0 && record_bin_multiplicity
|
296
298
|
|
297
|
-
if write_attr
|
298
|
-
write_header_with_policy(policy, read_attr, write_attr, field_count, operations.length)
|
299
|
-
else
|
299
|
+
if write_attr == 0
|
300
300
|
write_header(policy, read_attr, write_attr, field_count, operations.length)
|
301
|
+
else
|
302
|
+
write_header_with_policy(policy, read_attr, write_attr, field_count, operations.length)
|
301
303
|
end
|
302
304
|
write_key(key, policy)
|
303
305
|
write_predexp(policy.predexp, predexp_size)
|
@@ -315,7 +317,7 @@ module Aerospike
|
|
315
317
|
def set_udf(policy, key, package_name, function_name, args)
|
316
318
|
begin_cmd
|
317
319
|
field_count = estimate_key_size(key, policy)
|
318
|
-
|
320
|
+
|
319
321
|
predexp_size = estimate_predexp(policy.predexp)
|
320
322
|
field_count += 1 if predexp_size > 0
|
321
323
|
|
@@ -335,11 +337,15 @@ module Aerospike
|
|
335
337
|
mark_compressed(policy)
|
336
338
|
end
|
337
339
|
|
338
|
-
def set_scan(policy, namespace, set_name, bin_names,
|
340
|
+
def set_scan(policy, namespace, set_name, bin_names, node_partitions)
|
339
341
|
# Estimate buffer size
|
340
342
|
begin_cmd
|
341
343
|
field_count = 0
|
342
344
|
|
345
|
+
parts_full_size = node_partitions.parts_full.length * 2
|
346
|
+
parts_partial_size = node_partitions.parts_partial.length * 20
|
347
|
+
max_records = node_partitions.record_max
|
348
|
+
|
343
349
|
if namespace
|
344
350
|
@data_offset += namespace.bytesize + FIELD_HEADER_SIZE
|
345
351
|
field_count += 1
|
@@ -349,7 +355,22 @@ module Aerospike
|
|
349
355
|
@data_offset += set_name.bytesize + FIELD_HEADER_SIZE
|
350
356
|
field_count += 1
|
351
357
|
end
|
352
|
-
|
358
|
+
|
359
|
+
if parts_full_size > 0
|
360
|
+
@data_offset += parts_full_size + FIELD_HEADER_SIZE
|
361
|
+
field_count += 1
|
362
|
+
end
|
363
|
+
|
364
|
+
if parts_partial_size > 0
|
365
|
+
@data_offset += parts_partial_size + FIELD_HEADER_SIZE
|
366
|
+
field_count += 1
|
367
|
+
end
|
368
|
+
|
369
|
+
if max_records > 0
|
370
|
+
@data_offset += 8 + FIELD_HEADER_SIZE
|
371
|
+
field_count += 1
|
372
|
+
end
|
373
|
+
|
353
374
|
if policy.records_per_second > 0
|
354
375
|
@data_offset += 4 + FIELD_HEADER_SIZE
|
355
376
|
field_count += 1
|
@@ -362,9 +383,6 @@ module Aerospike
|
|
362
383
|
# @data_offset += 2 + FIELD_HEADER_SIZE
|
363
384
|
# field_count += 1
|
364
385
|
|
365
|
-
@data_offset += partitions.length * 2 + FIELD_HEADER_SIZE
|
366
|
-
field_count += 1
|
367
|
-
|
368
386
|
# Estimate scan timeout size.
|
369
387
|
@data_offset += 4 + FIELD_HEADER_SIZE
|
370
388
|
field_count += 1
|
@@ -378,7 +396,7 @@ module Aerospike
|
|
378
396
|
size_buffer
|
379
397
|
read_attr = INFO1_READ
|
380
398
|
|
381
|
-
|
399
|
+
unless policy.include_bin_data
|
382
400
|
read_attr |= INFO1_NOBINDATA
|
383
401
|
end
|
384
402
|
|
@@ -397,10 +415,26 @@ module Aerospike
|
|
397
415
|
write_field_string(set_name, Aerospike::FieldType::TABLE)
|
398
416
|
end
|
399
417
|
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
418
|
+
if parts_full_size > 0
|
419
|
+
write_field_header(parts_full_size, Aerospike::FieldType::PID_ARRAY)
|
420
|
+
|
421
|
+
node_partitions.parts_full.each do |part|
|
422
|
+
@data_buffer.write_uint16_little_endian(part.id, @data_offset)
|
423
|
+
@data_offset+=2
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
if parts_partial_size > 0
|
428
|
+
write_field_header(parts_partial_size, Aerospike::FieldType::DIGEST_ARRAY)
|
429
|
+
|
430
|
+
node_partitions.parts_partial.each do |part|
|
431
|
+
@data_buffer.write_binary(part.digest, @data_offset)
|
432
|
+
@data_offset+=part.digest.length
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
if max_records > 0
|
437
|
+
write_field_int64(max_records, Aerospike::FieldType::MAX_RECORDS)
|
404
438
|
end
|
405
439
|
|
406
440
|
if policy.records_per_second > 0
|
@@ -422,7 +456,7 @@ module Aerospike
|
|
422
456
|
# @data_buffer.write_byte(policy.scan_percent.to_i.ord, @data_offset)
|
423
457
|
# @data_offset += 1
|
424
458
|
|
425
|
-
write_field_header(4, Aerospike::FieldType::
|
459
|
+
write_field_header(4, Aerospike::FieldType::SOCKET_TIMEOUT)
|
426
460
|
@data_buffer.write_uint32(policy.socket_timeout.to_i, @data_offset)
|
427
461
|
@data_offset += 4
|
428
462
|
|
@@ -809,6 +843,12 @@ module Aerospike
|
|
809
843
|
@data_offset += 4
|
810
844
|
end
|
811
845
|
|
846
|
+
def write_field_int64(i, ftype)
|
847
|
+
@data_buffer.write_int64(i, @data_offset+FIELD_HEADER_SIZE)
|
848
|
+
write_field_header(8, ftype)
|
849
|
+
@data_offset += 8
|
850
|
+
end
|
851
|
+
|
812
852
|
def write_field_bytes(bytes, ftype)
|
813
853
|
@data_buffer.write_binary(bytes, @data_offset+FIELD_HEADER_SIZE)
|
814
854
|
write_field_header(bytes.bytesize, ftype)
|
@@ -21,31 +21,31 @@ module Aerospike
|
|
21
21
|
|
22
22
|
module FieldType
|
23
23
|
|
24
|
-
NAMESPACE
|
25
|
-
TABLE
|
26
|
-
KEY
|
27
|
-
|
28
|
-
|
29
|
-
#
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
24
|
+
NAMESPACE = 0
|
25
|
+
TABLE = 1
|
26
|
+
KEY = 2
|
27
|
+
DIGEST_RIPE = 4
|
28
|
+
DIGEST_RIPE_ARRAY = 6
|
29
|
+
TRAN_ID = 7 # user supplied transaction id, which is simply passed back
|
30
|
+
SCAN_OPTIONS = 8
|
31
|
+
SOCKET_TIMEOUT = 9
|
32
|
+
RECORDS_PER_SECOND = 10
|
33
|
+
PID_ARRAY = 11
|
34
|
+
DIGEST_ARRAY = 12
|
35
|
+
MAX_RECORDS = 13
|
36
|
+
BVAL_ARRAY = 15
|
37
|
+
INDEX_NAME = 21
|
38
|
+
INDEX_RANGE = 22
|
39
|
+
INDEX_CONTEXT = 23
|
40
|
+
INDEX_TYPE = 26
|
41
|
+
UDF_PACKAGE_NAME = 30
|
42
|
+
UDF_FUNCTION = 31
|
43
|
+
UDF_ARGLIST = 32
|
44
|
+
UDF_OP = 33
|
45
|
+
QUERY_BINLIST = 40
|
46
|
+
BATCH_INDEX = 41
|
47
|
+
BATCH_INDEX_WITH_SET = 42
|
48
|
+
FILTER_EXP = 43
|
49
49
|
|
50
50
|
end # module
|
51
51
|
|
@@ -69,7 +69,7 @@ module Aerospike
|
|
69
69
|
|
70
70
|
result = @data_buffer.read(RESULT_CODE)
|
71
71
|
|
72
|
-
if result != 0
|
72
|
+
if result != 0
|
73
73
|
return if result == Aerospike::ResultCode::SECURITY_NOT_ENABLED
|
74
74
|
raise Exceptions::Aerospike.new(result, "Authentication failed")
|
75
75
|
end
|
@@ -128,11 +128,11 @@ module Aerospike
|
|
128
128
|
def authenticate_via_token(conn, cluster)
|
129
129
|
@data_offset = 8
|
130
130
|
policy = cluster.client_policy
|
131
|
-
if policy.auth_mode
|
131
|
+
if policy.auth_mode == Aerospike::AuthMode::PKI
|
132
|
+
write_header(AUTHENTICATE, 1)
|
133
|
+
else
|
132
134
|
write_header(AUTHENTICATE, 2)
|
133
135
|
write_field_str(USER, policy.user)
|
134
|
-
else
|
135
|
-
write_header(AUTHENTICATE, 1)
|
136
136
|
end
|
137
137
|
|
138
138
|
write_field_bytes(SESSION_TOKEN, cluster.session_token) if cluster.session_token
|