aerospike 2.13.0 → 2.18.0

Sign up to get free protection for your applications and to get access to all the features.
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