aerospike 2.7.0 → 2.8.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 +52 -60
- data/lib/aerospike.rb +7 -0
- data/lib/aerospike/cdt/list_operation.rb +372 -56
- data/lib/aerospike/cdt/list_order.rb +37 -0
- data/lib/aerospike/cdt/list_policy.rb +35 -0
- data/lib/aerospike/cdt/list_return_type.rb +75 -0
- data/lib/aerospike/cdt/list_sort_flags.rb +33 -0
- data/lib/aerospike/cdt/list_write_flags.rb +47 -0
- data/lib/aerospike/cdt/map_operation.rb +347 -103
- data/lib/aerospike/cdt/map_policy.rb +8 -8
- data/lib/aerospike/cdt/map_write_flags.rb +51 -0
- data/lib/aerospike/cdt/map_write_mode.rb +7 -1
- data/lib/aerospike/cluster.rb +4 -0
- data/lib/aerospike/key.rb +1 -1
- data/lib/aerospike/node.rb +1 -13
- data/lib/aerospike/socket/base.rb +45 -18
- data/lib/aerospike/socket/ssl.rb +2 -0
- data/lib/aerospike/utils/buffer.rb +1 -1
- data/lib/aerospike/utils/connection_pool.rb +45 -0
- data/lib/aerospike/utils/packer.rb +1 -1
- data/lib/aerospike/utils/pool.rb +35 -12
- data/lib/aerospike/utils/unpacker.rb +11 -7
- data/lib/aerospike/version.rb +1 -1
- metadata +10 -3
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
# Copyright 2016-
|
2
|
+
# Copyright 2016-2018 Aerospike, Inc.
|
3
3
|
#
|
4
4
|
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
5
5
|
# license agreements.
|
@@ -16,22 +16,22 @@
|
|
16
16
|
|
17
17
|
module Aerospike
|
18
18
|
module CDT
|
19
|
-
|
20
19
|
class MapPolicy
|
21
20
|
|
22
|
-
attr_accessor :order, :write_mode
|
21
|
+
attr_accessor :order, :write_mode, :flags
|
22
|
+
|
23
|
+
def initialize(order: nil, write_mode: nil, flags: nil)
|
24
|
+
if write_mode && flags
|
25
|
+
raise ArgumentError, "Use write mode for server versions < 4.3; use write flags for server versions >= 4.3."
|
26
|
+
end
|
23
27
|
|
24
|
-
def initialize(order: nil, write_mode: nil)
|
25
28
|
@order = order || MapOrder::DEFAULT
|
26
29
|
@write_mode = write_mode || MapWriteMode::DEFAULT
|
30
|
+
@flags = flags || MapWriteFlags::DEFAULT
|
27
31
|
end
|
28
32
|
|
29
33
|
DEFAULT = MapPolicy.new
|
30
34
|
|
31
|
-
def value
|
32
|
-
order.to_int
|
33
|
-
end
|
34
35
|
end
|
35
|
-
|
36
36
|
end
|
37
37
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright 2018 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
|
+
module CDT
|
19
|
+
|
20
|
+
##
|
21
|
+
# Map write bit flags.
|
22
|
+
# Requires server versions >= 4.3.
|
23
|
+
module MapWriteFlags
|
24
|
+
|
25
|
+
##
|
26
|
+
# Default. Allow create or update.
|
27
|
+
DEFAULT = 0
|
28
|
+
|
29
|
+
##
|
30
|
+
# If the key already exists, the item will be denied.
|
31
|
+
# If the key does not exist, a new item will be created.
|
32
|
+
CREATE_ONLY = 1
|
33
|
+
|
34
|
+
##
|
35
|
+
# If the key already exists, the item will be overwritten.
|
36
|
+
# If the key does not exist, the item will be denied.
|
37
|
+
UPDATE_ONLY = 2
|
38
|
+
|
39
|
+
##
|
40
|
+
# Do not raise error, if a map item is denied due to write flag
|
41
|
+
# constraints.
|
42
|
+
NO_FAIL = 4
|
43
|
+
|
44
|
+
##
|
45
|
+
# Allow other valid map items to be committed, if a map item is denied
|
46
|
+
# due to write flag constraints.
|
47
|
+
PARTIAL = 8
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
# Copyright 2016-
|
2
|
+
# Copyright 2016-2018 Aerospike, Inc.
|
3
3
|
#
|
4
4
|
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
5
5
|
# license agreements.
|
@@ -16,6 +16,12 @@
|
|
16
16
|
|
17
17
|
module Aerospike
|
18
18
|
module CDT
|
19
|
+
|
20
|
+
##
|
21
|
+
# Unique key map write type.
|
22
|
+
#
|
23
|
+
# This enum should only be used for server versions < 4.3.
|
24
|
+
# MapWriteFlags are recommended for server versions >= 4.3.
|
19
25
|
module MapWriteMode
|
20
26
|
|
21
27
|
##
|
data/lib/aerospike/cluster.rb
CHANGED
@@ -430,6 +430,10 @@ module Aerospike
|
|
430
430
|
::Aerospike::Node.new(self, nv)
|
431
431
|
end
|
432
432
|
|
433
|
+
def create_connection(host)
|
434
|
+
::Aerospike::Cluster::CreateConnection.(self, host)
|
435
|
+
end
|
436
|
+
|
433
437
|
def find_nodes_to_remove(refresh_count)
|
434
438
|
FindNodesToRemove.(self, refresh_count)
|
435
439
|
end
|
data/lib/aerospike/key.rb
CHANGED
data/lib/aerospike/node.rb
CHANGED
@@ -52,19 +52,7 @@ module Aerospike
|
|
52
52
|
@active = Atomic.new(true)
|
53
53
|
@failures = Atomic.new(0)
|
54
54
|
|
55
|
-
@connections =
|
56
|
-
|
57
|
-
# TODO: put in separate methods
|
58
|
-
@connections.create_block = Proc.new do
|
59
|
-
conn = nil
|
60
|
-
loop do
|
61
|
-
conn = Cluster::CreateConnection.(cluster, host)
|
62
|
-
break if conn.connected?
|
63
|
-
end
|
64
|
-
conn
|
65
|
-
end
|
66
|
-
|
67
|
-
@connections.cleanup_block = Proc.new { |conn| conn.close if conn }
|
55
|
+
@connections = ::Aerospike::ConnectionPool.new(cluster, host)
|
68
56
|
end
|
69
57
|
|
70
58
|
# Get a connection to the node. If no cached connection is not available,
|
@@ -35,16 +35,8 @@ module Aerospike
|
|
35
35
|
end
|
36
36
|
|
37
37
|
def read_from_socket(length)
|
38
|
-
|
38
|
+
with_timeout(@timeout) do
|
39
39
|
read_nonblock(length)
|
40
|
-
rescue ::IO::WaitReadable => e
|
41
|
-
if ::IO::select([self], nil, nil, @timeout)
|
42
|
-
retry
|
43
|
-
else
|
44
|
-
raise ::Aerospike::Exceptions::Connection.new("#{e}")
|
45
|
-
end
|
46
|
-
rescue => e
|
47
|
-
raise ::Aerospike::Exceptions::Connection.new("#{e}")
|
48
40
|
end
|
49
41
|
end
|
50
42
|
|
@@ -56,16 +48,8 @@ module Aerospike
|
|
56
48
|
end
|
57
49
|
|
58
50
|
def write_to_socket(data)
|
59
|
-
|
51
|
+
with_timeout(@timeout) do
|
60
52
|
write_nonblock(data)
|
61
|
-
rescue ::IO::WaitWritable => e
|
62
|
-
if ::IO::select(nil, [self], nil, @timeout)
|
63
|
-
retry
|
64
|
-
else
|
65
|
-
raise ::Aerospike::Exceptions::Connection.new("#{e}")
|
66
|
-
end
|
67
|
-
rescue => e
|
68
|
-
raise ::Aerospike::Exceptions::Connection.new("#{e}")
|
69
53
|
end
|
70
54
|
end
|
71
55
|
|
@@ -77,10 +61,53 @@ module Aerospike
|
|
77
61
|
!closed?
|
78
62
|
end
|
79
63
|
|
64
|
+
# Returns whether the connection to the server is alive.
|
65
|
+
#
|
66
|
+
# It is useful to call this method before making a call to the server
|
67
|
+
# that would change data on the server.
|
68
|
+
#
|
69
|
+
# Note: This method is only useful if the server closed the connection or
|
70
|
+
# if a previous connection failure occurred. If the server is hard killed
|
71
|
+
# this will still return true until one or more writes are attempted.
|
72
|
+
def alive?
|
73
|
+
return false if closed?
|
74
|
+
|
75
|
+
if IO.select([self], nil, nil, 0)
|
76
|
+
!eof? rescue false
|
77
|
+
else
|
78
|
+
true
|
79
|
+
end
|
80
|
+
rescue IOError
|
81
|
+
false
|
82
|
+
end
|
83
|
+
|
80
84
|
def close
|
81
85
|
return if closed?
|
82
86
|
super()
|
83
87
|
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
# Note: For SSL connections, read_nonblock may invoke write system call,
|
92
|
+
# which may raise IO::WaitWritable, and vice versa, due to SSL
|
93
|
+
# renegotiation, so we should always rescue both.
|
94
|
+
def with_timeout(timeout, &block)
|
95
|
+
block.call
|
96
|
+
rescue IO::WaitReadable => e
|
97
|
+
if IO::select([self], nil, nil, timeout)
|
98
|
+
retry
|
99
|
+
else
|
100
|
+
fail Aerospike::Exceptions::Connection, "Socket timeout: #{e}"
|
101
|
+
end
|
102
|
+
rescue IO::WaitWritable => e
|
103
|
+
if IO::select(nil, [self], nil, timeout)
|
104
|
+
retry
|
105
|
+
else
|
106
|
+
fail Aerospike::Exceptions::Connection, "Socket timeout: #{e}"
|
107
|
+
end
|
108
|
+
rescue => e
|
109
|
+
raise Aerospike::Exceptions::Connection, "Socket error: #{e}"
|
110
|
+
end
|
84
111
|
end
|
85
112
|
end
|
86
113
|
end
|
data/lib/aerospike/socket/ssl.rb
CHANGED
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright 2017 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
|
+
class ConnectionPool < Pool
|
19
|
+
|
20
|
+
attr_accessor :cluster, :host
|
21
|
+
|
22
|
+
def initialize(cluster, host)
|
23
|
+
self.cluster = cluster
|
24
|
+
self.host = host
|
25
|
+
super(cluster.connection_queue_size)
|
26
|
+
end
|
27
|
+
|
28
|
+
def create
|
29
|
+
conn = nil
|
30
|
+
loop do
|
31
|
+
conn = cluster.create_connection(host)
|
32
|
+
break if conn.connected?
|
33
|
+
end
|
34
|
+
conn
|
35
|
+
end
|
36
|
+
|
37
|
+
def check(conn)
|
38
|
+
conn.alive?
|
39
|
+
end
|
40
|
+
|
41
|
+
def cleanup(conn)
|
42
|
+
conn.close if conn
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/aerospike/utils/pool.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
#
|
2
|
-
# Copyright 2014-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# Copyright 2014-2018 Aerospike, Inc.
|
3
3
|
#
|
4
4
|
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
5
5
|
# license agreements.
|
@@ -16,15 +16,14 @@
|
|
16
16
|
|
17
17
|
module Aerospike
|
18
18
|
|
19
|
-
private
|
20
|
-
|
21
19
|
class Pool #:nodoc:
|
22
20
|
|
23
|
-
attr_accessor :
|
21
|
+
attr_accessor :create_proc, :cleanup_proc, :check_proc
|
24
22
|
|
25
23
|
def initialize(max_size = 256, &block)
|
26
|
-
@
|
27
|
-
@
|
24
|
+
@create_proc = block
|
25
|
+
@cleanup_proc = nil
|
26
|
+
@check_proc = nil
|
28
27
|
|
29
28
|
@pool = Queue.new
|
30
29
|
@max_size = max_size
|
@@ -33,17 +32,24 @@ module Aerospike
|
|
33
32
|
def offer(obj)
|
34
33
|
if @pool.length < @max_size
|
35
34
|
@pool << obj
|
36
|
-
|
37
|
-
|
35
|
+
else
|
36
|
+
cleanup(obj)
|
38
37
|
end
|
39
38
|
end
|
40
39
|
alias_method :<<, :offer
|
41
40
|
|
42
41
|
def poll(create_new=true)
|
43
42
|
non_block = true
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
begin
|
44
|
+
obj = @pool.pop(non_block)
|
45
|
+
if !check(obj)
|
46
|
+
cleanup(obj)
|
47
|
+
obj = nil
|
48
|
+
end
|
49
|
+
end until obj
|
50
|
+
obj
|
51
|
+
rescue ThreadError
|
52
|
+
create if create_new
|
47
53
|
end
|
48
54
|
|
49
55
|
def empty?
|
@@ -59,6 +65,23 @@ module Aerospike
|
|
59
65
|
"#<Aerospike::Pool: size=#{size}>"
|
60
66
|
end
|
61
67
|
|
68
|
+
protected
|
69
|
+
|
70
|
+
def create
|
71
|
+
return unless create_proc
|
72
|
+
create_proc.()
|
73
|
+
end
|
74
|
+
|
75
|
+
def check(obj)
|
76
|
+
return true unless check_proc
|
77
|
+
check_proc.(obj)
|
78
|
+
end
|
79
|
+
|
80
|
+
def cleanup(obj)
|
81
|
+
return unless cleanup_proc
|
82
|
+
cleanup_proc.(obj)
|
83
|
+
end
|
84
|
+
|
62
85
|
end
|
63
86
|
|
64
87
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# encoding: utf-8
|
2
|
-
# Copyright 2016-
|
2
|
+
# Copyright 2016-2018 Aerospike, Inc.
|
3
3
|
#
|
4
4
|
# Portions may be licensed to Aerospike, Inc. under one or more contributor
|
5
5
|
# license agreements.
|
@@ -24,7 +24,7 @@ module Aerospike
|
|
24
24
|
class Unpacker
|
25
25
|
|
26
26
|
@@pool = Pool.new
|
27
|
-
@@pool.
|
27
|
+
@@pool.create_proc = Proc.new { Unpacker.new }
|
28
28
|
|
29
29
|
def self.use
|
30
30
|
unpacker = @@pool.poll
|
@@ -36,9 +36,9 @@ module Aerospike
|
|
36
36
|
|
37
37
|
MsgPackExt = Struct.new(:type, :data)
|
38
38
|
MsgPackExt::TYPES = [
|
39
|
-
# Map Create Flags:
|
40
|
-
0x00, # UNORDERED
|
41
|
-
0x01, # K_ORDERED
|
39
|
+
# Map Create Flags: List Create Flags:
|
40
|
+
0x00, # UNORDERED UNORDERED
|
41
|
+
0x01, # K_ORDERED ORDERED
|
42
42
|
0x03, # KV_ORDERED
|
43
43
|
0x08, # PRESERVE_ORDER
|
44
44
|
]
|
@@ -66,12 +66,16 @@ module Aerospike
|
|
66
66
|
private
|
67
67
|
|
68
68
|
def unpack_list(array)
|
69
|
-
normalize_strings_in_array(array)
|
69
|
+
list = normalize_strings_in_array(array)
|
70
|
+
unless list.empty?
|
71
|
+
list.shift if MsgPackExt === list.first
|
72
|
+
end
|
73
|
+
list
|
70
74
|
end
|
71
75
|
|
72
76
|
def unpack_map(hash)
|
73
77
|
hash = normalize_strings_in_map(hash)
|
74
|
-
|
78
|
+
unless hash.empty?
|
75
79
|
(key, _) = hash.first
|
76
80
|
hash.shift if MsgPackExt === key
|
77
81
|
end
|