aerospike 3.0.0 → 4.1.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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +35 -0
  3. data/README.md +13 -9
  4. data/lib/aerospike/batch_attr.rb +292 -0
  5. data/lib/aerospike/batch_delete.rb +48 -0
  6. data/lib/aerospike/batch_read.rb +97 -0
  7. data/lib/aerospike/batch_record.rb +83 -0
  8. data/lib/aerospike/batch_results.rb +38 -0
  9. data/lib/aerospike/batch_udf.rb +76 -0
  10. data/lib/aerospike/batch_write.rb +79 -0
  11. data/lib/aerospike/cdt/bit_operation.rb +4 -5
  12. data/lib/aerospike/cdt/map_return_type.rb +8 -0
  13. data/lib/aerospike/client.rb +37 -51
  14. data/lib/aerospike/cluster.rb +50 -46
  15. data/lib/aerospike/command/batch_index_command.rb +7 -11
  16. data/lib/aerospike/command/batch_index_node.rb +3 -4
  17. data/lib/aerospike/command/batch_operate_command.rb +151 -0
  18. data/lib/aerospike/command/batch_operate_node.rb +51 -0
  19. data/lib/aerospike/command/command.rb +125 -98
  20. data/lib/aerospike/command/single_command.rb +1 -1
  21. data/lib/aerospike/exp/exp.rb +39 -41
  22. data/lib/aerospike/exp/exp_bit.rb +24 -24
  23. data/lib/aerospike/exp/exp_hll.rb +12 -12
  24. data/lib/aerospike/exp/exp_list.rb +101 -92
  25. data/lib/aerospike/exp/exp_map.rb +116 -119
  26. data/lib/aerospike/exp/operation.rb +2 -2
  27. data/lib/aerospike/info.rb +2 -4
  28. data/lib/aerospike/node.rb +7 -3
  29. data/lib/aerospike/operation.rb +38 -0
  30. data/lib/aerospike/policy/batch_delete_policy.rb +71 -0
  31. data/lib/aerospike/policy/batch_policy.rb +53 -4
  32. data/lib/aerospike/policy/batch_read_policy.rb +55 -0
  33. data/lib/aerospike/policy/batch_udf_policy.rb +75 -0
  34. data/lib/aerospike/policy/batch_write_policy.rb +105 -0
  35. data/lib/aerospike/policy/policy.rb +20 -40
  36. data/lib/aerospike/policy/query_duration.rb +48 -0
  37. data/lib/aerospike/policy/query_policy.rb +13 -8
  38. data/lib/aerospike/query/server_command.rb +1 -0
  39. data/lib/aerospike/query/statement.rb +5 -21
  40. data/lib/aerospike/result_code.rb +7 -1
  41. data/lib/aerospike/utils/buffer.rb +15 -15
  42. data/lib/aerospike/version.rb +1 -1
  43. data/lib/aerospike.rb +14 -12
  44. metadata +17 -14
  45. data/lib/aerospike/command/batch_direct_command.rb +0 -105
  46. data/lib/aerospike/command/batch_direct_exists_command.rb +0 -51
  47. data/lib/aerospike/command/batch_direct_node.rb +0 -40
  48. data/lib/aerospike/query/pred_exp/and_or.rb +0 -32
  49. data/lib/aerospike/query/pred_exp/geo_json_value.rb +0 -41
  50. data/lib/aerospike/query/pred_exp/integer_value.rb +0 -32
  51. data/lib/aerospike/query/pred_exp/op.rb +0 -27
  52. data/lib/aerospike/query/pred_exp/regex.rb +0 -32
  53. data/lib/aerospike/query/pred_exp/regex_flags.rb +0 -23
  54. data/lib/aerospike/query/pred_exp/string_value.rb +0 -29
  55. data/lib/aerospike/query/pred_exp.rb +0 -192
@@ -0,0 +1,71 @@
1
+ # encoding: utf-8
2
+ # Copyright 2014-2024 Aerospike, Inc.
3
+ #
4
+ # Portions may be licensed to Aerospike, Inc. under one or more contributor
5
+ # license agreements.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License") you may not
8
+ # use this file except in compliance with the License. You may obtain a copy of
9
+ # the License at http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14
+ # License for the specific language governing permissions and limitations under
15
+ # the License.
16
+
17
+ module Aerospike
18
+
19
+ # Policy attributes used in batch delete commands.
20
+ class BatchDeletePolicy
21
+ attr_accessor :filter_exp, :commit_level, :generation_policy, :generation, :durable_delete, :send_key
22
+
23
+ def initialize(opt = {})
24
+ # Optional expression filter. If filter_exp exists and evaluates to false, the specific batch key
25
+ # request is not performed and {BatchRecord#result_code} is set to
26
+ # {ResultCode#FILTERED_OUT}.
27
+ #
28
+ # If exists, this filter overrides the batch parent filter {Policy#filter_exp}
29
+ # for the specific key in batch commands that allow a different policy per key.
30
+ # Otherwise, this filter is ignored.
31
+ #
32
+ # Default: nil
33
+ @filter_exp = opt[:filter_exp]
34
+
35
+ # Desired consistency guarantee when committing a transaction on the server. The default
36
+ # (COMMIT_ALL) indicates that the server should wait for master and all replica commits to
37
+ # be successful before returning success to the client.
38
+ #
39
+ # Default: CommitLevel.COMMIT_ALL
40
+ @commit_level = opt[:commit_level] || CommitLevel::COMMIT_ALL
41
+
42
+ # Qualify how to handle record deletes based on record generation. The default (NONE)
43
+ # indicates that the generation is not used to restrict deletes.
44
+ #
45
+ # Default: GenerationPolicy.NONE
46
+ @generation_policy = opt[:generation_policy] || GenerationPolicy::NONE
47
+
48
+ # Expected generation. Generation is the number of times a record has been modified
49
+ # (including creation) on the server. This field is only relevant when generationPolicy
50
+ # is not NONE.
51
+ #
52
+ # Default: 0
53
+ @generation = opt[:generation] || 0
54
+
55
+ # If the transaction results in a record deletion, leave a tombstone for the record.
56
+ # This prevents deleted records from reappearing after node failures.
57
+ # Valid for Aerospike Server Enterprise Edition only.
58
+ #
59
+ # Default: false (do not tombstone deleted records).
60
+ @durable_delete = opt[:durable_delete] || false
61
+
62
+ # Send user defined key in addition to hash digest.
63
+ # If true, the key will be stored with the tombstone record on the server.
64
+ #
65
+ # Default: false (do not send the user defined key)
66
+ @send_key = opt[:send_key] || false
67
+
68
+ self
69
+ end
70
+ end
71
+ end
@@ -21,12 +21,14 @@ module Aerospike
21
21
 
22
22
  # Container object for batch policy command.
23
23
  class BatchPolicy < Policy
24
-
25
- attr_accessor :use_batch_direct
24
+ attr_accessor :allow_inline_ssd, :respond_all_keys, :send_key
26
25
 
27
26
  def initialize(opt={})
28
- super(opt)
27
+ super
29
28
 
29
+ # [:nodoc:]
30
+ # DEPRECATED
31
+ # This setting does not have any effect anymore.
30
32
  # Use old batch direct protocol where batch reads are handled by direct
31
33
  # low-level batch server database routines. The batch direct protocol can
32
34
  # be faster when there is a single namespace. But there is one important
@@ -38,11 +40,58 @@ module Aerospike
38
40
  # index protocol will perform this record proxy when necessary.
39
41
  #
40
42
  # Default: false (use new batch index protocol if server supports it)
41
- @use_batch_direct = opt.fetch(:use_batch_direct) { false }
43
+ @use_batch_direct = opt.fetch(:use_batch_direct, false)
44
+
45
+
46
+ # Allow batch to be processed immediately in the server's receiving thread for SSD
47
+ # namespaces. If false, the batch will always be processed in separate service threads.
48
+ # Server versions &lt; 6.0 ignore this field.
49
+ #
50
+ # Inline processing can introduce the possibility of unfairness because the server
51
+ # can process the entire batch before moving onto the next command.
52
+ #
53
+ # Default: false
54
+ @allow_inline_ssd = opt.fetch(:allow_inline_ssd, false)
55
+
56
+
57
+ # Should all batch keys be attempted regardless of errors. This field is used on both
58
+ # the client and server. The client handles node specific errors and the server handles
59
+ # key specific errors.
60
+ #
61
+ # If true, every batch key is attempted regardless of previous key specific errors.
62
+ # Node specific errors such as timeouts stop keys to that node, but keys directed at
63
+ # other nodes will continue to be processed.
64
+ #
65
+ # If false, the server will stop the batch to its node on most key specific errors.
66
+ # The exceptions are {ResultCode#KEY_NOT_FOUND_ERROR} and
67
+ # {ResultCode#FILTERED_OUT} which never stop the batch.
68
+ # The client will stop the entire batch on node specific errors. The client will
69
+ # not stop the entire batch commands run in parallel.
70
+ #
71
+ # Server versions < 6.0 do not support this field and treat this value as false
72
+ # for key specific errors.
73
+ #
74
+ # Default: true
75
+ @respond_all_keys = opt.fetch(:respond_all_keys, true)
76
+
77
+
78
+ # Send user defined key in addition to hash digest on a record put.
79
+ # The default is to _not_ send the user defined key.
80
+ @send_key = opt.fetch(:send_key, false)
42
81
 
43
82
  self
44
83
  end
45
84
 
85
+ def self.read_default
86
+ BatchPolicy.new
87
+ end
88
+
89
+ def self.write_default
90
+ bp = BatchPolicy.new
91
+ bp.max_retries = 0
92
+ bp
93
+ end
94
+
46
95
  end # class
47
96
 
48
97
  end # module
@@ -0,0 +1,55 @@
1
+ # Copyright 2014-2020 Aerospike, Inc.
2
+ #
3
+ # Portions may be licensed to Aerospike, Inc. under one or more contributor
4
+ # license agreements.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may not
7
+ # use this file except in compliance with the License. You may obtain a copy of
8
+ # the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15
+ # License for the specific language governing permissions and limitations under
16
+ # the License.
17
+
18
+ module Aerospike
19
+
20
+ # Policy attributes used in batch read commands.
21
+ class BatchReadPolicy
22
+
23
+ attr_accessor :filter_exp, :read_touch_ttl_percent
24
+
25
+ def initialize(opt={})
26
+ # Optional expression filter. If filter_exp exists and evaluates to false, the specific batch key
27
+ # request is not performed and {BatchRecord#result_code} is set to
28
+ # {ResultCode#FILTERED_OUT}.
29
+ #
30
+ # If exists, this filter overrides the batch parent filter {Policy#filter_exp}
31
+ # for the specific key in batch commands that allow a different policy per key.
32
+ # Otherwise, this filter is ignored.
33
+ #
34
+ # Default: nil
35
+ @filter_exp = opt[:filter_exp]
36
+
37
+ # Determines how record TTL (time to live) is affected on reads. When enabled, the server can
38
+ # efficiently operate as a read-based LRU cache where the least recently used records are expired.
39
+ # The value is expressed as a percentage of the TTL sent on the most recent write such that a read
40
+ # within this interval of the record’s end of life will generate a touch.
41
+ #
42
+ # For example, if the most recent write had a TTL of 10 hours and read_touch_ttl_percent is set to
43
+ # 80, the next read within 8 hours of the record's end of life (equivalent to 2 hours after the most
44
+ # recent write) will result in a touch, resetting the TTL to another 10 hours.
45
+ #
46
+ # Values:
47
+ #
48
+ # 0 : Use server config default-read-touch-ttl-pct for the record's namespace/set.
49
+ # -1 : Do not reset record TTL on reads.
50
+ # 1 - 100 : Reset record TTL on reads when within this percentage of the most recent write TTL.
51
+ # Default: 0
52
+ @read_touch_ttl_percent = opt[:read_touch_ttl_percent] || 0
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,75 @@
1
+ # Copyright 2014-2023 Aerospike, Inc.
2
+ #
3
+ # Portions may be licensed to Aerospike, Inc. under one or more contributor
4
+ # license agreements.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may not
7
+ # use this file except in compliance with the License. You may obtain a copy of
8
+ # the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15
+ # License for the specific language governing permissions and limitations under
16
+ # the License.
17
+
18
+ module Aerospike
19
+
20
+ # Policy attributes used in batch UDF execute commands.
21
+ class BatchUDFPolicy
22
+
23
+ attr_accessor :filter_exp, :commit_level, :ttl, :durable_delete, :send_key
24
+
25
+ alias expiration ttl
26
+ alias expiration= ttl=
27
+
28
+ def initialize(opt={})
29
+ # Optional expression filter. If filter_exp exists and evaluates to false, the specific batch key
30
+ # request is not performed and {BatchRecord#resultCode} is set to
31
+ # {ResultCode#FILTERED_OUT}.
32
+ #
33
+ # If exists, this filter overrides the batch parent filter {Policy#filter_exp}
34
+ # for the specific key in batch commands that allow a different policy per key.
35
+ # Otherwise, this filter is ignored.
36
+ #
37
+ # Default: nil
38
+ @filter_exp = opt[:filter_exp]
39
+
40
+ # Desired consistency guarantee when committing a transaction on the server. The default
41
+ # (COMMIT_ALL) indicates that the server should wait for master and all replica commits to
42
+ # be successful before returning success to the client.
43
+ #
44
+ # Default: CommitLevel::COMMIT_ALL
45
+ @commit_level = opt.fetch(:commit_level, CommitLevel::COMMIT_ALL)
46
+
47
+ # Record expiration; also known as time-to-live (TTL).
48
+ # Seconds record will live before being removed by the server.
49
+ #
50
+ # Supported values:
51
+ # - `Aerospike::TTL::NEVER_EXPIRE`: Never expire record; requires Aerospike 2
52
+ # server versions >= 2.7.2 or Aerospike 3 server versions >= 3.1.4. Do
53
+ # not use for older servers.
54
+ # - `Aerospike::TTL::NAMESPACE_DEFAULT`: Default to namespace configuration
55
+ # variable "default-ttl" on the server.
56
+ # - `Aerospike::TTL::DONT_UPDATE`: Do not change a record's expiration date
57
+ # when updating the record. Requires Aerospike server v3.10.1 or later.
58
+ # - Any value > 0: Actual time-to-live in seconds.
59
+ @ttl = opt[:ttl] || opt[:expiration] || 0
60
+
61
+ # If the transaction results in a record deletion, leave a tombstone for the record.
62
+ # This prevents deleted records from reappearing after node failures.
63
+ # Valid for Aerospike Server Enterprise Edition only.
64
+ #
65
+ # Default: false (do not tombstone deleted records).
66
+ @durable_delete = opt.fetch(:durable_delete, false)
67
+
68
+ # Send user defined key in addition to hash digest.
69
+ # If true, the key will be stored with the record on the server.
70
+ #
71
+ # Default: false (do not send the user defined key)
72
+ @send_key = opt.fetch(:send_key, false)
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,105 @@
1
+ # Copyright 2014-2023 Aerospike, Inc.
2
+ #
3
+ # Portions may be licensed to Aerospike, Inc. under one or more contributor
4
+ # license agreements.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License"); you may not
7
+ # use this file except in compliance with the License. You may obtain a copy of
8
+ # the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14
+ # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15
+ # License for the specific language governing permissions and limitations under
16
+ # the License.
17
+
18
+ module Aerospike
19
+
20
+
21
+ # Policy attributes used in batch write commands.
22
+ class BatchWritePolicy
23
+
24
+ attr_accessor :filter_exp, :record_exists_action, :commit_level,
25
+ :generation_policy, :generation, :ttl, :durable_delete,
26
+ :send_key
27
+
28
+ alias expiration ttl
29
+ alias expiration= ttl=
30
+
31
+ def initialize(opt={})
32
+ # Optional expression filter. If filter_exp exists and evaluates to false, the specific batch key
33
+ # request is not performed and {BatchRecord#result_code} is set to
34
+ # {ResultCode#FILTERED_OUT}.
35
+ #
36
+ # If exists, this filter overrides the batch parent filter {Policy#filter_exp}
37
+ # for the specific key in batch commands that allow a different policy per key.
38
+ # Otherwise, this filter is ignored.
39
+ #
40
+ # Default: nil
41
+ @filter_exp = opt[:filter_exp]
42
+
43
+ # Qualify how to handle writes where the record already exists.
44
+ #
45
+ # Default: RecordExistsAction::UPDATE
46
+ @record_exists_action = opt.fetch(:record_exists_action, RecordExistsAction::UPDATE)
47
+
48
+ # Desired consistency guarantee when committing a transaction on the server. The default
49
+ # (COMMIT_ALL) indicates that the server should wait for master and all replica commits to
50
+ # be successful before returning success to the client.
51
+ #
52
+ # Default: CommitLevel::COMMIT_ALL
53
+ @commit_level = opt.fetch(:commit_level, CommitLevel::COMMIT_ALL)
54
+
55
+ # Qualify how to handle record writes based on record generation. The default (NONE)
56
+ # indicates that the generation is not used to restrict writes.
57
+ #
58
+ # The server does not support this field for UDF execute() calls. The read-modify-write
59
+ # usage model can still be enforced inside the UDF code itself.
60
+ #
61
+ # Default: GenerationPolicy::NONE
62
+ @generation_policy = opt.fetch(:generation_policy, GenerationPolicy::NONE)
63
+
64
+ # Expected generation. Generation is the number of times a record has been modified
65
+ # (including creation) on the server. If a write operation is creating a record,
66
+ # the expected generation would be <code>0</code>. This field is only relevant when
67
+ # generationPolicy is not NONE.
68
+ #
69
+ # The server does not support this field for UDF execute() calls. The read-modify-write
70
+ # usage model can still be enforced inside the UDF code itself.
71
+ #
72
+ # Default: 0
73
+ @generation = opt.fetch(:generation, 0)
74
+
75
+ # Record expiration; also known as time-to-live (TTL).
76
+ # Seconds record will live before being removed by the server.
77
+ #
78
+ # Supported values:
79
+ # - `Aerospike::TTL::NEVER_EXPIRE`: Never expire record; requires Aerospike 2
80
+ # server versions >= 2.7.2 or Aerospike 3 server versions >= 3.1.4. Do
81
+ # not use for older servers.
82
+ # - `Aerospike::TTL::NAMESPACE_DEFAULT`: Default to namespace configuration
83
+ # variable "default-ttl" on the server.
84
+ # - `Aerospike::TTL::DONT_UPDATE`: Do not change a record's expiration date
85
+ # when updating the record. Requires Aerospike server v3.10.1 or later.
86
+ # - Any value > 0: Actual time-to-live in seconds.
87
+ @ttl = opt[:ttl] || opt[:expiration] || 0
88
+
89
+ # If the transaction results in a record deletion, leave a tombstone for the record.
90
+ # This prevents deleted records from reappearing after node failures.
91
+ # Valid for Aerospike Server Enterprise Edition only.
92
+ #
93
+ # Default: false (do not tombstone deleted records).
94
+ @durable_delete = opt.fetch(:durable_delete, false)
95
+
96
+ # Send user defined key in addition to hash digest.
97
+ # If true, the key will be stored with the record on the server.
98
+ #
99
+ # Default: false (do not send the user defined key)
100
+ @send_key = opt.fetch(:send_key, false)
101
+
102
+ self
103
+ end
104
+ end
105
+ end
@@ -22,7 +22,7 @@ module Aerospike
22
22
  # Container object for client policy command.
23
23
  class Policy
24
24
  attr_accessor :filter_exp, :priority, :timeout, :max_retries, :sleep_between_retries, :consistency_level,
25
- :predexp, :fail_on_filtered_out, :replica, :use_compression, :socket_timeout
25
+ :fail_on_filtered_out, :replica, :use_compression, :socket_timeout, :read_touch_ttl_percent
26
26
 
27
27
  alias total_timeout timeout
28
28
  alias total_timeout= timeout=
@@ -31,7 +31,7 @@ module Aerospike
31
31
  # Container object for transaction policy attributes used in all database
32
32
  # operation calls.
33
33
 
34
- # Optional expression filter. If filterExp exists and evaluates to false, the
34
+ # Optional expression filter. If filter_exp exists and evaluates to false, the
35
35
  # transaction is ignored.
36
36
  #
37
37
  # Default: nil
@@ -57,44 +57,7 @@ module Aerospike
57
57
  # TODO: Remove for next major release
58
58
  @priority = opt[:priority] || Priority::DEFAULT
59
59
 
60
- # Set optional predicate expression filters in postfix notation.
61
- # Predicate expression filters are applied on the query results on the server.
62
- # Predicate expression filters may occur on any bin in the record.
63
- # Requires Aerospike Server versions >= 3.12
64
- #
65
- # Postfix notation is described here: http://wiki.c2.com/?PostfixNotation
66
- #
67
- # Example:
68
- #
69
- # (c >= 11 and c <= 20) or (d > 3 and (d < 5)
70
- # policy.predexp = [
71
- # PredExp.integer_bin("c"),
72
- # PredExp.integer_value(11),
73
- # PredExp.integer_greater_eq(),
74
- # PredExp.integer_bin("c"),
75
- # PredExp.integer_value(20),
76
- # PredExp.integer_less_eq(),
77
- # PredExp.and(2),
78
- # PredExp.integer_bin("d"),
79
- # PredExp.integer_value(3),
80
- # PredExp.integer_greater(),
81
- # PredExp.integer_bin("d"),
82
- # PredExp.integer_value(5),
83
- # PredExp.integer_less(),
84
- # PredExp.and(2),
85
- # PredExp.or(2)
86
- # ]
87
- #
88
- # # Record last update time > 2017-01-15
89
- # policy.predexp = [
90
- # PredExp.rec_last_update(),
91
- # PredExp.integer_value(Time.new(2017, 1, 15).to_i),
92
- # PredExp.integer_greater(),
93
- # PredExp.integer_greater()
94
- # ]
95
- @predexp = opt[:predexp] || nil
96
-
97
- # Throw exception if @predexp is defined and that filter evaluates
60
+ # Throw exception if @filter_exp is defined and that filter evaluates
98
61
  # to false (transaction ignored). The Aerospike::Exceptions::Aerospike
99
62
  # will contain result code Aerospike::ResultCode::FILTERED_OUT.
100
63
  # This field is not applicable to batch, scan or query commands.
@@ -132,6 +95,23 @@ module Aerospike
132
95
  # has not yet been exceeded.
133
96
  @max_retries = opt[:max_retries] || 2
134
97
 
98
+ # Determines how record TTL (time to live) is affected on reads. When enabled, the server can
99
+ # efficiently operate as a read-based LRU cache where the least recently used records are expired.
100
+ # The value is expressed as a percentage of the TTL sent on the most recent write such that a read
101
+ # within this interval of the record’s end of life will generate a touch.
102
+ #
103
+ # For example, if the most recent write had a TTL of 10 hours and read_touch_ttl_percent is set to
104
+ # 80, the next read within 8 hours of the record's end of life (equivalent to 2 hours after the most
105
+ # recent write) will result in a touch, resetting the TTL to another 10 hours.
106
+ #
107
+ # Values:
108
+ #
109
+ # 0 : Use server config default-read-touch-ttl-pct for the record's namespace/set.
110
+ # -1 : Do not reset record TTL on reads.
111
+ # 1 - 100 : Reset record TTL on reads when within this percentage of the most recent write TTL.
112
+ # Default: 0
113
+ @read_touch_ttl_percent = opt[:read_touch_ttl_percent] || 0
114
+
135
115
  # Duration to sleep between retries if a transaction fails and the
136
116
  # timeout was not exceeded. Enter zero to skip sleep.
137
117
  @sleep_between_retries = opt[:sleep_between_retries] || 0.5
@@ -0,0 +1,48 @@
1
+ # encoding: utf-8
2
+ # Copyright 2014-2024 Aerospike, Inc.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http:#www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+
16
+ module Aerospike
17
+
18
+ # Defines the expected query duration. The server treats the query in different ways depending on the expected duration.
19
+ # This enum is ignored for aggregation queries, background queries and server versions < 6.0.
20
+ module QueryDuration
21
+
22
+ # The query is expected to return more than 100 records per node. The server optimizes for a large record set in
23
+ # the following ways:
24
+ #
25
+ # Allow query to be run in multiple threads using the server's query threading configuration.
26
+ # Do not relax read consistency for AP namespaces.
27
+ # Add the query to the server's query monitor.
28
+ # Do not add the overall latency to the server's latency histogram.
29
+ # Do not allow server timeouts.
30
+ LONG = 0
31
+
32
+ # The query is expected to return less than 100 records per node. The server optimizes for a small record set in
33
+ # the following ways:
34
+ # Always run the query in one thread and ignore the server's query threading configuration.
35
+ # Allow query to be inlined directly on the server's service thread.
36
+ # Relax read consistency for AP namespaces.
37
+ # Do not add the query to the server's query monitor.
38
+ # Add the overall latency to the server's latency histogram.
39
+ # Allow server timeouts. The default server timeout for a short query is 1 second.
40
+ SHORT = 1
41
+
42
+ # Treat query as a LONG query, but relax read consistency for AP namespaces.
43
+ # This value is treated exactly like LONG for server versions < 7.1.
44
+ LONG_RELAX_AP = 2
45
+
46
+ end # module
47
+
48
+ end # module
@@ -15,6 +15,7 @@
15
15
  # License for the specific language governing permissions and limitations under
16
16
  # the License.
17
17
 
18
+ require 'aerospike/policy/query_duration'
18
19
  require 'aerospike/policy/policy'
19
20
 
20
21
  module Aerospike
@@ -22,16 +23,10 @@ module Aerospike
22
23
  # Container object for query policy command.
23
24
  class QueryPolicy < Policy
24
25
 
25
- attr_accessor :concurrent_nodes
26
- attr_accessor :max_records
27
- attr_accessor :include_bin_data
28
- attr_accessor :record_queue_size
29
- attr_accessor :records_per_second
30
- attr_accessor :socket_timeout
31
- attr_accessor :short_query
26
+ attr_accessor :concurrent_nodes, :max_records, :include_bin_data, :record_queue_size, :records_per_second, :socket_timeout, :short_query, :expected_duration
32
27
 
33
28
  def initialize(opt={})
34
- super(opt)
29
+ super
35
30
 
36
31
  # Indicates if bin data is retrieved. If false, only record digests (and
37
32
  # user keys if stored on the server) are retrieved.
@@ -74,11 +69,21 @@ module Aerospike
74
69
  # Default is 0
75
70
  @records_per_second = opt[:records_per_second] || 0
76
71
 
72
+ # Expected query duration. The server treats the query in different ways depending on the expected duration.
73
+ # This field is ignored for aggregation queries, background queries and server versions < 6.0.
74
+ #
75
+ # Default: QueryDuration::LONG
76
+ @expected_duration = opt[:expected_duration] || QueryDuration::LONG
77
+
78
+ # DEPRECATED
77
79
  # Detemine wether query expected to return less than 100 records.
78
80
  # If true, the server will optimize the query for a small record set.
79
81
  # This field is ignored for aggregation queries, background queries
80
82
  # and server versions 6.0+.
81
83
  #
84
+ # This field is deprecated and will eventually be removed. Use {expected_duration} instead.
85
+ # For backwards compatibility: If ShortQuery is true, the query is treated as a short query and
86
+ # {expected_duration} is ignored. If {short_query} is false, {expected_duration} is used as defaults to {Policy#QueryDuration#LONG}.
82
87
  # Default: false
83
88
  @short_query = opt[:short_query] ||false
84
89
 
@@ -38,6 +38,7 @@ module Aerospike
38
38
 
39
39
  def parse_row(result_code)
40
40
  field_count = @data_buffer.read_int16(18)
41
+ result_code = @data_buffer.read(5).ord & 0xFF
41
42
  skip_key(field_count)
42
43
 
43
44
  if result_code != 0
@@ -21,9 +21,7 @@ module Aerospike
21
21
  # index name, filters, and operations.
22
22
  class Statement
23
23
 
24
- attr_accessor :namespace, :set_name, :index_name, :bin_names, :task_id
25
- attr_accessor :filters, :package_name, :function_name, :function_args, :operations
26
- attr_accessor :predexp, :return_data, :records_per_second
24
+ attr_accessor :namespace, :set_name, :index_name, :bin_names, :task_id, :filters, :package_name, :function_name, :function_args, :operations, :return_data, :records_per_second
27
25
 
28
26
  def initialize(namespace, set_name, bin_names=[])
29
27
  # Namespace determines query Namespace
@@ -46,16 +44,6 @@ module Aerospike
46
44
  # aggregation function.
47
45
  @filters = []
48
46
 
49
- # Predicate expressions in postfix notation. If the expression is evaluated to false,
50
- # the record will be ommited in the results.
51
- #
52
- # This method is redundant because PredExp can now be set in the base Policy for
53
- # any transaction (including queries).
54
- #
55
- # NOTE : Policy.predexp takes precedence to this value. This value will be
56
- # deprecated in the future.
57
- @predexp = nil
58
-
59
47
  @package_name = nil
60
48
  @function_name = nil
61
49
  @function_args = nil
@@ -83,27 +71,23 @@ module Aerospike
83
71
  end
84
72
 
85
73
  def is_scan?
86
- return (filters.nil? || (filters.empty?))
74
+ filters.nil? || filters.empty?
87
75
  end
88
76
 
89
77
  def set_task_id
90
- while @task_id == 0
91
- @task_id = rand(RAND_MAX)
92
- end
78
+ @task_id = rand(RAND_MAX) while @task_id == 0
93
79
  end
94
80
 
95
81
  def reset_task_id
96
82
  @task_id = rand(RAND_MAX)
97
- while @task_id == 0
98
- @task_id = rand(RAND_MAX)
99
- end
83
+ @task_id = rand(RAND_MAX) while @task_id == 0
100
84
  end
101
85
 
102
86
 
103
87
 
104
88
  private
105
89
 
106
- RAND_MAX = 2**63 - 1
90
+ RAND_MAX = (2**63) - 1
107
91
 
108
92
  end # class
109
93
  end
@@ -168,6 +168,9 @@ module Aerospike
168
168
  # Write command loses conflict to XDR.
169
169
  LOST_CONFLICT = 28
170
170
 
171
+ # Write can't complete until XDR finishes shipping.
172
+ XDR_KEY_BUSY = 32
173
+
171
174
  # There are no more records left for query.
172
175
  QUERY_END = 50
173
176
 
@@ -445,6 +448,10 @@ module Aerospike
445
448
  when LOST_CONFLICT
446
449
  "Write command loses conflict to XDR."
447
450
 
451
+ # Write can't complete until XDR finishes shipping.
452
+ when XDR_KEY_BUSY
453
+ "XDR key busy"
454
+
448
455
  when QUERY_END
449
456
  "Query end"
450
457
 
@@ -580,7 +587,6 @@ module Aerospike
580
587
  else
581
588
  "ResultCode #{code} unknown in the client. Please file a github issue."
582
589
  end # case
583
-
584
590
  end
585
591
 
586
592
  end # class