aerospike 2.13.0 → 2.18.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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +44 -1
  3. data/lib/aerospike.rb +14 -0
  4. data/lib/aerospike/cdt/bit_operation.rb +376 -0
  5. data/lib/aerospike/cdt/bit_overflow_action.rb +46 -0
  6. data/lib/aerospike/cdt/bit_policy.rb +36 -0
  7. data/lib/aerospike/cdt/bit_resize_flags.rb +44 -0
  8. data/lib/aerospike/cdt/bit_write_flags.rb +51 -0
  9. data/lib/aerospike/cdt/context.rb +113 -0
  10. data/lib/aerospike/cdt/hll_operation.rb +200 -0
  11. data/lib/aerospike/cdt/hll_policy.rb +34 -0
  12. data/lib/aerospike/cdt/hll_write_flags.rb +53 -0
  13. data/lib/aerospike/cdt/list_operation.rb +155 -96
  14. data/lib/aerospike/cdt/list_order.rb +7 -0
  15. data/lib/aerospike/cdt/list_sort_flags.rb +10 -2
  16. data/lib/aerospike/cdt/map_operation.rb +179 -92
  17. data/lib/aerospike/cdt/map_order.rb +3 -3
  18. data/lib/aerospike/client.rb +24 -7
  19. data/lib/aerospike/cluster.rb +47 -0
  20. data/lib/aerospike/cluster/rack_parser.rb +117 -0
  21. data/lib/aerospike/command/batch_direct_command.rb +1 -0
  22. data/lib/aerospike/command/batch_index_command.rb +1 -0
  23. data/lib/aerospike/command/command.rb +76 -7
  24. data/lib/aerospike/command/multi_command.rb +44 -1
  25. data/lib/aerospike/command/read_command.rb +34 -2
  26. data/lib/aerospike/command/touch_command.rb +34 -1
  27. data/lib/aerospike/features.rb +5 -0
  28. data/lib/aerospike/node.rb +18 -1
  29. data/lib/aerospike/node/rebalance.rb +50 -0
  30. data/lib/aerospike/node/refresh/info.rb +4 -1
  31. data/lib/aerospike/node/refresh/racks.rb +47 -0
  32. data/lib/aerospike/node/refresh/reset.rb +1 -0
  33. data/lib/aerospike/node/verify/rebalance_generation.rb +43 -0
  34. data/lib/aerospike/operation.rb +7 -2
  35. data/lib/aerospike/policy/client_policy.rb +15 -0
  36. data/lib/aerospike/policy/policy.rb +11 -3
  37. data/lib/aerospike/policy/replica.rb +7 -0
  38. data/lib/aerospike/result_code.rb +102 -0
  39. data/lib/aerospike/socket/base.rb +3 -2
  40. data/lib/aerospike/utils/buffer.rb +13 -3
  41. data/lib/aerospike/utils/unpacker.rb +2 -2
  42. data/lib/aerospike/value/particle_type.rb +1 -1
  43. data/lib/aerospike/value/value.rb +107 -5
  44. data/lib/aerospike/version.rb +1 -1
  45. metadata +15 -2
@@ -24,7 +24,7 @@ module Aerospike
24
24
  class Policy
25
25
 
26
26
  attr_accessor :priority, :timeout, :max_retries, :sleep_between_retries, :consistency_level,
27
- :predexp, :fail_on_filtered_out, :replica
27
+ :predexp, :fail_on_filtered_out, :replica, :use_compression
28
28
 
29
29
  def initialize(opt={})
30
30
  # Container object for transaction policy attributes used in all database
@@ -89,9 +89,17 @@ module Aerospike
89
89
  # to the node containing the key's master partition.
90
90
  #
91
91
  # Default to sending read commands to the node containing the key's master partition.
92
- @replica = opt[:replica] || Aerospike::Replica::MASTER;
92
+ @replica = opt[:replica] || Aerospike::Replica::MASTER
93
93
 
94
- # Transaction timeout.
94
+ # Use zlib compression on write or batch read commands when the command buffer size is greater
95
+ # than 128 bytes. In addition, tell the server to compress its response on read commands.
96
+ # The server response compression threshold is also 128 bytes.
97
+ #
98
+ # This option will increase cpu and memory usage (for extra compressed buffers), but
99
+ # decrease the size of data sent over the network.
100
+ @use_compression = opt[:use_compression] || false
101
+
102
+ # Transaction timeout.
95
103
  # This timeout is used to set the socket timeout and is also sent to the
96
104
  # server along with the transaction in the wire protocol.
97
105
  # Default to no timeout (0).
@@ -28,6 +28,13 @@ module Aerospike
28
28
  # Policy#retryOnTimeout is true, try nodes containing prole partition.
29
29
  SEQUENCE = 2
30
30
 
31
+ # Try node on the same rack as the client first. If there are no nodes on the
32
+ # same rack, use SEQUENCE instead.
33
+ #
34
+ # ClientPolicy#rack_aware, ClientPolicy#rack_id, and server rack
35
+ # configuration must also be set to enable this functionality.
36
+ PREFER_RACK = 3
37
+
31
38
  # Distribute reads across all nodes in cluster in round-robin fashion.
32
39
  # This option is useful when the replication factor equals the number
33
40
  # of nodes in the cluster and the overhead of requesting proles is not desired.
@@ -60,6 +60,10 @@ module Aerospike
60
60
  # exists.
61
61
  KEY_EXISTS_ERROR = 5
62
62
 
63
+ # Bin already exists on a create-only operation.
64
+ BIN_EXISTS_ERROR = 6
65
+
66
+
63
67
  # Expected cluster ID was not received.
64
68
  CLUSTER_KEY_MISMATCH = 7
65
69
 
@@ -91,6 +95,9 @@ module Aerospike
91
95
  # Unsupported Server Feature (e.g. Scan + UDF)
92
96
  UNSUPPORTED_FEATURE = 16
93
97
 
98
+ # Bin not found on update-only operation.
99
+ BIN_NOT_FOUND = 17
100
+
94
101
  # Specified bin name does not exist in record.
95
102
  DEVICE_OVERLOAD = 18
96
103
 
@@ -125,8 +132,13 @@ module Aerospike
125
132
  # There are no more records left for query.
126
133
  QUERY_END = 50
127
134
 
135
+ # Security functionality not supported by connected server.
128
136
  SECURITY_NOT_SUPPORTED = 51
137
+
138
+ # Security functionality not enabled by connected server.
129
139
  SECURITY_NOT_ENABLED = 52
140
+
141
+ # Security scheme not supported.
130
142
  SECURITY_SCHEME_NOT_SUPPORTED = 53
131
143
 
132
144
  # Administration command is invalid.
@@ -155,6 +167,9 @@ module Aerospike
155
167
  # Security credential is invalid.
156
168
  INVALID_CREDENTIAL = 65
157
169
 
170
+ # Expired session token.
171
+ EXPIRED_SESSION = 66
172
+
158
173
  # Role name is invalid.
159
174
  INVALID_ROLE = 70
160
175
 
@@ -164,15 +179,48 @@ module Aerospike
164
179
  # Privilege is invalid.
165
180
  INVALID_PRIVILEGE = 72
166
181
 
182
+ # Specified IP whitelist is invalid.
183
+ INVALID_WHITELIST = 73
184
+
167
185
  # User must be authentication before performing database operations.
168
186
  NOT_AUTHENTICATED = 80
169
187
 
170
188
  # User does not posses the required role to perform the database operation.
171
189
  ROLE_VIOLATION = 81
172
190
 
191
+ # Client IP address is not on the IP whitelist.
192
+ NOT_WHITELISTED = 82
193
+
194
+ # LDAP feature not enabled on server.
195
+ LDAP_NOT_ENABLED = 90
196
+
197
+ # Error in LDAP setup.
198
+ LDAP_SETUP = 91
199
+
200
+ # Error in LDAP TLS setup.
201
+ LDAP_TLS_SETUP = 92
202
+
203
+ # Error authenticating LDAP user.
204
+ LDAP_AUTHENTICATION = 93
205
+
206
+ # Error querying LDAP server.
207
+ LDAP_QUERY = 94
208
+
173
209
  # A user defined function returned an error code.
174
210
  UDF_BAD_RESPONSE = 100
175
211
 
212
+ # Batch functionality has been disabled by configuring the batch-index-thread=0.
213
+ BATCH_DISABLED = 150
214
+
215
+ # Batch max requests has been exceeded.
216
+ BATCH_MAX_REQUESTS = 151
217
+
218
+ # All batch queues are full.
219
+ BATCH_QUEUES_FULL = 152
220
+
221
+ # GeoJSON is malformed or not supported.
222
+ INVALID_GEOJSON = 160
223
+
176
224
  # Secondary index already exists.
177
225
  INDEX_FOUND = 200
178
226
 
@@ -206,6 +254,12 @@ module Aerospike
206
254
  # Generic query error.
207
255
  QUERY_GENERIC = 213
208
256
 
257
+ # Network error. Query is aborted.
258
+ QUERY_NET_IO = 214
259
+
260
+ # Internal error.
261
+ QUERY_DUPLICATE = 215
262
+
209
263
  def self.message(code)
210
264
  case code
211
265
  when COMMAND_REJECTED
@@ -244,6 +298,9 @@ module Aerospike
244
298
  when KEY_EXISTS_ERROR
245
299
  "Key already exists"
246
300
 
301
+ when BIN_EXISTS_ERROR
302
+ "Bin already exists on a create-only operation"
303
+
247
304
  when CLUSTER_KEY_MISMATCH
248
305
  "Cluster key mismatch"
249
306
 
@@ -274,6 +331,9 @@ module Aerospike
274
331
  when UNSUPPORTED_FEATURE
275
332
  "Unsupported Server Feature"
276
333
 
334
+ when BIN_NOT_FOUND
335
+ "Bin not found on update-only operation"
336
+
277
337
  when DEVICE_OVERLOAD
278
338
  "Device overload"
279
339
 
@@ -343,6 +403,9 @@ module Aerospike
343
403
  when INVALID_CREDENTIAL
344
404
  "Invalid credential"
345
405
 
406
+ when EXPIRED_SESSION
407
+ "Expired session token"
408
+
346
409
  when INVALID_ROLE
347
410
  "Invalid role"
348
411
 
@@ -352,15 +415,48 @@ module Aerospike
352
415
  when INVALID_PRIVILEGE
353
416
  "Invalid privilege"
354
417
 
418
+ when INVALID_WHITELIST
419
+ "Specified IP whitelist is invalid"
420
+
355
421
  when NOT_AUTHENTICATED
356
422
  "Not authenticated"
357
423
 
358
424
  when ROLE_VIOLATION
359
425
  "Role violation"
360
426
 
427
+ when NOT_WHITELISTED
428
+ "Client IP address is not on the IP whitelist"
429
+
430
+ when LDAP_NOT_ENABLED
431
+ "LDAP feature not enabled on server"
432
+
433
+ when LDAP_SETUP
434
+ "Error in LDAP setup"
435
+
436
+ when LDAP_TLS_SETUP
437
+ "Error in LDAP TLS setup"
438
+
439
+ when LDAP_AUTHENTICATION
440
+ "Error authenticating LDAP user"
441
+
442
+ when LDAP_QUERY
443
+ "Error querying LDAP server"
444
+
361
445
  when UDF_BAD_RESPONSE
362
446
  "UDF d error"
363
447
 
448
+ when BATCH_DISABLED
449
+ "Batch functionality has been disabled by configuring the batch-index-thread=0"
450
+
451
+ when BATCH_MAX_REQUESTS
452
+ "Batch max requests has been exceeded"
453
+
454
+ when BATCH_QUEUES_FULL
455
+ "All batch queues are full"
456
+
457
+ when INVALID_GEOJSON
458
+ "GeoJSON is malformed or not supported"
459
+
364
460
  when INDEX_FOUND
365
461
  "Index already exists"
366
462
 
@@ -394,6 +490,12 @@ module Aerospike
394
490
  when QUERY_GENERIC
395
491
  "Query error"
396
492
 
493
+ when QUERY_NET_IO
494
+ "Network error. Query is aborted"
495
+
496
+ when QUERY_DUPLICATE
497
+ "Internal query error"
498
+
397
499
  else
398
500
  "ResultCode #{code} unknown in the client. Please file a github issue."
399
501
  end # case
@@ -25,13 +25,14 @@ module Aerospike
25
25
  @timeout = nil
26
26
  end
27
27
 
28
- def read(buffer, length)
28
+ def read(buffer, length, offset = 0)
29
29
  bytes_read = 0
30
30
  until bytes_read >= length
31
31
  result = read_from_socket(length - bytes_read)
32
- buffer.write_binary(result, bytes_read)
32
+ buffer.write_binary(result, offset + bytes_read)
33
33
  bytes_read += result.bytesize
34
34
  end
35
+ bytes_read
35
36
  end
36
37
 
37
38
  def read_from_socket(length)
@@ -42,9 +42,9 @@ module Aerospike
42
42
  DEFAULT_BUFFER_SIZE = 16 * 1024
43
43
  MAX_BUFFER_SIZE = 10 * 1024 * 1024
44
44
 
45
- def initialize(size=DEFAULT_BUFFER_SIZE)
46
- @buf = "%0#{size}d" % 0
47
-
45
+ def initialize(size=DEFAULT_BUFFER_SIZE, buf = nil)
46
+ @buf = (buf ? buf : ("%0#{size}d" % 0))
47
+ @buf.force_encoding('binary')
48
48
  @slice_end = @buf.bytesize
49
49
  end
50
50
 
@@ -61,6 +61,10 @@ module Aerospike
61
61
  end
62
62
  alias_method :length, :size
63
63
 
64
+ def eat!(n)
65
+ @buf.replace(@buf[n..-1])
66
+ end
67
+
64
68
  def resize(length)
65
69
  if @buf.bytesize < length
66
70
  @buf.concat("%0#{length - @buf.bytesize}d" % 0)
@@ -156,6 +160,12 @@ module Aerospike
156
160
  @buf[0..@slice_end-1]
157
161
  end
158
162
 
163
+ def reset
164
+ for i in 0..@buf.size-1
165
+ @buf[i] = ' '
166
+ end
167
+ end
168
+
159
169
  def dump(from=nil, to=nil)
160
170
  from ||= 0
161
171
  to ||= @slice_end - 1
@@ -92,9 +92,9 @@ module Aerospike
92
92
  end
93
93
  value
94
94
  when Array
95
- normalize_strings_in_array(elem)
95
+ unpack_list(elem)
96
96
  when Hash
97
- normalize_strings_in_map(elem)
97
+ unpack_map(elem)
98
98
  else
99
99
  elem
100
100
  end
@@ -36,7 +36,7 @@ module Aerospike
36
36
  #RTA_DICT = 15
37
37
  #RTA_APPEND_DICT = 16
38
38
  #RTA_APPEND_LIST = 17
39
- #LUA_BLOB = 18
39
+ HLL = 18
40
40
  MAP = 19
41
41
  LIST = 20
42
42
  GEOJSON = 23
@@ -23,14 +23,24 @@ module Aerospike
23
23
  # Polymorphic value classes used to efficiently serialize objects into the wire protocol.
24
24
  class Value #:nodoc:
25
25
 
26
- def self.of(value)
26
+ def self.of(value, allow_64bits = false)
27
27
  case value
28
28
  when Integer
29
- if value.bit_length < 64
30
- res = IntegerValue.new(value)
29
+ if !allow_64bits
30
+ if value.bit_length < 64
31
+ res = IntegerValue.new(value)
32
+ else
33
+ # big nums > 2**63 are not supported
34
+ raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::TYPE_NOT_SUPPORTED, "Value type #{value.class} not supported with more than 64 bits.")
35
+ end
31
36
  else
32
- # big nums > 2**63 are not supported
33
- raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::TYPE_NOT_SUPPORTED, "Value type #{value.class} not supported.")
37
+ # used in bitwise operations
38
+ if value.bit_length <= 64
39
+ res = IntegerValue.new(value)
40
+ else
41
+ # nums with more than 64 bits are not supported
42
+ raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::TYPE_NOT_SUPPORTED, "Value type #{value.class} not supported with more than 64 bits.")
43
+ end
34
44
  end
35
45
  when Float
36
46
  res = FloatValue.new(value)
@@ -48,6 +58,8 @@ module Aerospike
48
58
  res = GeoJSONValue.new(value)
49
59
  when nil
50
60
  res = NULL
61
+ when TrueClass, FalseClass
62
+ res = BoolValue.new(value)
51
63
  else
52
64
  # throw an exception for anything that is not supported.
53
65
  raise Aerospike::Exceptions::Aerospike.new(Aerospike::ResultCode::TYPE_NOT_SUPPORTED, "Value type #{value.class} not supported.")
@@ -526,6 +538,49 @@ module Aerospike
526
538
 
527
539
  end
528
540
 
541
+ # #######################################/
542
+
543
+ # HLLValue value. Encapsulates a HyperLogLog value.
544
+ # Supported by Aerospike server version 4.9 and later.
545
+ class HLLValue < Value #:nodoc:
546
+
547
+ def initialize(value)
548
+ @bytes = value
549
+ @bytes.force_encoding('binary')
550
+
551
+ self
552
+ end
553
+
554
+ def type
555
+ Aerospike::ParticleType::HLL
556
+ end
557
+
558
+ def get
559
+ self
560
+ end
561
+
562
+ def to_s
563
+ @bytes.to_s
564
+ end
565
+
566
+ def to_bytes
567
+ @bytes
568
+ end
569
+
570
+ def estimate_size
571
+ @bytes.bytesize
572
+ end
573
+
574
+ def write(buffer, offset)
575
+ buffer.write_binary(@bytes, offset)
576
+ end
577
+
578
+ def pack(packer)
579
+ packer.write(Aerospike::ParticleType::BLOB.chr + @bytes)
580
+ end
581
+
582
+ end
583
+
529
584
  #######################################
530
585
 
531
586
  def self.encoding
@@ -572,6 +627,10 @@ module Aerospike
572
627
  hdrsz = 1 + 2 + (ncells * 8)
573
628
  Aerospike::GeoJSON.new(buf.read(offset + hdrsz, length - hdrsz))
574
629
 
630
+ when Aerospike::ParticleType::HLL
631
+ bytes = buf.read(offset,length)
632
+ Aerospike::HLLValue.new(bytes)
633
+
575
634
  else
576
635
  nil
577
636
  end
@@ -593,4 +652,47 @@ module Aerospike
593
652
  nil
594
653
  end
595
654
  end
655
+
656
+ private
657
+
658
+ #######################################
659
+
660
+ # Boolean value.
661
+ # This is private, and only used internally for bitwise CDTs
662
+ class BoolValue < Value #:nodoc:
663
+
664
+ def initialize(val)
665
+ @value = val || false
666
+ self
667
+ end
668
+
669
+ def estimate_size
670
+ 1
671
+ end
672
+
673
+ def write(buffer, offset)
674
+ raise Exception.new("Unreachable")
675
+ end
676
+
677
+ def pack(packer)
678
+ packer.write(@value)
679
+ end
680
+
681
+ def type
682
+ raise Exception.new("Unreachable")
683
+ end
684
+
685
+ def get
686
+ @value
687
+ end
688
+
689
+ def to_bytes
690
+ raise Exception.new("Unreachable")
691
+ end
692
+
693
+ def to_s
694
+ @value.to_s
695
+ end
696
+
697
+ end # BoolValue
596
698
  end # module