roma 0.8.2 → 0.8.10
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANG +326 -0
- data/CHANGELOG +132 -0
- data/{README.rdoc → FETCH_HEAD} +0 -0
- data/{LICENSE.rdoc → LICENSE} +0 -1
- data/README +17 -0
- data/Rakefile +33 -18
- data/ruby/server/bin/chg_redundancy +10 -0
- data/ruby/server/bin/key_access +7 -0
- data/ruby/server/bin/key_list +7 -0
- data/ruby/server/bin/mkconfig +19 -0
- data/{bin → ruby/server/bin}/mkrecent +0 -1
- data/{bin → ruby/server/bin}/mkroute +0 -1
- data/ruby/server/bin/multi_commander +19 -0
- data/ruby/server/bin/recoverlost +10 -0
- data/ruby/server/bin/recoverlost_alist +10 -0
- data/ruby/server/bin/recoverlost_alist_all +10 -0
- data/ruby/server/bin/recoverlost_alist_keys +10 -0
- data/{bin/recoverlost → ruby/server/bin/roma_watcher} +1 -2
- data/ruby/server/bin/romad +36 -0
- data/{bin → ruby/server/bin}/sample_watcher +0 -1
- data/{bin → ruby/server/bin}/sample_watcher2 +0 -1
- data/{bin/simple_bench → ruby/server/bin/sample_watcher3} +1 -2
- data/ruby/server/bin/simple_bench +26 -0
- data/{bin → ruby/server/bin}/ssroute +0 -1
- data/ruby/server/bin/test-scenario +11 -0
- data/{bin → ruby/server/bin}/tribunus +0 -1
- data/{lib → ruby/server/lib}/roma/async_process.rb +67 -15
- data/{lib → ruby/server/lib}/roma/command/bg_command_receiver.rb +1 -1
- data/ruby/server/lib/roma/command/command_definition.rb +422 -0
- data/ruby/server/lib/roma/command/mh_command_receiver.rb +127 -0
- data/ruby/server/lib/roma/command/receiver.rb +64 -0
- data/{lib → ruby/server/lib}/roma/command/rt_command_receiver.rb +6 -1
- data/ruby/server/lib/roma/command/sys_command_receiver.rb +609 -0
- data/{lib → ruby/server/lib}/roma/command/util_command_receiver.rb +15 -5
- data/{lib → ruby/server/lib}/roma/command/vn_command_receiver.rb +12 -4
- data/{lib → ruby/server/lib}/roma/command_plugin.rb +0 -0
- data/ruby/server/lib/roma/config.rb +84 -0
- data/{lib → ruby/server/lib}/roma/event/con_pool.rb +12 -1
- data/ruby/server/lib/roma/event/handler.rb +256 -0
- data/ruby/server/lib/roma/live_patch-20120302-001.rb +107 -0
- data/ruby/server/lib/roma/logging/rlogger.rb +163 -0
- data/ruby/server/lib/roma/messaging/con_pool.rb +92 -0
- data/{lib → ruby/server/lib}/roma/plugin/plugin_alist.rb +118 -240
- data/ruby/server/lib/roma/plugin/plugin_debug.rb +31 -0
- data/ruby/server/lib/roma/plugin/plugin_map.rb +177 -0
- data/ruby/server/lib/roma/plugin/plugin_mapcount.rb +185 -0
- data/{lib/roma/command/st_command_receiver.rb → ruby/server/lib/roma/plugin/plugin_storage.rb} +170 -146
- data/ruby/server/lib/roma/plugin/plugin_stub.rb +283 -0
- data/{lib → ruby/server/lib}/roma/plugin/plugin_test.rb +0 -0
- data/{lib → ruby/server/lib}/roma/romad.rb +221 -94
- data/{lib → ruby/server/lib}/roma/routing/cb_rttable.rb +4 -6
- data/{lib → ruby/server/lib}/roma/routing/merkle_tree.rb +0 -0
- data/ruby/server/lib/roma/routing/routing_data.rb +307 -0
- data/{lib → ruby/server/lib}/roma/routing/rttable.rb +4 -0
- data/{lib → ruby/server/lib}/roma/stats.rb +19 -3
- data/{lib → ruby/server/lib}/roma/storage/basic_storage.rb +25 -26
- data/{lib → ruby/server/lib}/roma/storage/dbm_storage.rb +1 -23
- data/{lib → ruby/server/lib}/roma/storage/dummy_storage.rb +0 -0
- data/{lib → ruby/server/lib}/roma/storage/rh_storage.rb +0 -0
- data/{lib → ruby/server/lib}/roma/storage/sqlite3_storage.rb +0 -0
- data/{lib → ruby/server/lib}/roma/storage/tc_storage.rb +62 -2
- data/ruby/server/lib/roma/tools/chg_redundancy.rb +36 -0
- data/ruby/server/lib/roma/tools/key_access.rb +105 -0
- data/ruby/server/lib/roma/tools/key_list.rb +94 -0
- data/ruby/server/lib/roma/tools/mkconfig.rb +535 -0
- data/{lib → ruby/server/lib}/roma/tools/mkrecent.rb +0 -0
- data/{lib → ruby/server/lib}/roma/tools/mkroute.rb +0 -0
- data/ruby/server/lib/roma/tools/multi_commander.rb +45 -0
- data/{lib → ruby/server/lib}/roma/tools/recoverlost.rb +0 -0
- data/{lib → ruby/server/lib}/roma/tools/recoverlost_alist.rb +0 -0
- data/ruby/server/lib/roma/tools/recoverlost_alist_all.rb +8 -0
- data/ruby/server/lib/roma/tools/recoverlost_alist_keys.rb +16 -0
- data/ruby/server/lib/roma/tools/recoverlost_lib.rb +349 -0
- data/ruby/server/lib/roma/tools/roma_watcher.rb +150 -0
- data/ruby/server/lib/roma/tools/roma_watcher_config.yml.example +20 -0
- data/{lib → ruby/server/lib}/roma/tools/sample_watcher.rb +3 -1
- data/{lib → ruby/server/lib}/roma/tools/sample_watcher2.rb +3 -1
- data/ruby/server/lib/roma/tools/sample_watcher3.rb +49 -0
- data/{lib → ruby/server/lib}/roma/tools/simple_bench.rb +2 -0
- data/ruby/server/lib/roma/tools/simple_bench2.rb +78 -0
- data/{lib → ruby/server/lib}/roma/tools/ssroute.rb +0 -0
- data/ruby/server/lib/roma/tools/test-scenario.rb +327 -0
- data/{lib → ruby/server/lib}/roma/tools/tribunus.rb +0 -0
- data/ruby/server/lib/roma/version.rb +4 -0
- data/{lib → ruby/server/lib}/roma/write_behind.rb +1 -0
- data/ruby/server/test/config4mhash.rb +68 -0
- data/ruby/server/test/config4storage_error.rb +69 -0
- data/{lib/roma/config.rb → ruby/server/test/config4test.rb} +6 -3
- data/{test → ruby/server/test}/rcirb.rb +0 -1
- data/{test → ruby/server/test}/roma-test-utils.rb +21 -8
- data/{test → ruby/server/test}/run-test.rb +3 -2
- data/ruby/server/test/storage_error_storage.rb +37 -0
- data/ruby/server/test/t_command_definition.rb +326 -0
- data/{test → ruby/server/test}/t_cpdata.rb +9 -3
- data/{test → ruby/server/test}/t_listplugin.rb +48 -12
- data/ruby/server/test/t_mapcountplugin.rb +231 -0
- data/ruby/server/test/t_mapplugin.rb +131 -0
- data/ruby/server/test/t_mhash.rb +222 -0
- data/ruby/server/test/t_rclient.rb +199 -0
- data/{test → ruby/server/test}/t_routing_data.rb +56 -0
- data/{test → ruby/server/test}/t_storage.rb +107 -111
- data/ruby/server/test/t_storage_error.rb +61 -0
- data/ruby/server/test/t_writebehind.rb +374 -0
- metadata +150 -82
- data/bin/recoverlost_alist +0 -8
- data/bin/romad +0 -7
- data/lib/roma/command/mh_command_receiver.rb +0 -117
- data/lib/roma/command/receiver.rb +0 -287
- data/lib/roma/event/handler.rb +0 -159
- data/lib/roma/plugin/plugin_debug.rb +0 -19
- data/lib/roma/tools/recoverlost_lib.rb +0 -217
- data/lib/roma/version.rb +0 -4
- data/test/t_rclient.rb +0 -318
- data/test/t_writebehind.rb +0 -200
File without changes
|
@@ -0,0 +1,68 @@
|
|
1
|
+
require 'roma/storage/rh_storage'
|
2
|
+
require 'roma/storage/tc_storage'
|
3
|
+
|
4
|
+
module Roma
|
5
|
+
|
6
|
+
module Config
|
7
|
+
DEFAULT_PORT = 12000
|
8
|
+
DEFAULT_NAME = 'ROMA'
|
9
|
+
|
10
|
+
# :no_action | :auto_assign | :shutdown
|
11
|
+
DEFAULT_LOST_ACTION = :auto_assign
|
12
|
+
|
13
|
+
# log setting
|
14
|
+
LOG_SHIFT_AGE = 10
|
15
|
+
LOG_SHIFT_SIZE = 1024 * 1024 * 10
|
16
|
+
LOG_PATH = '.'
|
17
|
+
# :debug | :info | :warn | :error
|
18
|
+
LOG_LEVEL = :debug
|
19
|
+
|
20
|
+
# routing setting
|
21
|
+
RTTABLE_PATH = '.'
|
22
|
+
|
23
|
+
# connection setting
|
24
|
+
# like a MaxStartups spec in the sshd_config
|
25
|
+
# 'start:rate:full'
|
26
|
+
CONNECTION_CONTINUOUS_LIMIT = '200:30:300'
|
27
|
+
|
28
|
+
# storage setting
|
29
|
+
STORAGE_CLASS = Storage::TCStorage
|
30
|
+
STORAGE_DIVNUM = 10
|
31
|
+
STORAGE_PATH = '.'
|
32
|
+
STORAGE_DUMP_PATH = '/tmp'
|
33
|
+
STORAGE_OPTION = ''
|
34
|
+
|
35
|
+
# 5 days ago
|
36
|
+
STORAGE_DELMARK_EXPTIME = 60 * 60 * 24 * 5
|
37
|
+
|
38
|
+
# data copy setting
|
39
|
+
DATACOPY_STREAM_COPY_WAIT_PARAM = 0.0001
|
40
|
+
|
41
|
+
# plugin setting
|
42
|
+
PLUGIN_FILES = ['plugin_storage.rb','plugin_alist.rb']
|
43
|
+
|
44
|
+
# write-behind setting
|
45
|
+
WRITEBEHIND_PATH = './wb'
|
46
|
+
WRITEBEHIND_SHIFT_SIZE = 1024 * 1024 * 10
|
47
|
+
|
48
|
+
# redundant setting
|
49
|
+
REDUNDANT_ZREDUNDANT_SIZE = 0
|
50
|
+
|
51
|
+
def self.get_stat
|
52
|
+
ret = {}
|
53
|
+
ret['config.DEFAULT_LOST_ACTION'] = DEFAULT_LOST_ACTION
|
54
|
+
ret['config.LOG_SHIFT_AGE'] = LOG_SHIFT_AGE
|
55
|
+
ret['config.LOG_SHIFT_SIZE'] = LOG_SHIFT_SIZE
|
56
|
+
ret['config.LOG_PATH'] = File.expand_path(LOG_PATH)
|
57
|
+
ret['config.RTTABLE_PATH'] = File.expand_path(RTTABLE_PATH)
|
58
|
+
ret['config.STORAGE_DELMARK_EXPTIME'] = STORAGE_DELMARK_EXPTIME
|
59
|
+
ret['config.DATACOPY_STREAM_COPY_WAIT_PARAM'] = DATACOPY_STREAM_COPY_WAIT_PARAM
|
60
|
+
ret['config.PLUGIN_FILES'] = PLUGIN_FILES.inspect
|
61
|
+
ret['config.WRITEBEHIND_PATH'] = File.expand_path(WRITEBEHIND_PATH)
|
62
|
+
ret['config.WRITEBEHIND_SHIFT_SIZE'] = WRITEBEHIND_SHIFT_SIZE
|
63
|
+
ret
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'roma/storage/rh_storage'
|
2
|
+
require 'roma/storage/storage_error_storage'
|
3
|
+
|
4
|
+
module Roma
|
5
|
+
|
6
|
+
module Config
|
7
|
+
DEFAULT_PORT = 12000
|
8
|
+
DEFAULT_NAME = 'ROMA'
|
9
|
+
|
10
|
+
# :no_action | :auto_assign | :shutdown
|
11
|
+
DEFAULT_LOST_ACTION = :auto_assign
|
12
|
+
|
13
|
+
# log setting
|
14
|
+
LOG_SHIFT_AGE = 10
|
15
|
+
LOG_SHIFT_SIZE = 1024 * 1024 * 10
|
16
|
+
LOG_PATH = '.'
|
17
|
+
# :debug | :info | :warn | :error
|
18
|
+
LOG_LEVEL = :debug
|
19
|
+
|
20
|
+
# routing setting
|
21
|
+
RTTABLE_PATH = '.'
|
22
|
+
|
23
|
+
# connection setting
|
24
|
+
# like a MaxStartups spec in the sshd_config
|
25
|
+
# 'start:rate:full'
|
26
|
+
CONNECTION_CONTINUOUS_LIMIT = '200:30:300'
|
27
|
+
|
28
|
+
# storage setting
|
29
|
+
# STORAGE_CLASS = Roma::Storage::RubyHashStorage
|
30
|
+
STORAGE_CLASS = Storage::StorageErrorStorage
|
31
|
+
STORAGE_DIVNUM = 10
|
32
|
+
STORAGE_PATH = '.'
|
33
|
+
STORAGE_DUMP_PATH = '/tmp'
|
34
|
+
STORAGE_OPTION = ''
|
35
|
+
|
36
|
+
# 5 days ago
|
37
|
+
STORAGE_DELMARK_EXPTIME = 60 * 60 * 24 * 5
|
38
|
+
|
39
|
+
# data copy setting
|
40
|
+
DATACOPY_STREAM_COPY_WAIT_PARAM = 0.0001
|
41
|
+
|
42
|
+
# plugin setting
|
43
|
+
PLUGIN_FILES = ['plugin_storage.rb','plugin_alist.rb','plugin_map.rb']
|
44
|
+
|
45
|
+
# write-behind setting
|
46
|
+
WRITEBEHIND_PATH = './wb'
|
47
|
+
WRITEBEHIND_SHIFT_SIZE = 1024 * 1024 * 10
|
48
|
+
|
49
|
+
# redundant setting
|
50
|
+
REDUNDANT_ZREDUNDANT_SIZE = 0
|
51
|
+
|
52
|
+
def self.get_stat
|
53
|
+
ret = {}
|
54
|
+
ret['config.DEFAULT_LOST_ACTION'] = DEFAULT_LOST_ACTION
|
55
|
+
ret['config.LOG_SHIFT_AGE'] = LOG_SHIFT_AGE
|
56
|
+
ret['config.LOG_SHIFT_SIZE'] = LOG_SHIFT_SIZE
|
57
|
+
ret['config.LOG_PATH'] = File.expand_path(LOG_PATH)
|
58
|
+
ret['config.RTTABLE_PATH'] = File.expand_path(RTTABLE_PATH)
|
59
|
+
ret['config.STORAGE_DELMARK_EXPTIME'] = STORAGE_DELMARK_EXPTIME
|
60
|
+
ret['config.DATACOPY_STREAM_COPY_WAIT_PARAM'] = DATACOPY_STREAM_COPY_WAIT_PARAM
|
61
|
+
ret['config.PLUGIN_FILES'] = PLUGIN_FILES.inspect
|
62
|
+
ret['config.WRITEBEHIND_PATH'] = File.expand_path(WRITEBEHIND_PATH)
|
63
|
+
ret['config.WRITEBEHIND_SHIFT_SIZE'] = WRITEBEHIND_SHIFT_SIZE
|
64
|
+
ret
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'roma/routing/rttable'
|
2
|
-
require 'roma/routing/cb_rttable'
|
3
1
|
require 'roma/storage/rh_storage'
|
4
2
|
|
5
3
|
module Roma
|
@@ -21,6 +19,11 @@ module Roma
|
|
21
19
|
# routing setting
|
22
20
|
RTTABLE_PATH = '.'
|
23
21
|
|
22
|
+
# connection setting
|
23
|
+
# like a MaxStartups spec in the sshd_config
|
24
|
+
# 'start:rate:full'
|
25
|
+
CONNECTION_CONTINUOUS_LIMIT = '200:30:300'
|
26
|
+
|
24
27
|
# storage setting
|
25
28
|
STORAGE_CLASS = Roma::Storage::RubyHashStorage
|
26
29
|
STORAGE_DIVNUM = 10
|
@@ -35,7 +38,7 @@ module Roma
|
|
35
38
|
DATACOPY_STREAM_COPY_WAIT_PARAM = 0.0001
|
36
39
|
|
37
40
|
# plugin setting
|
38
|
-
PLUGIN_FILES = []
|
41
|
+
PLUGIN_FILES = ['plugin_storage.rb','plugin_alist.rb','plugin_map.rb','plugin_mapcount.rb']
|
39
42
|
|
40
43
|
# write-behind setting
|
41
44
|
WRITEBEHIND_PATH = './wb'
|
@@ -1,8 +1,9 @@
|
|
1
1
|
require 'shell'
|
2
|
-
|
3
2
|
require 'pathname'
|
4
3
|
require 'fileutils'
|
5
4
|
require 'rbconfig'
|
5
|
+
require 'roma/config'
|
6
|
+
require 'roma/messaging/con_pool'
|
6
7
|
|
7
8
|
module RomaTestUtils
|
8
9
|
module_function
|
@@ -18,6 +19,10 @@ module RomaTestUtils
|
|
18
19
|
server_base_dir + "bin"
|
19
20
|
end
|
20
21
|
|
22
|
+
def server_test_dir
|
23
|
+
server_base_dir + "test"
|
24
|
+
end
|
25
|
+
|
21
26
|
def mkroute_path
|
22
27
|
(server_bin_dir + "mkroute").to_s
|
23
28
|
end
|
@@ -31,23 +36,30 @@ module RomaTestUtils
|
|
31
36
|
RbConfig::CONFIG["ruby_install_name"])
|
32
37
|
end
|
33
38
|
|
34
|
-
def start_roma
|
39
|
+
def start_roma conf='config4test.rb'
|
35
40
|
sh = Shell.new
|
36
41
|
sh.transact do
|
37
42
|
Dir.glob("localhost_1121?.*").each{|f| rm f }
|
38
43
|
end
|
39
|
-
FileUtils.rm_rf("localhost_11211")
|
40
|
-
FileUtils.rm_rf("localhost_11212")
|
44
|
+
FileUtils.rm_rf("#{Roma::Config::STORAGE_PATH}/localhost_11211")
|
45
|
+
FileUtils.rm_rf("#{Roma::Config::STORAGE_PATH}/localhost_11212")
|
41
46
|
sleep 0.1
|
42
47
|
|
43
48
|
sh.system(ruby_path, mkroute_path,
|
44
49
|
"localhost_11211","localhost_11212",
|
45
50
|
"-d","3",
|
46
51
|
"--enabled_repeathost")
|
47
|
-
sleep 0.
|
48
|
-
|
49
|
-
|
50
|
-
|
52
|
+
sleep 0.2
|
53
|
+
do_command_romad conf
|
54
|
+
sleep 1
|
55
|
+
end
|
56
|
+
|
57
|
+
def do_command_romad conf
|
58
|
+
sh = Shell.new
|
59
|
+
sh.system(ruby_path,romad_path,"localhost","-p","11211","-d","--verbose",
|
60
|
+
"--disabled_cmd_protect","--config","#{server_test_dir}/#{conf}")
|
61
|
+
sh.system(ruby_path,romad_path,"localhost","-p","11212","-d","--verbose",
|
62
|
+
"--disabled_cmd_protect","--config","#{server_test_dir}/#{conf}")
|
51
63
|
end
|
52
64
|
|
53
65
|
def stop_roma
|
@@ -59,6 +71,7 @@ module RomaTestUtils
|
|
59
71
|
conn.gets
|
60
72
|
conn.close
|
61
73
|
end
|
74
|
+
Roma::Client::ConPool.instance.close_all
|
62
75
|
rescue =>e
|
63
76
|
puts "#{e} #{$@}"
|
64
77
|
end
|
@@ -5,10 +5,11 @@ require 'pathname'
|
|
5
5
|
|
6
6
|
base_path = Pathname(__FILE__).dirname.parent.parent.expand_path
|
7
7
|
$LOAD_PATH.unshift("#{base_path}/server/lib")
|
8
|
-
$LOAD_PATH.unshift("#{base_path}/client/lib")
|
9
|
-
$LOAD_PATH.unshift("#{base_path}/commons/lib")
|
10
8
|
$LOAD_PATH.unshift("#{base_path}/server/test")
|
11
9
|
|
10
|
+
client_base_path = Pathname(__FILE__).dirname.parent.parent.parent.parent.expand_path
|
11
|
+
$LOAD_PATH.unshift("#{client_base_path}/roma-ruby-client/lib")
|
12
|
+
|
12
13
|
require 'roma-test-utils'
|
13
14
|
|
14
15
|
Dir["#{base_path}/server/test/t_*.rb"].each do |test_file|
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'roma/storage/basic_storage'
|
2
|
+
|
3
|
+
module Roma
|
4
|
+
module Storage
|
5
|
+
|
6
|
+
class Dummy
|
7
|
+
def put(k,v)
|
8
|
+
raise StorageException, "error:get"
|
9
|
+
end
|
10
|
+
def get(k)
|
11
|
+
raise StorageException, "error:get"
|
12
|
+
end
|
13
|
+
def out(k)
|
14
|
+
true
|
15
|
+
end
|
16
|
+
def rnum
|
17
|
+
0
|
18
|
+
end
|
19
|
+
def each
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
class StorageErrorStorage < BasicStorage
|
24
|
+
|
25
|
+
def opendb
|
26
|
+
create_div_hash
|
27
|
+
@divnum.times{ |i|
|
28
|
+
@hdb[i] = Dummy.new
|
29
|
+
}
|
30
|
+
end
|
31
|
+
|
32
|
+
def close_db(hdb); end
|
33
|
+
|
34
|
+
end # class StorageErrorStorage
|
35
|
+
|
36
|
+
end # module Storage
|
37
|
+
end # module Roma
|
@@ -0,0 +1,326 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
require 'roma/command/command_definition'
|
3
|
+
require 'digest/sha1'
|
4
|
+
require 'test/unit'
|
5
|
+
|
6
|
+
module CommandModuleTest1
|
7
|
+
include Roma::Command::Definition
|
8
|
+
|
9
|
+
def_command_with_relay :balse do |s|
|
10
|
+
command_argument_validation_num s, 3
|
11
|
+
case s[2]
|
12
|
+
when 'ex_runtime'
|
13
|
+
raise s[1]
|
14
|
+
when 'ex_client'
|
15
|
+
raise Roma::Command::Definition::ClientErrorException, s[1]
|
16
|
+
when 'ex_server'
|
17
|
+
raise Roma::Command::Definition::ServerErrorException, s[1]
|
18
|
+
end
|
19
|
+
s
|
20
|
+
end
|
21
|
+
|
22
|
+
def_read_command_with_key :rget, :no_forward do |ctx|
|
23
|
+
ctx
|
24
|
+
end
|
25
|
+
|
26
|
+
def_write_command_with_key :wget, :no_forward do |ctx|
|
27
|
+
ctx
|
28
|
+
end
|
29
|
+
|
30
|
+
def_command_with_key :get, :no_forward do |ctx|
|
31
|
+
case ctx.argv[2]
|
32
|
+
when 'ex_runtime'
|
33
|
+
raise ctx.argv[1]
|
34
|
+
when 'ex_client'
|
35
|
+
raise Roma::Command::Definition::ClientErrorException, ctx.argv[1]
|
36
|
+
when 'ex_server'
|
37
|
+
raise Roma::Command::Definition::ServerErrorException, ctx.argv[1]
|
38
|
+
end
|
39
|
+
ctx
|
40
|
+
end
|
41
|
+
|
42
|
+
def_write_command_with_key_value :wset, 4, :no_forward do |ctx|
|
43
|
+
ctx
|
44
|
+
end
|
45
|
+
|
46
|
+
def_read_command_with_key_value :rset, 4, :no_forward do |ctx|
|
47
|
+
ctx
|
48
|
+
end
|
49
|
+
|
50
|
+
def_command_with_key_value :set, 4, :no_forward do |ctx|
|
51
|
+
case ctx.argv[2]
|
52
|
+
when 'ex_runtime'
|
53
|
+
raise ctx.argv[1]
|
54
|
+
when 'ex_client'
|
55
|
+
raise Roma::Command::Definition::ClientErrorException, ctx.argv[1]
|
56
|
+
when 'ex_server'
|
57
|
+
raise Roma::Command::Definition::ServerErrorException, ctx.argv[1]
|
58
|
+
end
|
59
|
+
ctx
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
module CommandModuleTest2
|
64
|
+
include Roma::Command::Definition
|
65
|
+
|
66
|
+
def_command_with_relay :runtimeexception do |s|
|
67
|
+
raise
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
module CommandModuleTest3
|
72
|
+
include Roma::Command::Definition
|
73
|
+
|
74
|
+
def_command_with_relay :balse do |s|
|
75
|
+
"override"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class DefCmdTest
|
80
|
+
include Roma::Command::Definition
|
81
|
+
include CommandModuleTest1
|
82
|
+
include CommandModuleTest2
|
83
|
+
|
84
|
+
#
|
85
|
+
# define stub for test
|
86
|
+
#
|
87
|
+
|
88
|
+
class RtStub
|
89
|
+
attr_reader :hbits
|
90
|
+
|
91
|
+
def initialize
|
92
|
+
@hbits = 10
|
93
|
+
end
|
94
|
+
|
95
|
+
def get_vnode_id(d) 1 end
|
96
|
+
def search_nodes_for_write(vn) ['roma0','roma1'] end
|
97
|
+
end
|
98
|
+
|
99
|
+
class LogStub
|
100
|
+
def warn str
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
class StorageStub
|
105
|
+
def get_raw(*arg)
|
106
|
+
nil
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
def initialize
|
111
|
+
@stats = Struct.new(:ap_str).new(:ap_str)
|
112
|
+
@rttable = RtStub.new
|
113
|
+
@defhash = 'roma'
|
114
|
+
@log = LogStub.new
|
115
|
+
@storages = Hash.new(StorageStub.new)
|
116
|
+
end
|
117
|
+
|
118
|
+
def send_data str
|
119
|
+
str
|
120
|
+
end
|
121
|
+
|
122
|
+
def broadcast_cmd str
|
123
|
+
{:broadcast_cmd=>str}
|
124
|
+
end
|
125
|
+
|
126
|
+
def read_bytes n
|
127
|
+
ret = 'a'
|
128
|
+
(n - 1).times{ ret += ret[-1].succ }
|
129
|
+
ret
|
130
|
+
end
|
131
|
+
|
132
|
+
def command_argument_validation_num s, num
|
133
|
+
raise ClientErrorException, "number of arguments (#{s.length - 1} for #{num - 1})" if s.length != num
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
class DefineCommandTest < Test::Unit::TestCase
|
138
|
+
|
139
|
+
def setup
|
140
|
+
@obj = DefCmdTest.new
|
141
|
+
end
|
142
|
+
|
143
|
+
def teardown
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_defcmd
|
147
|
+
# normal case
|
148
|
+
res = @obj.ev_balse ['balse','arg1','arg2']
|
149
|
+
res = eval res.chomp
|
150
|
+
assert_equal ['balse','arg1','arg2'], res[:ap_str]
|
151
|
+
assert_equal "rbalse arg1 arg2\r\n", res[:broadcast_cmd]
|
152
|
+
|
153
|
+
res = @obj.ev_rbalse ['balse','arg1','arg2']
|
154
|
+
res = eval res.chomp
|
155
|
+
assert_equal ['balse','arg1','arg2'], res
|
156
|
+
|
157
|
+
# case of argument error
|
158
|
+
res = @obj.ev_balse ['balse','arg1']
|
159
|
+
assert_equal "CLIENT_ERROR number of arguments (1 for 2)\r\n", res
|
160
|
+
res = @obj.ev_balse ['balse','arg1', 'arg2', 'arg3']
|
161
|
+
assert_equal "CLIENT_ERROR number of arguments (3 for 2)\r\n", res
|
162
|
+
|
163
|
+
# case of exception occur
|
164
|
+
assert_raise RuntimeError do
|
165
|
+
res = @obj.ev_balse ['balse','arg1','ex_runtime']
|
166
|
+
end
|
167
|
+
res = @obj.ev_balse ['balse','arg1','ex_client']
|
168
|
+
assert_equal "CLIENT_ERROR arg1\r\n", res
|
169
|
+
res = @obj.ev_balse ['balse','arg2','ex_server']
|
170
|
+
assert_equal "SERVER_ERROR arg2\r\n", res
|
171
|
+
end
|
172
|
+
|
173
|
+
def test_defcmd2
|
174
|
+
# define a command in DefCmdTest class is not define yet
|
175
|
+
DefCmdTest.class_eval do
|
176
|
+
def_command_with_relay :balse2 do |s|
|
177
|
+
"#{s.join(' ')} #{@stats.ap_str}"
|
178
|
+
end
|
179
|
+
end
|
180
|
+
assert true
|
181
|
+
|
182
|
+
# define the duplicated command in DefCmdTest scope
|
183
|
+
assert_raise RuntimeError do
|
184
|
+
DefCmdTest.class_eval do
|
185
|
+
def_command_with_relay :balse do |s|
|
186
|
+
"#{s.join(' ')} #{@stats.ap_str}"
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
# define the duplicated command in CommandModuleTest3 scope
|
192
|
+
# RuntimeError is nothing to occur
|
193
|
+
DefCmdTest.class_eval do
|
194
|
+
include CommandModuleTest3
|
195
|
+
end
|
196
|
+
|
197
|
+
res = @obj.ev_balse ['balse','arg1','arg2']
|
198
|
+
robj = eval res.chomp # String -> Hash
|
199
|
+
assert_equal "override", robj[:ap_str]
|
200
|
+
assert_equal "rbalse arg1 arg2\r\n", robj[:broadcast_cmd]
|
201
|
+
|
202
|
+
res = @obj.ev_rbalse ['balse','arg1','arg2']
|
203
|
+
assert_equal "override\r\n", res
|
204
|
+
|
205
|
+
# test for exception occured in a command
|
206
|
+
assert_raise RuntimeError do
|
207
|
+
@obj.ev_runtimeexception ['balse']
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
def test_defcmd_k
|
212
|
+
# normal case
|
213
|
+
ctx = @obj.ev_get ['get','arg1']
|
214
|
+
assert_equal ['get','arg1'], ctx.argv
|
215
|
+
assert_equal 'arg1', ctx.params.key
|
216
|
+
assert_equal 'roma', ctx.params.hash_name
|
217
|
+
assert_equal Digest::SHA1.hexdigest('arg1').hex % 10, ctx.params.digest
|
218
|
+
assert_equal 1, ctx.params.vn
|
219
|
+
assert_equal ['roma0','roma1'], ctx.params.nodes
|
220
|
+
|
221
|
+
ctx = @obj.ev_get ['get',"arg2\eruby"]
|
222
|
+
assert_equal ['get',"arg2\eruby"], ctx.argv
|
223
|
+
assert_equal 'arg2', ctx.params.key
|
224
|
+
assert_equal 'ruby', ctx.params.hash_name
|
225
|
+
assert_equal 1, ctx.params.vn
|
226
|
+
assert_equal Digest::SHA1.hexdigest('arg2').hex % 10, ctx.params.digest
|
227
|
+
assert_equal ['roma0','roma1'], ctx.params.nodes
|
228
|
+
|
229
|
+
# case of argument error
|
230
|
+
res = @obj.ev_get ['get']
|
231
|
+
assert_equal "CLIENT_ERROR dose not find key\r\n", res
|
232
|
+
res = @obj.ev_get []
|
233
|
+
assert_equal "CLIENT_ERROR dose not find key\r\n", res
|
234
|
+
|
235
|
+
# case of exception occur
|
236
|
+
assert_raise RuntimeError do
|
237
|
+
res = @obj.ev_get ['get','arg1','ex_runtime']
|
238
|
+
end
|
239
|
+
res = @obj.ev_get ['get','arg1','ex_client']
|
240
|
+
assert_equal "CLIENT_ERROR arg1\r\n", res
|
241
|
+
res = @obj.ev_get ['get','arg2','ex_server']
|
242
|
+
assert_equal "SERVER_ERROR arg2\r\n", res
|
243
|
+
end
|
244
|
+
|
245
|
+
def test_defcmd_kv
|
246
|
+
# normal case
|
247
|
+
ctx = @obj.ev_set ['set','arg1', '0', '0', '5']
|
248
|
+
assert_equal ['set','arg1', '0', '0', '5'], ctx.argv
|
249
|
+
assert_equal 'arg1', ctx.params.key
|
250
|
+
assert_equal 'roma', ctx.params.hash_name
|
251
|
+
assert_equal Digest::SHA1.hexdigest('arg1').hex % 10, ctx.params.digest
|
252
|
+
assert_equal 1, ctx.params.vn
|
253
|
+
assert_equal ['roma0','roma1'], ctx.params.nodes
|
254
|
+
assert_equal 'abcde', ctx.params.value
|
255
|
+
|
256
|
+
ctx = @obj.ev_set ['set',"arg2\eruby", '0', '0', '5']
|
257
|
+
assert_equal ['set',"arg2\eruby", '0', '0', '5'], ctx.argv
|
258
|
+
assert_equal 'arg2', ctx.params.key
|
259
|
+
assert_equal 'ruby', ctx.params.hash_name
|
260
|
+
assert_equal Digest::SHA1.hexdigest('arg2').hex % 10, ctx.params.digest
|
261
|
+
assert_equal 1, ctx.params.vn
|
262
|
+
assert_equal ['roma0','roma1'], ctx.params.nodes
|
263
|
+
assert_equal 'abcde', ctx.params.value
|
264
|
+
|
265
|
+
# case of argument error
|
266
|
+
res = @obj.ev_set ['set']
|
267
|
+
assert_equal "CLIENT_ERROR dose not find key\r\n", res
|
268
|
+
res = @obj.ev_set []
|
269
|
+
assert_equal "CLIENT_ERROR dose not find key\r\n", res
|
270
|
+
|
271
|
+
# case of exception occur
|
272
|
+
assert_raise RuntimeError do
|
273
|
+
res = @obj.ev_set ['set','arg1','ex_runtime']
|
274
|
+
end
|
275
|
+
res = @obj.ev_set ['set','arg1','ex_client']
|
276
|
+
assert_equal "CLIENT_ERROR arg1\r\n", res
|
277
|
+
res = @obj.ev_set ['set','arg2','ex_server']
|
278
|
+
assert_equal "SERVER_ERROR arg2\r\n", res
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
class DefCmdTestNoHash < DefCmdTest
|
283
|
+
def initialize
|
284
|
+
super
|
285
|
+
@storages = {}
|
286
|
+
end
|
287
|
+
end
|
288
|
+
|
289
|
+
class DefineCommandNoHashTest < Test::Unit::TestCase
|
290
|
+
def setup
|
291
|
+
@obj = DefCmdTestNoHash.new
|
292
|
+
end
|
293
|
+
|
294
|
+
def teardown
|
295
|
+
end
|
296
|
+
|
297
|
+
def test_rcwk
|
298
|
+
ret = @obj.ev_rget ['get',"arg1\eno_hash_name"]
|
299
|
+
assert_equal "SERVER_ERROR no_hash_name dose not exists.\r\n", ret
|
300
|
+
end
|
301
|
+
|
302
|
+
def test_wcwk
|
303
|
+
ret = @obj.ev_wget ['get',"arg1\eno_hash_name"]
|
304
|
+
assert_equal "SERVER_ERROR no_hash_name dose not exists.\r\n", ret
|
305
|
+
end
|
306
|
+
|
307
|
+
def test_cwk
|
308
|
+
ret = @obj.ev_get ['get',"arg1\eno_hash_name"]
|
309
|
+
assert_equal "SERVER_ERROR no_hash_name dose not exists.\r\n", ret
|
310
|
+
end
|
311
|
+
|
312
|
+
def test_rcwkv
|
313
|
+
ret = @obj.ev_rset ['set',"arg1\eno_hash_name", '0', '0', '5']
|
314
|
+
assert_equal "SERVER_ERROR no_hash_name dose not exists.\r\n", ret
|
315
|
+
end
|
316
|
+
|
317
|
+
def test_wcwkv
|
318
|
+
ret = @obj.ev_wset ['set',"arg1\eno_hash_name", '0', '0', '5']
|
319
|
+
assert_equal "SERVER_ERROR no_hash_name dose not exists.\r\n", ret
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_cwkv
|
323
|
+
ret = @obj.ev_set ['set',"arg1\eno_hash_name", '0', '0', '5']
|
324
|
+
assert_equal "SERVER_ERROR no_hash_name dose not exists.\r\n", ret
|
325
|
+
end
|
326
|
+
end
|