aerospike 0.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 (62) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +0 -0
  3. data/LICENSE +203 -0
  4. data/README.md +123 -0
  5. data/lib/aerospike.rb +69 -0
  6. data/lib/aerospike/aerospike_exception.rb +111 -0
  7. data/lib/aerospike/bin.rb +46 -0
  8. data/lib/aerospike/client.rb +649 -0
  9. data/lib/aerospike/cluster/cluster.rb +537 -0
  10. data/lib/aerospike/cluster/connection.rb +113 -0
  11. data/lib/aerospike/cluster/node.rb +248 -0
  12. data/lib/aerospike/cluster/node_validator.rb +85 -0
  13. data/lib/aerospike/cluster/partition.rb +54 -0
  14. data/lib/aerospike/cluster/partition_tokenizer_new.rb +128 -0
  15. data/lib/aerospike/cluster/partition_tokenizer_old.rb +135 -0
  16. data/lib/aerospike/command/batch_command.rb +120 -0
  17. data/lib/aerospike/command/batch_command_exists.rb +93 -0
  18. data/lib/aerospike/command/batch_command_get.rb +150 -0
  19. data/lib/aerospike/command/batch_item.rb +69 -0
  20. data/lib/aerospike/command/batch_node.rb +82 -0
  21. data/lib/aerospike/command/command.rb +680 -0
  22. data/lib/aerospike/command/delete_command.rb +57 -0
  23. data/lib/aerospike/command/execute_command.rb +42 -0
  24. data/lib/aerospike/command/exists_command.rb +57 -0
  25. data/lib/aerospike/command/field_type.rb +44 -0
  26. data/lib/aerospike/command/operate_command.rb +37 -0
  27. data/lib/aerospike/command/read_command.rb +174 -0
  28. data/lib/aerospike/command/read_header_command.rb +63 -0
  29. data/lib/aerospike/command/single_command.rb +60 -0
  30. data/lib/aerospike/command/touch_command.rb +50 -0
  31. data/lib/aerospike/command/write_command.rb +60 -0
  32. data/lib/aerospike/host.rb +43 -0
  33. data/lib/aerospike/info.rb +96 -0
  34. data/lib/aerospike/key.rb +99 -0
  35. data/lib/aerospike/language.rb +25 -0
  36. data/lib/aerospike/ldt/large.rb +69 -0
  37. data/lib/aerospike/ldt/large_list.rb +100 -0
  38. data/lib/aerospike/ldt/large_map.rb +82 -0
  39. data/lib/aerospike/ldt/large_set.rb +78 -0
  40. data/lib/aerospike/ldt/large_stack.rb +72 -0
  41. data/lib/aerospike/loggable.rb +55 -0
  42. data/lib/aerospike/operation.rb +70 -0
  43. data/lib/aerospike/policy/client_policy.rb +37 -0
  44. data/lib/aerospike/policy/generation_policy.rb +37 -0
  45. data/lib/aerospike/policy/policy.rb +54 -0
  46. data/lib/aerospike/policy/priority.rb +34 -0
  47. data/lib/aerospike/policy/record_exists_action.rb +45 -0
  48. data/lib/aerospike/policy/write_policy.rb +61 -0
  49. data/lib/aerospike/record.rb +42 -0
  50. data/lib/aerospike/result_code.rb +353 -0
  51. data/lib/aerospike/task/index_task.rb +59 -0
  52. data/lib/aerospike/task/task.rb +71 -0
  53. data/lib/aerospike/task/udf_register_task.rb +55 -0
  54. data/lib/aerospike/task/udf_remove_task.rb +55 -0
  55. data/lib/aerospike/udf.rb +24 -0
  56. data/lib/aerospike/utils/buffer.rb +139 -0
  57. data/lib/aerospike/utils/epoc.rb +28 -0
  58. data/lib/aerospike/utils/pool.rb +65 -0
  59. data/lib/aerospike/value/particle_type.rb +45 -0
  60. data/lib/aerospike/value/value.rb +380 -0
  61. data/lib/aerospike/version.rb +4 -0
  62. metadata +132 -0
@@ -0,0 +1,59 @@
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
+ require 'thread'
18
+ require 'time'
19
+
20
+ require 'aerospike/task/task'
21
+
22
+ module Aerospike
23
+
24
+ private
25
+
26
+ class IndexTask < Task
27
+
28
+ MATCHER = /.*load_pct=(?<load_pct>\d+(\.\d+)?).*/
29
+
30
+ def initialize(cluster, namespace, index_name, done=false)
31
+ super(cluster, done)
32
+ @namespace = namespace
33
+ @index_name = index_name
34
+
35
+ self
36
+ end
37
+
38
+ private
39
+
40
+ def all_nodes_done?
41
+ command = "sindex/#{@namespace}/#{@index_name}"
42
+ nodes = @cluster.nodes
43
+
44
+ nodes.each do |node|
45
+ conn = node.get_connection(1)
46
+ response_map = Info.request(conn, command)
47
+ _, response = response_map.first
48
+ match = response.to_s.match(MATCHER)
49
+ load = match.nil? ? nil : match[:load_pct]
50
+
51
+ return false if load && (0...100).include?(load.to_f)
52
+ end
53
+
54
+ return true
55
+ end
56
+
57
+ end # class
58
+
59
+ end # module
@@ -0,0 +1,71 @@
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
+ require 'thread'
18
+ require 'time'
19
+ require 'atomic'
20
+
21
+ module Aerospike
22
+
23
+ private
24
+
25
+ class Task
26
+
27
+ def initialize(cluster, done)
28
+ @cluster = cluster
29
+ @done = Atomic.new(done)
30
+ @done_thread = Atomic.new(nil)
31
+
32
+ self
33
+ end
34
+
35
+ def wait_till_completed(poll_interval = 0.1, allowed_failures = 3)
36
+ return true if @done.value
37
+
38
+ # make sure there will be only ONE thread polling for completetion status
39
+ @done_thread.update do |dt|
40
+ dt ? dt : Thread.new do
41
+ abort_on_exception=true
42
+ failures = 0
43
+ while true
44
+ begin
45
+ break if completed?
46
+ sleep(poll_interval.to_f)
47
+ rescue => e
48
+ break if failures > allowed_failures
49
+ failures += 1
50
+ end
51
+ end
52
+ end
53
+ end
54
+
55
+ # wait for the poll thread to finish
56
+ @done_thread.value.join
57
+ # in case of errors and exceptions, the @done value might be false
58
+ @done.value
59
+ end
60
+
61
+ def completed?
62
+ if @done.value == true
63
+ true
64
+ else
65
+ @done.value = all_nodes_done?
66
+ end
67
+ end
68
+
69
+ end # class
70
+
71
+ end # module
@@ -0,0 +1,55 @@
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
+ require 'thread'
18
+ require 'time'
19
+
20
+ require 'aerospike/task/task'
21
+
22
+ module Aerospike
23
+
24
+ private
25
+
26
+ class UdfRegisterTask < Task
27
+
28
+ def initialize(cluster, package_name)
29
+ super(cluster, false)
30
+ @package_name = package_name
31
+
32
+ self
33
+ end
34
+
35
+ private
36
+
37
+ def all_nodes_done?
38
+ command = 'udf-list'
39
+ nodes = @cluster.nodes
40
+
41
+ nodes.each do |node|
42
+ conn = node.get_connection(1)
43
+ response_map = Info.request(conn, command)
44
+ _, response = response_map.first
45
+ index = response.to_s.index("filename=#{@package_name}")
46
+
47
+ return false if index.nil?
48
+ end
49
+
50
+ return true
51
+ end
52
+
53
+ end # class
54
+
55
+ end # module
@@ -0,0 +1,55 @@
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
+ require 'thread'
18
+ require 'time'
19
+
20
+ require 'aerospike/task/task'
21
+
22
+ module Aerospike
23
+
24
+ private
25
+
26
+ class UdfRemoveTask < Task
27
+
28
+ def initialize(cluster, package_name)
29
+ super(cluster, false)
30
+ @package_name = package_name
31
+
32
+ self
33
+ end
34
+
35
+ private
36
+
37
+ def all_nodes_done?
38
+ command = 'udf-list'
39
+ nodes = @cluster.nodes
40
+
41
+ nodes.each do |node|
42
+ conn = node.get_connection(1)
43
+ response_map = Info.request(conn, command)
44
+ _, response = response_map.first
45
+ index = response.to_s.index("filename=#{@package_name}")
46
+
47
+ return false if index
48
+ end
49
+
50
+ return true
51
+ end
52
+
53
+ end # class
54
+
55
+ end # module
@@ -0,0 +1,24 @@
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
+ # Polymorphic value classes used to efficiently serialize objects into the wire protocol.
20
+ class UDF
21
+ attr_accessor :filename, :hash, :language
22
+ end # class
23
+
24
+ end
@@ -0,0 +1,139 @@
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
+ require 'aerospike/utils/pool'
18
+
19
+ module Aerospike
20
+
21
+ private
22
+
23
+ # Buffer class to ease the work around
24
+ class Buffer
25
+
26
+ @@buf_pool = Pool.new
27
+ @@buf_pool.create_block = Proc.new { Buffer.new }
28
+
29
+ attr_accessor :buf
30
+
31
+ INT16 = 's>'
32
+ INT32 = 'l>'
33
+ INT64 = 'q>'
34
+
35
+ DEFAULT_BUFFER_SIZE = 16 * 1024
36
+ MAX_BUFFER_SIZE = 10 * 1024 * 1024
37
+
38
+ def initialize(size=DEFAULT_BUFFER_SIZE)
39
+ @buf = "%0#{size}d" % 0
40
+
41
+ @slice_end = @buf.bytesize
42
+ end
43
+
44
+ def self.get
45
+ @@buf_pool.poll
46
+ end
47
+
48
+ def self.put(buffer)
49
+ @@buf_pool.offer(buffer)
50
+ end
51
+
52
+ def size
53
+ @buf.bytesize
54
+ end
55
+ alias_method :length, :size
56
+
57
+ def resize(length)
58
+ if @buf.bytesize < length
59
+ @buf.concat("%0#{length - @buf.bytesize}d" % 0)
60
+ end
61
+ @slice_end = length
62
+ end
63
+
64
+ def write_byte(byte, offset)
65
+ @buf.setbyte(offset, byte.ord)
66
+ 1
67
+ end
68
+
69
+ def write_binary(data, offset)
70
+ @buf[offset, data.bytesize] = data
71
+ data.bytesize
72
+ end
73
+
74
+ def write_int16(i, offset)
75
+ @buf[offset, 2] = [i].pack(INT16)
76
+ 2
77
+ end
78
+
79
+ def write_int32(i, offset)
80
+ @buf[offset, 4] = [i].pack(INT32)
81
+ 4
82
+ end
83
+
84
+ def write_int64(i, offset)
85
+ @buf[offset, 8] = [i].pack(INT64)
86
+ 8
87
+ end
88
+
89
+ def read(offset, len=1)
90
+ start = offset
91
+
92
+ if len == 1
93
+ @buf.getbyte(start)
94
+ else
95
+ @buf[start, len]
96
+ end
97
+ end
98
+
99
+ def read_int16(offset)
100
+ vals = @buf[offset..offset+1]
101
+ vals.unpack(INT16)[0]
102
+ end
103
+
104
+ def read_int32(offset)
105
+ vals = @buf[offset..offset+3]
106
+ vals.unpack(INT32)[0]
107
+ end
108
+
109
+ def read_int64(offset)
110
+ vals = @buf[offset..offset+7]
111
+ vals.unpack(INT64)[0]
112
+ end
113
+
114
+ def read_var_int64(offset, len)
115
+ val = 0
116
+ for i in 0...len
117
+ val <<= 8
118
+ val |= @buf[offset+i].ord & 0xFF
119
+ end
120
+ val
121
+ end
122
+
123
+ def to_s
124
+ @buf[0..@slice_end-1]
125
+ end
126
+
127
+ def dump(from=nil, to=nil)
128
+ from ||= 0
129
+ to ||= @slice_end - 1
130
+
131
+ @buf.bytes[from...to].each do |c|
132
+ print c.ord.to_s(16)
133
+ putc ' '
134
+ end
135
+ end
136
+
137
+ end # buffer
138
+
139
+ end # module
@@ -0,0 +1,28 @@
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
+ require 'time'
18
+
19
+ module Aerospike
20
+
21
+ CITRUSLEAF_EPOCH = 1262304000
22
+
23
+ # Converts an Expiration time to TTL in seconds
24
+ def self.TTL(secs_from_citrus_leaf_epoc)
25
+ CITRUSLEAF_EPOCH+secs_from_citrus_leaf_epoc - Time.now.to_i
26
+ end
27
+
28
+ end # module
@@ -0,0 +1,65 @@
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
+ require 'thread'
18
+ require 'timeout'
19
+
20
+ module Aerospike
21
+
22
+ private
23
+
24
+ class Pool
25
+
26
+ attr_accessor :create_block, :cleanup_block
27
+
28
+ def initialize(max_size = 256, &block)
29
+ @create_block = block
30
+ @cleanup_block = nil
31
+
32
+ @pool = Queue.new
33
+ @max_size = max_size
34
+ end
35
+
36
+ def offer(obj)
37
+ if @pool.length < @max_size
38
+ @pool << obj
39
+ elsif @cleanup_block
40
+ @cleanup_block.call(obj)
41
+ end
42
+ end
43
+ alias_method :<<, :offer
44
+
45
+ def poll(create_new=true)
46
+ res = nil
47
+ begin
48
+ res = @pool.pop(true) # non_blocking
49
+ return res
50
+ rescue
51
+ return @create_block.call if @create_block && create_new
52
+ end
53
+ end
54
+
55
+ def empty?
56
+ @pool.length == 0
57
+ end
58
+
59
+ def length
60
+ @pool.length
61
+ end
62
+
63
+ end
64
+
65
+ end