roma-client 0.3.7 → 0.4.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.
- data/CHANGELOG +2 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +26 -0
- data/Rakefile +36 -8
- data/lib/roma/client/client_pool.rb +128 -0
- data/lib/roma/client/con_pool.rb +10 -4
- data/lib/roma/client/rclient.rb +40 -6
- data/lib/roma/client/sender.rb +18 -7
- data/lib/roma/client/version.rb +2 -2
- data/lib/roma-client.rb +6 -0
- data/spec/roma/client/client_pool_spec.rb +288 -0
- data/spec/roma/client/version_spec.rb +11 -0
- data/spec/spec_helper.rb +12 -0
- metadata +35 -15
data/CHANGELOG
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
GEM
|
2
|
+
remote: http://rubygems.org/
|
3
|
+
specs:
|
4
|
+
diff-lcs (1.1.3)
|
5
|
+
json (1.6.1)
|
6
|
+
rake (0.9.2.2)
|
7
|
+
rdoc (3.11)
|
8
|
+
json (~> 1.4)
|
9
|
+
rr (1.0.4)
|
10
|
+
rspec (2.7.0)
|
11
|
+
rspec-core (~> 2.7.0)
|
12
|
+
rspec-expectations (~> 2.7.0)
|
13
|
+
rspec-mocks (~> 2.7.0)
|
14
|
+
rspec-core (2.7.1)
|
15
|
+
rspec-expectations (2.7.0)
|
16
|
+
diff-lcs (~> 1.1.2)
|
17
|
+
rspec-mocks (2.7.0)
|
18
|
+
|
19
|
+
PLATFORMS
|
20
|
+
ruby
|
21
|
+
|
22
|
+
DEPENDENCIES
|
23
|
+
rake
|
24
|
+
rdoc
|
25
|
+
rr
|
26
|
+
rspec
|
data/Rakefile
CHANGED
@@ -1,13 +1,22 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require 'rubygems'
|
3
3
|
require 'rake'
|
4
|
-
require '
|
5
|
-
|
4
|
+
require 'rubygems/package_task'
|
5
|
+
|
6
|
+
if File.exist?(File.expand_path('Gemfile', File.dirname(__FILE__)))
|
7
|
+
require 'bundler/setup'
|
8
|
+
end
|
9
|
+
|
10
|
+
begin
|
11
|
+
require 'rdoc/task'
|
12
|
+
rescue LoadError
|
13
|
+
require 'rake/rdoctask'
|
14
|
+
end
|
6
15
|
|
7
16
|
RDOC_OPTIONS = [
|
8
17
|
'--line-numbers',
|
9
18
|
'--inline-source',
|
10
|
-
"--main", "README
|
19
|
+
"--main", "README",
|
11
20
|
"-c UTF-8",
|
12
21
|
]
|
13
22
|
|
@@ -20,9 +29,12 @@ PKG_FILES = FileList[
|
|
20
29
|
'spec/**/*.rb',
|
21
30
|
'doc/**/*',
|
22
31
|
'examples/**/*',
|
23
|
-
]
|
32
|
+
]
|
33
|
+
|
34
|
+
require File.expand_path(File.join("lib", "roma", "client", "version"),
|
35
|
+
File.dirname(__FILE__))
|
24
36
|
|
25
|
-
VER_NUM =
|
37
|
+
VER_NUM = Roma::Client::VERSION::STRING
|
26
38
|
|
27
39
|
if VER_NUM =~ /([0-9.]+)$/
|
28
40
|
CURRENT_VERSION = $1
|
@@ -30,7 +42,21 @@ else
|
|
30
42
|
CURRENT_VERSION = "0.0.0"
|
31
43
|
end
|
32
44
|
|
45
|
+
begin
|
46
|
+
require 'rspec/core'
|
47
|
+
require 'rspec/core/rake_task'
|
48
|
+
rescue LoadError
|
49
|
+
puts "no rspec"
|
50
|
+
else
|
51
|
+
RSpec::Core::RakeTask.new(:spec) do |t|
|
52
|
+
t.ruby_opts=""
|
53
|
+
t.rcov = false
|
54
|
+
end
|
55
|
+
task :default => :spec
|
56
|
+
end
|
57
|
+
|
33
58
|
SPEC = Gem::Specification.new do |s|
|
59
|
+
s.authors = ["Muga Nishizawa", "Junji Torii"]
|
34
60
|
s.name = "roma-client"
|
35
61
|
s.version = CURRENT_VERSION
|
36
62
|
s.summary = "ROMA client library"
|
@@ -43,10 +69,10 @@ SPEC = Gem::Specification.new do |s|
|
|
43
69
|
|
44
70
|
s.has_rdoc = true
|
45
71
|
s.rdoc_options.concat RDOC_OPTIONS
|
46
|
-
s.extra_rdoc_files = ["README"]
|
72
|
+
s.extra_rdoc_files = ["README", "CHANGELOG"]
|
47
73
|
end
|
48
74
|
|
49
|
-
package_task =
|
75
|
+
package_task = Gem::PackageTask.new(SPEC) do |pkg|
|
50
76
|
end
|
51
77
|
|
52
78
|
|
@@ -55,5 +81,7 @@ Rake::RDocTask.new("doc") { |rdoc|
|
|
55
81
|
rdoc.title = "ROMA documents"
|
56
82
|
rdoc.options.concat RDOC_OPTIONS
|
57
83
|
rdoc.rdoc_files.include('lib/**/*.rb')
|
58
|
-
rdoc.rdoc_files.include("README
|
84
|
+
rdoc.rdoc_files.include("README")
|
85
|
+
rdoc.rdoc_files.include("CHANGELOG")
|
59
86
|
}
|
87
|
+
|
@@ -0,0 +1,128 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'singleton'
|
3
|
+
|
4
|
+
module Roma
|
5
|
+
module Client
|
6
|
+
# RomaClient Pool class
|
7
|
+
#
|
8
|
+
# This class is implemented as Singleton.
|
9
|
+
# You can get RomaClient as follows.
|
10
|
+
#
|
11
|
+
# client = Roma::Client::ClientPool.instance.client
|
12
|
+
#
|
13
|
+
# You can change pool size of RomaClient to call "max_pool_size=" method .
|
14
|
+
# Default max pool size is 1.
|
15
|
+
class ClientPool
|
16
|
+
private_class_method :new
|
17
|
+
|
18
|
+
attr_accessor :servers
|
19
|
+
attr_accessor :default_hash_name
|
20
|
+
attr_accessor :start_sync_routing_proc
|
21
|
+
|
22
|
+
@@client_pools = {}
|
23
|
+
|
24
|
+
# get ClientPool instance
|
25
|
+
# type:: identifier for client groups.
|
26
|
+
def self.instance(type = :default)
|
27
|
+
@@client_pools[type] ||= new
|
28
|
+
@@client_pools[type]
|
29
|
+
end
|
30
|
+
|
31
|
+
# get all pool
|
32
|
+
def self.client_pools
|
33
|
+
@@client_pools
|
34
|
+
end
|
35
|
+
|
36
|
+
# release all pool
|
37
|
+
def self.release_all
|
38
|
+
@@client_pools = {}
|
39
|
+
end
|
40
|
+
|
41
|
+
# get RomaClient instance
|
42
|
+
#
|
43
|
+
# type:: RomaClient instance group.
|
44
|
+
# return:: RomaClient instance
|
45
|
+
def client
|
46
|
+
c = nil
|
47
|
+
if @clients.empty?
|
48
|
+
client = Roma::Client::RomaClient.new(servers,
|
49
|
+
plugin_modules,
|
50
|
+
start_sync_routing_proc)
|
51
|
+
client.default_hash_name = default_hash_name
|
52
|
+
c = client
|
53
|
+
else
|
54
|
+
c = @clients.pop
|
55
|
+
end
|
56
|
+
|
57
|
+
return c unless block_given?
|
58
|
+
|
59
|
+
begin
|
60
|
+
yield c
|
61
|
+
ensure
|
62
|
+
push_client(c)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# get pool count of clients
|
67
|
+
def pool_count
|
68
|
+
@clients.size
|
69
|
+
end
|
70
|
+
|
71
|
+
# release all pool clients
|
72
|
+
def release
|
73
|
+
@clients.clear
|
74
|
+
true
|
75
|
+
end
|
76
|
+
|
77
|
+
# push RomaClient instance
|
78
|
+
def push_client(client)
|
79
|
+
if @clients.size < max_pool_size
|
80
|
+
@clients.push(client)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
# get max pool size
|
85
|
+
def max_pool_size
|
86
|
+
@max_pool_size
|
87
|
+
end
|
88
|
+
|
89
|
+
# set max_pool_size
|
90
|
+
def max_pool_size=(count)
|
91
|
+
@max_pool_size = count
|
92
|
+
end
|
93
|
+
|
94
|
+
# get all clients
|
95
|
+
def clients
|
96
|
+
@clients
|
97
|
+
end
|
98
|
+
|
99
|
+
# get plugin_modules
|
100
|
+
def plugin_modules
|
101
|
+
@plugin_modules
|
102
|
+
end
|
103
|
+
|
104
|
+
# add plugin module
|
105
|
+
def add_plugin_module(m)
|
106
|
+
@plugin_modules ||= []
|
107
|
+
@plugin_modules.push(m)
|
108
|
+
end
|
109
|
+
|
110
|
+
# set plugin modules
|
111
|
+
#
|
112
|
+
# You can set class Array.
|
113
|
+
def plugin_modules=(modules)
|
114
|
+
@plugin_modules = modules
|
115
|
+
end
|
116
|
+
|
117
|
+
private
|
118
|
+
def initialize
|
119
|
+
@max_pool_size = 1
|
120
|
+
@clients = []
|
121
|
+
@plugin_modules = nil
|
122
|
+
self.servers = nil
|
123
|
+
self.default_hash_name = 'roma'
|
124
|
+
self.start_sync_routing_proc = true
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
data/lib/roma/client/con_pool.rb
CHANGED
@@ -9,15 +9,21 @@ module Roma
|
|
9
9
|
include Singleton
|
10
10
|
|
11
11
|
attr_accessor :maxlength
|
12
|
+
attr_accessor :expire_time
|
12
13
|
|
13
|
-
def initialize(maxlength = 10)
|
14
|
+
def initialize(maxlength = 10, expire_time = 60)
|
14
15
|
@pool = {}
|
15
16
|
@maxlength = maxlength
|
17
|
+
@expire_time = expire_time
|
16
18
|
@lock = Mutex.new
|
17
19
|
end
|
18
20
|
|
19
21
|
def get_connection(ap)
|
20
|
-
ret = @pool[ap].shift if @pool.key?(ap) && @pool[ap].length > 0
|
22
|
+
ret,last = @pool[ap].shift if @pool.key?(ap) && @pool[ap].length > 0
|
23
|
+
if ret && last < Time.now - @expire_time
|
24
|
+
ret.close
|
25
|
+
ret = nil
|
26
|
+
end
|
21
27
|
ret = create_connection(ap) unless ret
|
22
28
|
ret
|
23
29
|
rescue
|
@@ -29,10 +35,10 @@ module Roma
|
|
29
35
|
if @pool[ap].length > @maxlength
|
30
36
|
con.close
|
31
37
|
else
|
32
|
-
@pool[ap] << con
|
38
|
+
@pool[ap] << [con, Time.now]
|
33
39
|
end
|
34
40
|
else
|
35
|
-
@pool[ap] = [con]
|
41
|
+
@pool[ap] = [[con, Time.now]]
|
36
42
|
end
|
37
43
|
rescue
|
38
44
|
end
|
data/lib/roma/client/rclient.rb
CHANGED
@@ -24,7 +24,7 @@ module Roma
|
|
24
24
|
#
|
25
25
|
# [ini_nodes] ROMA nodes array
|
26
26
|
# [plugin_modules] set plugin modules if you use .
|
27
|
-
def initialize(ini_nodes,plugin_modules = nil)
|
27
|
+
def initialize(ini_nodes,plugin_modules = nil, start_sync_routing_proc = true)
|
28
28
|
@retry_count_write = 10
|
29
29
|
@retry_count_read = 5
|
30
30
|
@default_hash_name = 'roma'
|
@@ -37,7 +37,7 @@ module Roma
|
|
37
37
|
|
38
38
|
init_sender
|
39
39
|
update_rttable(ini_nodes.map{|n| n.sub(':','_')})
|
40
|
-
init_sync_routing_proc
|
40
|
+
init_sync_routing_proc if start_sync_routing_proc
|
41
41
|
end
|
42
42
|
|
43
43
|
def init_sync_routing_proc
|
@@ -45,7 +45,7 @@ module Roma
|
|
45
45
|
begin
|
46
46
|
loop {
|
47
47
|
sleep 10
|
48
|
-
update_rttable
|
48
|
+
update_rttable
|
49
49
|
}
|
50
50
|
rescue => e
|
51
51
|
puts "#{e}\n#{$@}"
|
@@ -59,13 +59,14 @@ module Roma
|
|
59
59
|
end
|
60
60
|
private :init_sender
|
61
61
|
|
62
|
-
def update_rttable(nodes)
|
62
|
+
def update_rttable(nodes = self.rttable.nodes)
|
63
63
|
raise RuntimeError.new("nodes must not be nil.") unless nodes
|
64
64
|
|
65
65
|
nodes.each { |node|
|
66
66
|
rt = make_rttable(node)
|
67
67
|
if rt
|
68
68
|
@rttable = rt
|
69
|
+
@rttable_last_update = Time.now
|
69
70
|
return
|
70
71
|
end
|
71
72
|
}
|
@@ -73,6 +74,10 @@ module Roma
|
|
73
74
|
raise RuntimeError.new("fatal error")
|
74
75
|
end
|
75
76
|
|
77
|
+
def rttable_last_update
|
78
|
+
@rttable_last_update
|
79
|
+
end
|
80
|
+
|
76
81
|
def make_rttable(node)
|
77
82
|
mklhash = @sender.send_route_mklhash_command(node)
|
78
83
|
return nil unless mklhash
|
@@ -221,8 +226,30 @@ module Roma
|
|
221
226
|
sender(:oneline_receiver, key, val, "prepend %s 0 %d %d", expt.to_i, val.length)
|
222
227
|
end
|
223
228
|
|
224
|
-
|
225
|
-
|
229
|
+
# Compare And Swap value .
|
230
|
+
#
|
231
|
+
# [key] key for cas .
|
232
|
+
# [value] store value .
|
233
|
+
# [exp] expire seconds .
|
234
|
+
#
|
235
|
+
# [return] return follow set status .
|
236
|
+
# - If method is success, return STORED .
|
237
|
+
# - If method cannot update value, return EXISTS .
|
238
|
+
# - If key doesn't exist in ROMA, this method return NOT_FOUND.
|
239
|
+
# - If server error, return SERVER_ERROR .
|
240
|
+
#
|
241
|
+
# If socket error occured, throw Exception .
|
242
|
+
#
|
243
|
+
# If socket timeout occured, throw TimeoutError .
|
244
|
+
def cas(key, expt = 0, raw = false)
|
245
|
+
raise "A block is required" unless block_given?
|
246
|
+
|
247
|
+
(val, casid) = gets_with_casid(key, raw)
|
248
|
+
return "NOT_FOUND" unless val
|
249
|
+
updated = yield val
|
250
|
+
val = raw ? updated : Marshal.dump(updated)
|
251
|
+
|
252
|
+
sender(:oneline_receiver, key, val, "cas %s 0 %d %d %s", expt.to_i, val.length, casid)
|
226
253
|
end
|
227
254
|
|
228
255
|
# Delete value .
|
@@ -367,6 +394,13 @@ module Roma
|
|
367
394
|
|
368
395
|
private
|
369
396
|
|
397
|
+
def gets_with_casid(key, raw = false)
|
398
|
+
ret = sender(:value_casid_receiver, key, nil, "gets %s")
|
399
|
+
return [nil, nil] if ret.size <= 0
|
400
|
+
ret[0] = Marshal.load(ret[0]) unless raw
|
401
|
+
ret
|
402
|
+
end
|
403
|
+
|
370
404
|
def sender(receiver, key, value ,cmd, *params)
|
371
405
|
nid, d = @rttable.search_node(key)
|
372
406
|
cmd2 = sprintf(cmd, "#{key}\e#{@default_hash_name}", *params)
|
data/lib/roma/client/sender.rb
CHANGED
@@ -37,7 +37,7 @@ module Roma
|
|
37
37
|
return :error if routes_length < 0
|
38
38
|
return nil
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
41
|
routes = ''
|
42
42
|
while (routes.length != routes_length)
|
43
43
|
routes = routes + conn.read(routes_length - routes.length)
|
@@ -56,7 +56,7 @@ module Roma
|
|
56
56
|
def send_routedump_yaml_command(node_id)
|
57
57
|
conn = ConPool.instance.get_connection(node_id)
|
58
58
|
conn.write "routingdump yaml\r\n"
|
59
|
-
|
59
|
+
|
60
60
|
yaml = ''
|
61
61
|
while( (line = conn.gets) != "END\r\n" )
|
62
62
|
yaml << line
|
@@ -64,7 +64,7 @@ module Roma
|
|
64
64
|
|
65
65
|
rd = YAML.load(yaml)
|
66
66
|
ConPool.instance.return_connection(node_id, conn)
|
67
|
-
return rd
|
67
|
+
return rd
|
68
68
|
end
|
69
69
|
|
70
70
|
def send_stats_command
|
@@ -108,7 +108,7 @@ module Roma
|
|
108
108
|
def oneline_receiver(con)
|
109
109
|
ret = con.gets
|
110
110
|
raise "connection closed" if ret.nil?
|
111
|
-
ret.chomp
|
111
|
+
ret.chomp
|
112
112
|
end
|
113
113
|
|
114
114
|
def value_list_receiver(con)
|
@@ -131,9 +131,21 @@ module Roma
|
|
131
131
|
read_bytes(con, 2)
|
132
132
|
end
|
133
133
|
ret
|
134
|
-
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def value_casid_receiver(con)
|
137
|
+
ret = []
|
138
|
+
while (line = con.gets) != "END\r\n"
|
139
|
+
s = line.split(' ')
|
140
|
+
return line.chomp if s[0] == 'SERVER_ERROR' || s[0] == 'CLIENT_ERROR'
|
141
|
+
ret << read_bytes(con, s[3].to_i)
|
142
|
+
ret << s[4]
|
143
|
+
read_bytes(con, 2)
|
144
|
+
end
|
145
|
+
ret
|
146
|
+
end
|
135
147
|
|
136
|
-
def multiplelines_receiver(con)
|
148
|
+
def multiplelines_receiver(con)
|
137
149
|
ret = []
|
138
150
|
while (line = con.gets) != "END\r\n"
|
139
151
|
ret << line.chomp
|
@@ -150,6 +162,5 @@ module Roma
|
|
150
162
|
end
|
151
163
|
|
152
164
|
end
|
153
|
-
|
154
165
|
end
|
155
166
|
end
|
data/lib/roma/client/version.rb
CHANGED
data/lib/roma-client.rb
ADDED
@@ -0,0 +1,288 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.expand_path(File.join('..', '..', 'spec_helper'), File.dirname(__FILE__))
|
3
|
+
|
4
|
+
describe Roma::Client::ClientPool do
|
5
|
+
def get_nodes
|
6
|
+
['127.0.0.1:12001', '127.0.0.1:12002']
|
7
|
+
end
|
8
|
+
|
9
|
+
context "Singleton" do
|
10
|
+
subject { Roma::Client::ClientPool.instance(:test) }
|
11
|
+
it {
|
12
|
+
subject.class.should == Roma::Client::ClientPool
|
13
|
+
}
|
14
|
+
|
15
|
+
it {
|
16
|
+
subject.should be_equal Roma::Client::ClientPool.instance(:test)
|
17
|
+
}
|
18
|
+
|
19
|
+
it {
|
20
|
+
subject.should_not be_equal Roma::Client::ClientPool.instance(:test2)
|
21
|
+
}
|
22
|
+
|
23
|
+
it {
|
24
|
+
expect {
|
25
|
+
Roma::Client::ClientPool.new
|
26
|
+
}.to raise_error(NoMethodError,
|
27
|
+
"private method `new' called for Roma::Client::ClientPool:Class")
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
context "max pool size of default" do
|
32
|
+
subject{ Roma::Client::ClientPool.instance(:test) }
|
33
|
+
its(:max_pool_size) {
|
34
|
+
should == 1
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
context "set max pool size " do
|
39
|
+
it do
|
40
|
+
pool = Roma::Client::ClientPool.instance(:test)
|
41
|
+
pool.max_pool_size.should == 1
|
42
|
+
pool.max_pool_size = 3
|
43
|
+
pool.max_pool_size.should == 3
|
44
|
+
|
45
|
+
pool2 = Roma::Client::ClientPool.instance(:test2)
|
46
|
+
pool2.max_pool_size.should == 1
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context "servers default" do
|
51
|
+
subject { Roma::Client::ClientPool.instance(:test) }
|
52
|
+
its(:servers) { should be_nil }
|
53
|
+
end
|
54
|
+
|
55
|
+
context "servers set" do
|
56
|
+
it {
|
57
|
+
pool = Roma::Client::ClientPool.instance(:test_servers_set)
|
58
|
+
pool.servers.should be_nil
|
59
|
+
nodes = get_nodes
|
60
|
+
pool.servers = nodes
|
61
|
+
pool.servers.should == nodes
|
62
|
+
|
63
|
+
Roma::Client::ClientPool.instance(:test_ini_nodes_set2).servers.should be_nil
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
context "client" do
|
68
|
+
subject do
|
69
|
+
pool = Roma::Client::ClientPool.instance(:test_client)
|
70
|
+
pool.servers = get_nodes
|
71
|
+
pool
|
72
|
+
end
|
73
|
+
|
74
|
+
it { pending 'TODO: startup or mock roma server'}
|
75
|
+
it { subject.pool_count.should == 0 }
|
76
|
+
it {
|
77
|
+
client = subject.client
|
78
|
+
client.class.should == Roma::Client::RomaClient
|
79
|
+
subject.push_client(client)
|
80
|
+
subject.pool_count.should == 1
|
81
|
+
}
|
82
|
+
it { pending "TODO: check nodes" }
|
83
|
+
end
|
84
|
+
|
85
|
+
context "client multi pool" do
|
86
|
+
subject do
|
87
|
+
pool = Roma::Client::ClientPool.instance(:test_client2)
|
88
|
+
pool.servers = get_nodes
|
89
|
+
pool
|
90
|
+
end
|
91
|
+
|
92
|
+
it {
|
93
|
+
subject.pool_count.should == 0
|
94
|
+
client = subject.client
|
95
|
+
client.should_not be_nil
|
96
|
+
|
97
|
+
client2 = subject.client
|
98
|
+
client2.should_not be_nil
|
99
|
+
|
100
|
+
subject.push_client(client)
|
101
|
+
subject.pool_count.should == 1
|
102
|
+
|
103
|
+
subject.push_client(client2)
|
104
|
+
subject.pool_count.should == 1
|
105
|
+
|
106
|
+
client.should be_equal subject.client
|
107
|
+
subject.pool_count.should == 0
|
108
|
+
}
|
109
|
+
end
|
110
|
+
|
111
|
+
context "plugin modules" do
|
112
|
+
module TestPlugin
|
113
|
+
def test_plugin
|
114
|
+
"test_plugin"
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
module TestPlugin2
|
119
|
+
def test_plugin2
|
120
|
+
"test_plugin2"
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
it {
|
125
|
+
pool = Roma::Client::ClientPool.instance(:pm_test)
|
126
|
+
pool.plugin_modules.should be_nil
|
127
|
+
|
128
|
+
pool.add_plugin_module(TestPlugin)
|
129
|
+
pool.plugin_modules.should_not be_nil
|
130
|
+
pool.plugin_modules.size.should == 1
|
131
|
+
pool.plugin_modules[0] == TestPlugin
|
132
|
+
}
|
133
|
+
|
134
|
+
it {
|
135
|
+
pool = Roma::Client::ClientPool.instance(:pms_test)
|
136
|
+
pool.plugin_modules.should be_nil
|
137
|
+
|
138
|
+
pool.plugin_modules = [TestPlugin, TestPlugin2]
|
139
|
+
pool.plugin_modules.size.should == 2
|
140
|
+
pool.plugin_modules[0] == TestPlugin
|
141
|
+
pool.plugin_modules[1] == TestPlugin2
|
142
|
+
}
|
143
|
+
|
144
|
+
it {
|
145
|
+
pool = Roma::Client::ClientPool.instance(:pms_test2)
|
146
|
+
pool.servers = get_nodes
|
147
|
+
pool.plugin_modules.should be_nil
|
148
|
+
|
149
|
+
pool.plugin_modules = [TestPlugin, TestPlugin2]
|
150
|
+
client = pool.client
|
151
|
+
client.should_not be_nil
|
152
|
+
client.test_plugin.should == "test_plugin"
|
153
|
+
client.test_plugin2.should == "test_plugin2"
|
154
|
+
}
|
155
|
+
end
|
156
|
+
|
157
|
+
context "default type" do
|
158
|
+
subject { Roma::Client::ClientPool.instance }
|
159
|
+
it { should_not be_nil }
|
160
|
+
it { subject.class.should == Roma::Client::ClientPool }
|
161
|
+
it { subject.should be_equal Roma::Client::ClientPool.instance(:default) }
|
162
|
+
end
|
163
|
+
|
164
|
+
context "support hash name" do
|
165
|
+
after(:all) {
|
166
|
+
Roma::Client::ClientPool.instance.default_hash_name = 'roma'
|
167
|
+
}
|
168
|
+
|
169
|
+
subject {
|
170
|
+
pool = Roma::Client::ClientPool.instance
|
171
|
+
pool.servers = get_nodes
|
172
|
+
pool
|
173
|
+
}
|
174
|
+
|
175
|
+
it { subject.default_hash_name.should == 'roma' }
|
176
|
+
it {
|
177
|
+
subject.default_hash_name = 'new_name'
|
178
|
+
subject.default_hash_name.should == 'new_name'
|
179
|
+
Roma::Client::ClientPool.instance.default_hash_name.should == 'new_name'
|
180
|
+
Roma::Client::ClientPool.instance(:other).default_hash_name.should == 'roma'
|
181
|
+
|
182
|
+
client = subject.client
|
183
|
+
client.default_hash_name.should == 'new_name'
|
184
|
+
}
|
185
|
+
end
|
186
|
+
|
187
|
+
context "release" do
|
188
|
+
subject {
|
189
|
+
pool = Roma::Client::ClientPool.instance(:release_test)
|
190
|
+
pool.servers = get_nodes
|
191
|
+
pool
|
192
|
+
}
|
193
|
+
|
194
|
+
it {
|
195
|
+
subject.pool_count.should == 0
|
196
|
+
subject.client do |client|
|
197
|
+
end
|
198
|
+
|
199
|
+
subject.pool_count.should == 1
|
200
|
+
subject.release.should be_true
|
201
|
+
subject.pool_count.should == 0
|
202
|
+
}
|
203
|
+
end
|
204
|
+
|
205
|
+
context "client block" do
|
206
|
+
before(:each) do
|
207
|
+
pool = Roma::Client::ClientPool.instance(:client_block)
|
208
|
+
pool.release
|
209
|
+
end
|
210
|
+
|
211
|
+
subject {
|
212
|
+
pool = Roma::Client::ClientPool.instance(:client_block)
|
213
|
+
pool.servers = get_nodes
|
214
|
+
pool
|
215
|
+
}
|
216
|
+
|
217
|
+
it "use block"do
|
218
|
+
subject.pool_count.should == 0
|
219
|
+
subject.client do |client|
|
220
|
+
client.set("test", "value").should == "STORED"
|
221
|
+
end
|
222
|
+
subject.pool_count.should == 1
|
223
|
+
end
|
224
|
+
|
225
|
+
it "raise exception in block, but pool certainly" do
|
226
|
+
subject.pool_count.should == 0
|
227
|
+
subject.client do |client|
|
228
|
+
client.set("test", "value").should == "STORED"
|
229
|
+
end
|
230
|
+
subject.pool_count.should == 1
|
231
|
+
|
232
|
+
lambda {
|
233
|
+
subject.client do |client|
|
234
|
+
raise "test error"
|
235
|
+
end
|
236
|
+
}.should raise_error RuntimeError, "test error"
|
237
|
+
|
238
|
+
subject.pool_count.should == 1
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
context "start sync routing proc" do
|
243
|
+
it {
|
244
|
+
pool = Roma::Client::ClientPool.instance(:sync_test)
|
245
|
+
pool.servers = get_nodes
|
246
|
+
old_thread_count = Thread.list.length
|
247
|
+
pool.client do |c|
|
248
|
+
end
|
249
|
+
|
250
|
+
pool.pool_count.should == 1
|
251
|
+
Thread.list.length.should == old_thread_count + 1
|
252
|
+
}
|
253
|
+
|
254
|
+
it {
|
255
|
+
pool = Roma::Client::ClientPool.instance(:no_sync_test)
|
256
|
+
pool.servers = get_nodes
|
257
|
+
pool.start_sync_routing_proc = false
|
258
|
+
old_thread_count = Thread.list.length
|
259
|
+
pool.client do |c|
|
260
|
+
end
|
261
|
+
|
262
|
+
pool.pool_count.should == 1
|
263
|
+
Thread.list.length.should == old_thread_count
|
264
|
+
}
|
265
|
+
end
|
266
|
+
|
267
|
+
context "release all" do
|
268
|
+
it {
|
269
|
+
pool = Roma::Client::ClientPool.instance(:release_all_1)
|
270
|
+
pool.servers = get_nodes
|
271
|
+
pool.client do |c|
|
272
|
+
end
|
273
|
+
Roma::Client::ClientPool.instance(:release_all_1).pool_count.should == 1
|
274
|
+
|
275
|
+
pool = Roma::Client::ClientPool.instance(:release_all_2)
|
276
|
+
pool.servers = get_nodes
|
277
|
+
pool.client do |c|
|
278
|
+
end
|
279
|
+
pool.pool_count.should == 1
|
280
|
+
Roma::Client::ClientPool.instance(:release_all_2).pool_count.should == 1
|
281
|
+
|
282
|
+
Roma::Client::ClientPool.release_all
|
283
|
+
Roma::Client::ClientPool.instance(:release_all_1).pool_count.should == 0
|
284
|
+
Roma::Client::ClientPool.instance(:release_all_2).pool_count.should == 0
|
285
|
+
}
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require File.expand_path(File.join('..', '..', 'spec_helper'), File.dirname(__FILE__))
|
3
|
+
|
4
|
+
describe Roma::Client::VERSION do
|
5
|
+
it 'should string' do
|
6
|
+
Roma::Client::VERSION::STRING.should ==
|
7
|
+
"#{Roma::Client::VERSION::MAJOR}." +
|
8
|
+
"#{Roma::Client::VERSION::MINOR}." +
|
9
|
+
"#{Roma::Client::VERSION::TINY}"
|
10
|
+
end
|
11
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'rspec'
|
3
|
+
|
4
|
+
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib'))
|
5
|
+
Dir[File.dirname(__FILE__) + "/supports/**/*.rb"].each {|f| require f}
|
6
|
+
|
7
|
+
require 'roma-client'
|
8
|
+
|
9
|
+
RSpec.configure do |config|
|
10
|
+
config.mock_with :rr
|
11
|
+
end
|
12
|
+
|
metadata
CHANGED
@@ -1,16 +1,22 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: roma-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 15
|
5
|
+
prerelease:
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 4
|
9
|
+
- 0
|
10
|
+
version: 0.4.0
|
5
11
|
platform: ruby
|
6
|
-
authors:
|
7
|
-
|
12
|
+
authors:
|
13
|
+
- Muga Nishizawa
|
14
|
+
- Junji Torii
|
8
15
|
autorequire:
|
9
16
|
bindir: bin
|
10
17
|
cert_chain: []
|
11
18
|
|
12
|
-
date:
|
13
|
-
default_executable:
|
19
|
+
date: 2011-12-21 00:00:00 Z
|
14
20
|
dependencies: []
|
15
21
|
|
16
22
|
description: " ROMA client library\n"
|
@@ -21,25 +27,33 @@ extensions: []
|
|
21
27
|
|
22
28
|
extra_rdoc_files:
|
23
29
|
- README
|
30
|
+
- CHANGELOG
|
24
31
|
files:
|
25
|
-
- Rakefile
|
26
32
|
- README
|
33
|
+
- Rakefile
|
34
|
+
- CHANGELOG
|
35
|
+
- Gemfile.lock
|
27
36
|
- LICENSE
|
28
|
-
-
|
29
|
-
- bin/rcdaemon
|
37
|
+
- Gemfile
|
30
38
|
- bin/showbalance
|
39
|
+
- bin/rcdaemon
|
40
|
+
- bin/sample
|
41
|
+
- lib/roma-client.rb
|
31
42
|
- lib/roma/client/proxy/version.rb
|
32
43
|
- lib/roma/client/proxy/daemon.rb
|
33
|
-
- lib/roma/client/tools/showbalance.rb
|
34
44
|
- lib/roma/client/con_pool.rb
|
35
45
|
- lib/roma/client/version.rb
|
36
|
-
- lib/roma/client/sender.rb
|
37
46
|
- lib/roma/client/rlogger.rb
|
47
|
+
- lib/roma/client/client_pool.rb
|
38
48
|
- lib/roma/client/routing/routing_data.rb
|
49
|
+
- lib/roma/client/sender.rb
|
39
50
|
- lib/roma/client/rclient.rb
|
40
51
|
- lib/roma/client/client_rttable.rb
|
52
|
+
- lib/roma/client/tools/showbalance.rb
|
41
53
|
- lib/roma/client.rb
|
42
|
-
|
54
|
+
- spec/roma/client/client_pool_spec.rb
|
55
|
+
- spec/roma/client/version_spec.rb
|
56
|
+
- spec/spec_helper.rb
|
43
57
|
homepage:
|
44
58
|
licenses: []
|
45
59
|
|
@@ -48,26 +62,32 @@ rdoc_options:
|
|
48
62
|
- --line-numbers
|
49
63
|
- --inline-source
|
50
64
|
- --main
|
51
|
-
- README
|
65
|
+
- README
|
52
66
|
- -c UTF-8
|
53
67
|
require_paths:
|
54
68
|
- lib
|
55
69
|
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
56
71
|
requirements:
|
57
72
|
- - ">="
|
58
73
|
- !ruby/object:Gem::Version
|
74
|
+
hash: 3
|
75
|
+
segments:
|
76
|
+
- 0
|
59
77
|
version: "0"
|
60
|
-
version:
|
61
78
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
62
80
|
requirements:
|
63
81
|
- - ">="
|
64
82
|
- !ruby/object:Gem::Version
|
83
|
+
hash: 3
|
84
|
+
segments:
|
85
|
+
- 0
|
65
86
|
version: "0"
|
66
|
-
version:
|
67
87
|
requirements: []
|
68
88
|
|
69
89
|
rubyforge_project:
|
70
|
-
rubygems_version: 1.
|
90
|
+
rubygems_version: 1.8.12
|
71
91
|
signing_key:
|
72
92
|
specification_version: 3
|
73
93
|
summary: ROMA client library
|