aerospike 0.1.6 → 1.0.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 +22 -0
- data/lib/aerospike.rb +5 -0
- data/lib/aerospike/atomic/atomic.rb +3 -1
- data/lib/aerospike/client.rb +98 -32
- data/lib/aerospike/cluster/cluster.rb +25 -8
- data/lib/aerospike/cluster/connection.rb +1 -1
- data/lib/aerospike/cluster/node.rb +16 -3
- data/lib/aerospike/cluster/node_validator.rb +16 -4
- data/lib/aerospike/cluster/partition.rb +1 -1
- data/lib/aerospike/cluster/partition_tokenizer_new.rb +4 -2
- data/lib/aerospike/cluster/partition_tokenizer_old.rb +1 -1
- data/lib/aerospike/command/admin_command.rb +353 -0
- data/lib/aerospike/command/batch_command.rb +12 -42
- data/lib/aerospike/command/batch_command_exists.rb +1 -1
- data/lib/aerospike/command/batch_command_get.rb +1 -1
- data/lib/aerospike/command/batch_item.rb +1 -1
- data/lib/aerospike/command/batch_node.rb +1 -1
- data/lib/aerospike/command/command.rb +9 -14
- data/lib/aerospike/command/delete_command.rb +1 -1
- data/lib/aerospike/command/execute_command.rb +1 -1
- data/lib/aerospike/command/exists_command.rb +1 -1
- data/lib/aerospike/command/operate_command.rb +1 -1
- data/lib/aerospike/command/read_command.rb +12 -38
- data/lib/aerospike/command/read_header_command.rb +2 -2
- data/lib/aerospike/command/roles.rb +36 -0
- data/lib/aerospike/command/single_command.rb +1 -1
- data/lib/aerospike/command/touch_command.rb +1 -1
- data/lib/aerospike/command/write_command.rb +1 -1
- data/lib/aerospike/info.rb +1 -1
- data/lib/aerospike/loggable.rb +1 -1
- data/lib/aerospike/policy/admin_policy.rb +33 -0
- data/lib/aerospike/policy/batch_policy.rb +5 -5
- data/lib/aerospike/policy/client_policy.rb +15 -4
- data/lib/aerospike/policy/generation_policy.rb +0 -5
- data/lib/aerospike/policy/policy.rb +6 -6
- data/lib/aerospike/policy/query_policy.rb +2 -2
- data/lib/aerospike/policy/scan_policy.rb +6 -6
- data/lib/aerospike/policy/write_policy.rb +8 -8
- data/lib/aerospike/query/query_command.rb +1 -1
- data/lib/aerospike/query/scan_command.rb +1 -1
- data/lib/aerospike/query/stream_command.rb +1 -1
- data/lib/aerospike/record.rb +2 -3
- data/lib/aerospike/result_code.rb +11 -1
- data/lib/aerospike/user_role.rb +30 -0
- data/lib/aerospike/utils/buffer.rb +22 -2
- data/lib/aerospike/utils/epoc.rb +3 -1
- data/lib/aerospike/utils/pool.rb +1 -1
- data/lib/aerospike/value/value.rb +12 -13
- data/lib/aerospike/version.rb +1 -1
- metadata +6 -2
@@ -73,7 +73,7 @@ module Aerospike
|
|
73
73
|
CL_MSG_VERSION = 2
|
74
74
|
AS_MSG_TYPE = 3
|
75
75
|
|
76
|
-
class Command
|
76
|
+
class Command #:nodoc:
|
77
77
|
|
78
78
|
def initialize(node)
|
79
79
|
@node = node
|
@@ -431,7 +431,7 @@ module Aerospike
|
|
431
431
|
|
432
432
|
# All runtime exceptions are considered fatal. Do not retry.
|
433
433
|
# Close socket to flush out possible garbage. Do not put back in pool.
|
434
|
-
@conn.close
|
434
|
+
@conn.close if @conn
|
435
435
|
raise e
|
436
436
|
end
|
437
437
|
|
@@ -444,7 +444,7 @@ module Aerospike
|
|
444
444
|
rescue => e
|
445
445
|
# IO errors are considered temporary anomalies. Retry.
|
446
446
|
# Close socket to flush out possible garbage. Do not put back in pool.
|
447
|
-
@conn.close
|
447
|
+
@conn.close if @conn
|
448
448
|
|
449
449
|
Aerospike.logger.error("Node #{@node.to_s}: #{e}")
|
450
450
|
# IO error means connection to server @node is unhealthy.
|
@@ -463,7 +463,7 @@ module Aerospike
|
|
463
463
|
# cancelling/closing the batch/multi commands will return an error, which will
|
464
464
|
# close the connection to throw away its data and signal the server about the
|
465
465
|
# situation. We will not put back the connection in the buffer.
|
466
|
-
@conn.close
|
466
|
+
@conn.close if @conn
|
467
467
|
raise e
|
468
468
|
end
|
469
469
|
|
@@ -550,8 +550,10 @@ module Aerospike
|
|
550
550
|
@data_buffer.write_byte(read_attr, 9)
|
551
551
|
@data_buffer.write_byte(write_attr, 10)
|
552
552
|
|
553
|
-
|
553
|
+
i = 11
|
554
|
+
while i <= 25
|
554
555
|
@data_buffer.write_byte(0, i)
|
556
|
+
i = i.succ
|
555
557
|
end
|
556
558
|
|
557
559
|
@data_buffer.write_int16(field_count, 26)
|
@@ -586,9 +588,6 @@ module Aerospike
|
|
586
588
|
when Aerospike::GenerationPolicy::EXPECT_GEN_GT
|
587
589
|
generation = policy.generation
|
588
590
|
write_attr |= INFO2_GENERATION_GT
|
589
|
-
when Aerospike::GenerationPolicy::DUPLICATE
|
590
|
-
generation = policy.generation
|
591
|
-
write_attr |= INFO2_GENERATION_DUP
|
592
591
|
end
|
593
592
|
|
594
593
|
info_attr |= INFO3_COMMIT_MASTER if policy.commit_level == Aerospike::CommitLevel::COMMIT_MASTER
|
@@ -601,10 +600,8 @@ module Aerospike
|
|
601
600
|
@data_buffer.write_byte(info_attr, 11)
|
602
601
|
@data_buffer.write_byte(0, 12) # unused
|
603
602
|
@data_buffer.write_byte(0, 13) # clear the result code
|
604
|
-
|
605
|
-
@data_buffer.
|
606
|
-
# Buffer.Int32ToBytes(policy.expiration, @data_buffer, 18)
|
607
|
-
@data_buffer.write_int32(policy.expiration, 18)
|
603
|
+
@data_buffer.write_uint32(generation, 14)
|
604
|
+
@data_buffer.write_uint32(policy.expiration, 18)
|
608
605
|
|
609
606
|
# Initialize timeout. It will be written later.
|
610
607
|
@data_buffer.write_byte(0, 22)
|
@@ -613,9 +610,7 @@ module Aerospike
|
|
613
610
|
@data_buffer.write_byte(0, 25)
|
614
611
|
|
615
612
|
|
616
|
-
# Buffer.Int16ToBytes(field_count, @data_buffer, 26)
|
617
613
|
@data_buffer.write_int16(field_count, 26)
|
618
|
-
# Buffer.Int16ToBytes(operation_count, @data_buffer, 28)
|
619
614
|
@data_buffer.write_int16(operation_count, 28)
|
620
615
|
|
621
616
|
@data_offset = MSG_TOTAL_HEADER_SIZE
|
@@ -24,7 +24,7 @@ module Aerospike
|
|
24
24
|
|
25
25
|
private
|
26
26
|
|
27
|
-
class ReadCommand < SingleCommand
|
27
|
+
class ReadCommand < SingleCommand #:nodoc:
|
28
28
|
|
29
29
|
attr_reader :record
|
30
30
|
|
@@ -93,7 +93,7 @@ module Aerospike
|
|
93
93
|
|
94
94
|
if op_count == 0
|
95
95
|
# data Bin was not returned.
|
96
|
-
@record = Record.new(@node, @key,
|
96
|
+
@record = Record.new(@node, @key, generation, expiration)
|
97
97
|
return
|
98
98
|
end
|
99
99
|
|
@@ -107,24 +107,25 @@ module Aerospike
|
|
107
107
|
end
|
108
108
|
|
109
109
|
def parse_record(op_count, field_count, generation, expiration)
|
110
|
-
bins = nil
|
111
|
-
duplicates = nil
|
110
|
+
bins = op_count > 0 ? {} : nil
|
112
111
|
receive_offset = 0
|
113
112
|
|
114
113
|
# There can be fields in the response (setname etc).
|
115
114
|
# But for now, ignore them. Expose them to the API if needed in the future.
|
116
|
-
if field_count
|
115
|
+
if field_count > 0
|
117
116
|
# Just skip over all the fields
|
118
|
-
|
117
|
+
i = 0
|
118
|
+
while i < field_count
|
119
119
|
field_size = @data_buffer.read_int32(receive_offset)
|
120
120
|
receive_offset += (4 + field_size)
|
121
|
+
i = i.succ
|
121
122
|
end
|
122
123
|
end
|
123
124
|
|
124
|
-
|
125
|
+
i = 0
|
126
|
+
while i < op_count
|
125
127
|
op_size = @data_buffer.read_int32(receive_offset)
|
126
128
|
particle_type = @data_buffer.read(receive_offset+5).ord
|
127
|
-
version = @data_buffer.read(receive_offset+6).ord
|
128
129
|
name_size = @data_buffer.read(receive_offset+7).ord
|
129
130
|
name = @data_buffer.read(receive_offset+8, name_size).force_encoding('utf-8')
|
130
131
|
receive_offset += 4 + 4 + name_size
|
@@ -134,39 +135,12 @@ module Aerospike
|
|
134
135
|
value = Aerospike.bytes_to_particle(particle_type, @data_buffer, receive_offset, particle_bytes_size)
|
135
136
|
receive_offset += particle_bytes_size
|
136
137
|
|
137
|
-
|
138
|
-
|
139
|
-
if version > 0 || duplicates != nil
|
140
|
-
unless duplicates
|
141
|
-
duplicates = []
|
142
|
-
duplicates << bins
|
143
|
-
bins = nil
|
144
|
-
|
145
|
-
for j in 0..version-1
|
146
|
-
duplicates << nil
|
147
|
-
end
|
148
|
-
else
|
149
|
-
for j in duplicates.length..version
|
150
|
-
duplicates << nil
|
151
|
-
end
|
152
|
-
end
|
138
|
+
bins[name] = value
|
153
139
|
|
154
|
-
|
155
|
-
unless vmap
|
156
|
-
vmap = {}
|
157
|
-
duplicates[version] = vmap
|
158
|
-
end
|
159
|
-
else
|
160
|
-
bins = {} unless bins
|
161
|
-
vmap = bins
|
162
|
-
end
|
163
|
-
vmap[name] = value
|
140
|
+
i = i.succ
|
164
141
|
end
|
165
142
|
|
166
|
-
|
167
|
-
duplicates.compact! if duplicates
|
168
|
-
|
169
|
-
Record.new(@node, @key, bins, duplicates, generation, expiration)
|
143
|
+
Record.new(@node, @key, bins, generation, expiration)
|
170
144
|
end
|
171
145
|
|
172
146
|
end # class
|
@@ -21,7 +21,7 @@ module Aerospike
|
|
21
21
|
|
22
22
|
private
|
23
23
|
|
24
|
-
class ReadHeaderCommand < SingleCommand
|
24
|
+
class ReadHeaderCommand < SingleCommand #:nodoc:
|
25
25
|
|
26
26
|
attr_reader :record
|
27
27
|
|
@@ -46,7 +46,7 @@ module Aerospike
|
|
46
46
|
if result_code == 0
|
47
47
|
generation = @data_buffer.read_int32(14)
|
48
48
|
expiration = Aerospike.TTL(@data_buffer.read_int32(18))
|
49
|
-
@record = Record.new(@node, @key, nil,
|
49
|
+
@record = Record.new(@node, @key, nil, generation, expiration)
|
50
50
|
else
|
51
51
|
if result_code == Aerospike::ResultCode::KEY_NOT_FOUND_ERROR
|
52
52
|
@record = nil
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright 2014 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
|
+
# Pre-defined user roles.
|
20
|
+
module Role
|
21
|
+
|
22
|
+
# Manage users their roles.
|
23
|
+
USER_ADMIN = 'user-admin'
|
24
|
+
|
25
|
+
# Manage indicies, user defined functions and server configuration.
|
26
|
+
SYS_ADMIN = 'sys-admin'
|
27
|
+
|
28
|
+
# Allow read and write transactions with the database.
|
29
|
+
READ_WRITE = 'read-write'
|
30
|
+
|
31
|
+
# Allow read transactions with the database.
|
32
|
+
READ = 'Read'
|
33
|
+
|
34
|
+
end # module
|
35
|
+
|
36
|
+
end # module
|
data/lib/aerospike/info.rb
CHANGED
data/lib/aerospike/loggable.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# Copyright 2014 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 for user administration commands.
|
20
|
+
class AdminPolicy
|
21
|
+
|
22
|
+
# User administration command socket timeout in milliseconds.
|
23
|
+
# Default is one second timeout.
|
24
|
+
attr_accessor :timeout
|
25
|
+
|
26
|
+
# NewAdminPolicy generates a new AdminPolicy with default values.
|
27
|
+
def initialize(opt={})
|
28
|
+
@timeout = opt[:timeout] || 1
|
29
|
+
end
|
30
|
+
|
31
|
+
end # class
|
32
|
+
|
33
|
+
end # module
|
@@ -23,12 +23,12 @@ module Aerospike
|
|
23
23
|
attr_accessor :max_concurrent_nodes, :record_queue_size,
|
24
24
|
:wait_until_migrations_are_over
|
25
25
|
|
26
|
-
def initialize(
|
27
|
-
super()
|
26
|
+
def initialize(opt={})
|
27
|
+
super(opt)
|
28
28
|
|
29
|
-
@max_concurrent_nodes = max_concurrent_nodes || 0
|
30
|
-
@record_queue_size = record_queue_size || 5000
|
31
|
-
@wait_until_migrations_are_over = wait_until_migrations_are_over.nil? ? false : wait_until_migrations_are_over
|
29
|
+
@max_concurrent_nodes = opt[:max_concurrent_nodes] || 0
|
30
|
+
@record_queue_size = opt[:record_queue_size] || 5000
|
31
|
+
@wait_until_migrations_are_over = opt[:wait_until_migrations_are_over].nil? ? false : wait_until_migrations_are_over
|
32
32
|
|
33
33
|
self
|
34
34
|
end
|
@@ -18,18 +18,29 @@ module Aerospike
|
|
18
18
|
# Container object for client policy command.
|
19
19
|
class ClientPolicy
|
20
20
|
|
21
|
+
attr_accessor :user, :password
|
21
22
|
attr_accessor :timeout, :connection_queue_size, :fail_if_not_connected
|
22
23
|
|
23
|
-
def initialize(
|
24
|
+
def initialize(opt={})
|
24
25
|
# Initial host connection timeout in seconds. The timeout when opening a connection
|
25
26
|
# to the server host for the first time.
|
26
|
-
@timeout = timeout || 1.0 # 1 second
|
27
|
+
@timeout = opt[:timeout] || 1.0 # 1 second
|
27
28
|
|
28
29
|
# Size of the Connection Queue cache.
|
29
|
-
@connection_queue_size = connection_queue_size || 64
|
30
|
+
@connection_queue_size = opt[:connection_queue_size] || 64
|
30
31
|
|
31
32
|
# Throw exception if host connection fails during add_host.
|
32
|
-
@fail_if_not_connected = fail_if_not_connected || true
|
33
|
+
@fail_if_not_connected = opt[:fail_if_not_connected] || true
|
34
|
+
|
35
|
+
# user name
|
36
|
+
@user = opt[:user]
|
37
|
+
|
38
|
+
# password
|
39
|
+
@password = opt[:password]
|
40
|
+
end
|
41
|
+
|
42
|
+
def requires_authentication
|
43
|
+
(@user && @user != '') || (@password && @password != '')
|
33
44
|
end
|
34
45
|
|
35
46
|
end # class
|