roma 0.8.2 → 0.8.10

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 (114) hide show
  1. data/CHANG +326 -0
  2. data/CHANGELOG +132 -0
  3. data/{README.rdoc → FETCH_HEAD} +0 -0
  4. data/{LICENSE.rdoc → LICENSE} +0 -1
  5. data/README +17 -0
  6. data/Rakefile +33 -18
  7. data/ruby/server/bin/chg_redundancy +10 -0
  8. data/ruby/server/bin/key_access +7 -0
  9. data/ruby/server/bin/key_list +7 -0
  10. data/ruby/server/bin/mkconfig +19 -0
  11. data/{bin → ruby/server/bin}/mkrecent +0 -1
  12. data/{bin → ruby/server/bin}/mkroute +0 -1
  13. data/ruby/server/bin/multi_commander +19 -0
  14. data/ruby/server/bin/recoverlost +10 -0
  15. data/ruby/server/bin/recoverlost_alist +10 -0
  16. data/ruby/server/bin/recoverlost_alist_all +10 -0
  17. data/ruby/server/bin/recoverlost_alist_keys +10 -0
  18. data/{bin/recoverlost → ruby/server/bin/roma_watcher} +1 -2
  19. data/ruby/server/bin/romad +36 -0
  20. data/{bin → ruby/server/bin}/sample_watcher +0 -1
  21. data/{bin → ruby/server/bin}/sample_watcher2 +0 -1
  22. data/{bin/simple_bench → ruby/server/bin/sample_watcher3} +1 -2
  23. data/ruby/server/bin/simple_bench +26 -0
  24. data/{bin → ruby/server/bin}/ssroute +0 -1
  25. data/ruby/server/bin/test-scenario +11 -0
  26. data/{bin → ruby/server/bin}/tribunus +0 -1
  27. data/{lib → ruby/server/lib}/roma/async_process.rb +67 -15
  28. data/{lib → ruby/server/lib}/roma/command/bg_command_receiver.rb +1 -1
  29. data/ruby/server/lib/roma/command/command_definition.rb +422 -0
  30. data/ruby/server/lib/roma/command/mh_command_receiver.rb +127 -0
  31. data/ruby/server/lib/roma/command/receiver.rb +64 -0
  32. data/{lib → ruby/server/lib}/roma/command/rt_command_receiver.rb +6 -1
  33. data/ruby/server/lib/roma/command/sys_command_receiver.rb +609 -0
  34. data/{lib → ruby/server/lib}/roma/command/util_command_receiver.rb +15 -5
  35. data/{lib → ruby/server/lib}/roma/command/vn_command_receiver.rb +12 -4
  36. data/{lib → ruby/server/lib}/roma/command_plugin.rb +0 -0
  37. data/ruby/server/lib/roma/config.rb +84 -0
  38. data/{lib → ruby/server/lib}/roma/event/con_pool.rb +12 -1
  39. data/ruby/server/lib/roma/event/handler.rb +256 -0
  40. data/ruby/server/lib/roma/live_patch-20120302-001.rb +107 -0
  41. data/ruby/server/lib/roma/logging/rlogger.rb +163 -0
  42. data/ruby/server/lib/roma/messaging/con_pool.rb +92 -0
  43. data/{lib → ruby/server/lib}/roma/plugin/plugin_alist.rb +118 -240
  44. data/ruby/server/lib/roma/plugin/plugin_debug.rb +31 -0
  45. data/ruby/server/lib/roma/plugin/plugin_map.rb +177 -0
  46. data/ruby/server/lib/roma/plugin/plugin_mapcount.rb +185 -0
  47. data/{lib/roma/command/st_command_receiver.rb → ruby/server/lib/roma/plugin/plugin_storage.rb} +170 -146
  48. data/ruby/server/lib/roma/plugin/plugin_stub.rb +283 -0
  49. data/{lib → ruby/server/lib}/roma/plugin/plugin_test.rb +0 -0
  50. data/{lib → ruby/server/lib}/roma/romad.rb +221 -94
  51. data/{lib → ruby/server/lib}/roma/routing/cb_rttable.rb +4 -6
  52. data/{lib → ruby/server/lib}/roma/routing/merkle_tree.rb +0 -0
  53. data/ruby/server/lib/roma/routing/routing_data.rb +307 -0
  54. data/{lib → ruby/server/lib}/roma/routing/rttable.rb +4 -0
  55. data/{lib → ruby/server/lib}/roma/stats.rb +19 -3
  56. data/{lib → ruby/server/lib}/roma/storage/basic_storage.rb +25 -26
  57. data/{lib → ruby/server/lib}/roma/storage/dbm_storage.rb +1 -23
  58. data/{lib → ruby/server/lib}/roma/storage/dummy_storage.rb +0 -0
  59. data/{lib → ruby/server/lib}/roma/storage/rh_storage.rb +0 -0
  60. data/{lib → ruby/server/lib}/roma/storage/sqlite3_storage.rb +0 -0
  61. data/{lib → ruby/server/lib}/roma/storage/tc_storage.rb +62 -2
  62. data/ruby/server/lib/roma/tools/chg_redundancy.rb +36 -0
  63. data/ruby/server/lib/roma/tools/key_access.rb +105 -0
  64. data/ruby/server/lib/roma/tools/key_list.rb +94 -0
  65. data/ruby/server/lib/roma/tools/mkconfig.rb +535 -0
  66. data/{lib → ruby/server/lib}/roma/tools/mkrecent.rb +0 -0
  67. data/{lib → ruby/server/lib}/roma/tools/mkroute.rb +0 -0
  68. data/ruby/server/lib/roma/tools/multi_commander.rb +45 -0
  69. data/{lib → ruby/server/lib}/roma/tools/recoverlost.rb +0 -0
  70. data/{lib → ruby/server/lib}/roma/tools/recoverlost_alist.rb +0 -0
  71. data/ruby/server/lib/roma/tools/recoverlost_alist_all.rb +8 -0
  72. data/ruby/server/lib/roma/tools/recoverlost_alist_keys.rb +16 -0
  73. data/ruby/server/lib/roma/tools/recoverlost_lib.rb +349 -0
  74. data/ruby/server/lib/roma/tools/roma_watcher.rb +150 -0
  75. data/ruby/server/lib/roma/tools/roma_watcher_config.yml.example +20 -0
  76. data/{lib → ruby/server/lib}/roma/tools/sample_watcher.rb +3 -1
  77. data/{lib → ruby/server/lib}/roma/tools/sample_watcher2.rb +3 -1
  78. data/ruby/server/lib/roma/tools/sample_watcher3.rb +49 -0
  79. data/{lib → ruby/server/lib}/roma/tools/simple_bench.rb +2 -0
  80. data/ruby/server/lib/roma/tools/simple_bench2.rb +78 -0
  81. data/{lib → ruby/server/lib}/roma/tools/ssroute.rb +0 -0
  82. data/ruby/server/lib/roma/tools/test-scenario.rb +327 -0
  83. data/{lib → ruby/server/lib}/roma/tools/tribunus.rb +0 -0
  84. data/ruby/server/lib/roma/version.rb +4 -0
  85. data/{lib → ruby/server/lib}/roma/write_behind.rb +1 -0
  86. data/ruby/server/test/config4mhash.rb +68 -0
  87. data/ruby/server/test/config4storage_error.rb +69 -0
  88. data/{lib/roma/config.rb → ruby/server/test/config4test.rb} +6 -3
  89. data/{test → ruby/server/test}/rcirb.rb +0 -1
  90. data/{test → ruby/server/test}/roma-test-utils.rb +21 -8
  91. data/{test → ruby/server/test}/run-test.rb +3 -2
  92. data/ruby/server/test/storage_error_storage.rb +37 -0
  93. data/ruby/server/test/t_command_definition.rb +326 -0
  94. data/{test → ruby/server/test}/t_cpdata.rb +9 -3
  95. data/{test → ruby/server/test}/t_listplugin.rb +48 -12
  96. data/ruby/server/test/t_mapcountplugin.rb +231 -0
  97. data/ruby/server/test/t_mapplugin.rb +131 -0
  98. data/ruby/server/test/t_mhash.rb +222 -0
  99. data/ruby/server/test/t_rclient.rb +199 -0
  100. data/{test → ruby/server/test}/t_routing_data.rb +56 -0
  101. data/{test → ruby/server/test}/t_storage.rb +107 -111
  102. data/ruby/server/test/t_storage_error.rb +61 -0
  103. data/ruby/server/test/t_writebehind.rb +374 -0
  104. metadata +150 -82
  105. data/bin/recoverlost_alist +0 -8
  106. data/bin/romad +0 -7
  107. data/lib/roma/command/mh_command_receiver.rb +0 -117
  108. data/lib/roma/command/receiver.rb +0 -287
  109. data/lib/roma/event/handler.rb +0 -159
  110. data/lib/roma/plugin/plugin_debug.rb +0 -19
  111. data/lib/roma/tools/recoverlost_lib.rb +0 -217
  112. data/lib/roma/version.rb +0 -4
  113. data/test/t_rclient.rb +0 -318
  114. data/test/t_writebehind.rb +0 -200
@@ -0,0 +1,20 @@
1
+ roma:
2
+ - "localhost:11211"
3
+ - "localhost:11212"
4
+ - "localhost:11213"
5
+
6
+ log:
7
+ path: ./log.txt
8
+ rotate: "daily" # "daily", "weekly", or "monthly"
9
+
10
+ timeout: 3
11
+
12
+ retry:
13
+ count: 3
14
+ period: 0.3
15
+
16
+ mail:
17
+ from: roma@roma.jp
18
+ to: roma@roma.jp
19
+ mailer: /usr/bin/sendmail
20
+ subject_prefix: "ROMA "
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  # -*- coding: utf-8 -*-
3
- require 'roma/commons'
3
+ require 'roma/logging/rlogger'
4
+ require 'roma/messaging/con_pool'
5
+ require 'roma/routing/routing_data'
4
6
  require 'roma/client/sender'
5
7
 
6
8
  module Roma
@@ -1,6 +1,8 @@
1
1
  #!/usr/bin/env ruby
2
2
  # -*- coding: utf-8 -*-
3
- require 'roma/commons'
3
+ require 'roma/logging/rlogger'
4
+ require 'roma/messaging/con_pool'
5
+ require 'roma/routing/routing_data'
4
6
  require 'roma/client/sender'
5
7
 
6
8
  module Roma
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ require 'roma/logging/rlogger'
4
+ require 'roma/messaging/con_pool'
5
+ require 'roma/routing/routing_data'
6
+ require 'roma/client/sender'
7
+
8
+ module Roma
9
+ class Watcher
10
+ def initialize
11
+ @sender = Roma::Client::Sender.new
12
+ end
13
+ def get_node_list(nid)
14
+ @sender.send_command(nid, "nodelist").split(' ')
15
+ end
16
+ end # class Watcher
17
+ end # module Roma
18
+
19
+ nodes = [
20
+ 'localhost:11211',
21
+ 'localhost:11212',
22
+ 'localhost:11213'
23
+ ]
24
+
25
+ puts "#{Time.now} ROMA watcher has started."
26
+ puts ""
27
+
28
+ all_ring = []
29
+
30
+ nodes.each{ |nid|
31
+ puts "=> check a process #{nid} with a nodelist command"
32
+ begin
33
+ w = Roma::Watcher.new
34
+ ring = w.get_node_list(nid)
35
+ all_ring << ring unless all_ring.include? ring
36
+ rescue => e
37
+ STDERR.puts " command error in #{nid}: #{e.inspect}"
38
+ end
39
+ }
40
+
41
+ puts ""
42
+
43
+ all_ring.each { |ring|
44
+ puts "#{ring}"
45
+ puts "size: #{ring.size}"
46
+ }
47
+
48
+ puts ""
49
+ puts "#{Time.now} ROMA watcher has done."
@@ -55,3 +55,5 @@ tn.times{
55
55
  }
56
56
  }
57
57
 
58
+ t[0].join
59
+
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env ruby
2
+ # -*- coding: utf-8 -*-
3
+ require 'date'
4
+ require 'roma/client/rclient'
5
+
6
+ module Roma
7
+ module Client
8
+ class Microbench
9
+ attr :cnt
10
+ attr :tmax
11
+ attr :tmin
12
+ attr :runnable
13
+ attr :sleep_time_watcher
14
+ attr :watcher
15
+
16
+ def initialize
17
+ @cnt = 0
18
+ @tmax = 0
19
+ @tmin = 100
20
+ @runnable = true
21
+ @sleep_time_watcher = 10
22
+ init_watcher
23
+ end
24
+
25
+ def init_watcher
26
+ @watcher = Thread.new {
27
+ while @runnable
28
+ sleep @sleep_time_watcher
29
+ printf("qps=%d max=%f min=%f ave=%f\n",@@cnt/sleep_time,@@tmax,@@tmin,sleep_time/@@cnt.to_f)
30
+ @cnt = 0
31
+ @tmax = 0
32
+ @tmin = 100
33
+ end
34
+ }
35
+ end
36
+ private :init_watcher
37
+
38
+ def send_random_requests_loop addr, port
39
+ end
40
+
41
+ def send_read_requests addr, port, count
42
+ rc = Roma::Client::RomaClient.new("#{addr}:#{port.to_s}")
43
+ count.times { |c|
44
+ i = rand count
45
+ ts = DateTime.now
46
+ res = rc.get(i.to_s)
47
+ puts "get k=#{i} #{res}" if res == :error
48
+ }
49
+ end
50
+ end
51
+ end
52
+ end
53
+
54
+
55
+ def random_rquest_sender(ini_nodes)
56
+ rc=Roma::Client::RomaClient.new(ini_nodes)
57
+
58
+ n=10000
59
+ loop{
60
+ i=rand(n)
61
+ ts = DateTime.now
62
+ case rand(3)
63
+ when 0
64
+ res=rc.set(i.to_s,'hoge'+i.to_s)
65
+ puts "set k=#{i} #{res}" if res==nil || res.chomp != 'STORED'
66
+ when 1
67
+ res=rc.get(i.to_s)
68
+ puts "get k=#{i} #{res}" if res == :error
69
+ when 2
70
+ res=rc.delete(i.to_s)
71
+ puts "del k=#{i} #{res}" if res != 'DELETED' && res != 'NOT_FOUND'
72
+ end
73
+ t=(DateTime.now - ts).to_f * 86400.0
74
+ @@tmax=t if t > @@tmax
75
+ @@tmin=t if t < @@tmin
76
+ @@cnt+=1
77
+ }
78
+ end
File without changes
@@ -0,0 +1,327 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'date'
4
+ require 'logger'
5
+ require 'roma/client/rclient'
6
+ require 'roma/tools/multi_commander'
7
+ require 'optparse'
8
+
9
+ module Roma
10
+ module Test
11
+ class RomaProc
12
+ attr_accessor :addr
13
+ attr_accessor :port
14
+ attr_accessor :pid
15
+
16
+ def initialize a, p
17
+ @addr = a
18
+ @port = p
19
+ end
20
+
21
+ def self.to_str procs
22
+ msg = ""
23
+ procs.each { |proc|
24
+ msg = msg + proc.addr + "_" + proc.port.to_s + " "
25
+ }
26
+ msg
27
+ end
28
+ end
29
+
30
+ class Stress
31
+ attr :cnt
32
+ attr :tmax
33
+ attr :tmin
34
+ attr :num_of_threads
35
+ attr_accessor :runnable
36
+
37
+ def initialize th_num
38
+ @cnt = 0
39
+ @tmax = 0
40
+ @tmin = 100
41
+ @num_of_threads = th_num
42
+ @runnable = true
43
+ end
44
+
45
+ def start addr, port
46
+ Thread.new {
47
+ sleep_time=10
48
+ while @runnable
49
+ sleep sleep_time
50
+ printf("qps=%d max=%f min=%f ave=%f\n", @cnt / sleep_time, @tmax, @tmin, sleep_time / @cnt.to_f)
51
+ @@cnt=0
52
+ @@tmax=0
53
+ @@tmin=100
54
+ end
55
+ }
56
+
57
+ working_threads = []
58
+ @num_of_threads.times {
59
+ working_threads << Thread.new {
60
+ send_random_reqs addr, port
61
+ }
62
+ }
63
+ end
64
+
65
+ def send_random_reqs addr, port
66
+ rc = Roma::Client::RomaClient.new([ "#{addr}_#{port.to_s}" ])
67
+ n=1000
68
+ while @runnable
69
+ begin
70
+ i = rand(n)
71
+ ts = DateTime.now
72
+ case rand(3)
73
+ when 0
74
+ res = rc.set(i.to_s, 'hoge' + i.to_s)
75
+ puts "set k=#{i} #{res}" if res==nil || res.chomp != 'STORED'
76
+ when 1
77
+ res = rc.get(i.to_s)
78
+ puts "get k=#{i} #{res}" if res == :error
79
+ when 2
80
+ res = rc.delete(i.to_s)
81
+ puts "del k=#{i} #{res}" if res != 'DELETED' && res != 'NOT_FOUND'
82
+ end
83
+ t = (DateTime.now - ts).to_f * 86400.0
84
+ @tmax=t if t > @tmax
85
+ @tmin=t if t < @tmin
86
+ @cnt+=1
87
+ rescue => e
88
+ p e
89
+ end
90
+ end
91
+ rescue => e
92
+ p e
93
+ end
94
+ private :send_random_reqs
95
+ end
96
+
97
+ class Scenario
98
+ attr :working_path
99
+ attr :roma_procs
100
+ attr :stress
101
+ attr :log
102
+
103
+ def initialize(path, procs)
104
+ @working_path = path
105
+ @roma_procs = procs
106
+ @stress = Stress.new 1
107
+ @log = Logger.new "./test-scenario.log", "daily"
108
+ end
109
+
110
+ def init_roma
111
+ @log.debug "begin init_roma"
112
+ exec "rm -f localhost_1121?.*"
113
+ exec "bin/mkroute -d 7 #{RomaProc.to_str(@roma_procs)} --enabled_repeathost"
114
+ @log.debug "end init_roma"
115
+ end
116
+
117
+ def start_roma
118
+ @log.debug "begin start_roma"
119
+ @roma_procs.length.times { |i|
120
+ start_roma_proc i
121
+ }
122
+ @log.debug "end start_roma"
123
+ end
124
+
125
+ def start_roma_proc i
126
+ @log.debug "begin start_roma_proc"
127
+ str = "bin/romad #{@roma_procs[i].addr} -p #{@roma_procs[i].port.to_s} -d --enabled_repeathost"
128
+ exec str
129
+ @roma_procs[i].pid = get_pid(str)
130
+ @log.debug "end start_roma_proc"
131
+ end
132
+ private :start_roma_proc
133
+
134
+ def exec cmd
135
+ `cd #{@working_path}; #{cmd}`
136
+ end
137
+ private :exec
138
+
139
+ def get_pid reg_str
140
+ open("| ps -ef | grep romad") { |f|
141
+ while l = f.gets
142
+ return $1.to_i if l =~ /(\d+).+ruby\s#{reg_str}/
143
+ end
144
+ }
145
+ nil
146
+ end
147
+ private :get_pid
148
+
149
+ def stop_roma
150
+ @log.debug "begin start_roma"
151
+ @roma_procs.length.times { |i|
152
+ stop_roma_proc i
153
+ }
154
+ @log.debug "end start_roma"
155
+ end
156
+
157
+ def stop_roma_proc i
158
+ @log.debug "begin start_roma_proc"
159
+ exec "kill -9 #{@roma_procs[i].pid}"
160
+ @log.debug "end start_roma_proc"
161
+ end
162
+ private :stop_roma_proc
163
+
164
+ def start_roma_client addr, port
165
+ @stress.start addr, port
166
+ end
167
+
168
+ def stop_roma_client
169
+ @stress.runnable = false
170
+ end
171
+
172
+ def send_recover addr, port
173
+ commander = Roma::MultiCommander.new "#{addr}_#{port}"
174
+ res = commander.send_cmd "recover", "#{addr}_#{port}"
175
+ puts res
176
+ end
177
+
178
+ def send_stats addr, port
179
+ commander = Roma::MultiCommander.new "#{addr}_#{port}"
180
+ res = commander.send_cmd "stats run", "#{addr}_#{port}"
181
+ puts res
182
+ end
183
+
184
+ def send_stats_routing_nodes_length addr, port
185
+ commander = Roma::MultiCommander.new "#{addr}_#{port}"
186
+ res = commander.send_cmd "stats routing.nodes.length", "#{addr}_#{port}"
187
+ splited = res.split(' ')
188
+ splited.each_with_index { |w, i|
189
+ if w == "routing.nodes.length"
190
+ return splited[i + 1].to_i
191
+ end
192
+ }
193
+ raise "not found a specified property: routing.nodes.length"
194
+ end
195
+
196
+ def send_stats_run_acquire_vnodes addr, port
197
+ commander = Roma::MultiCommander.new "#{addr}_#{port}"
198
+ res = commander.send_cmd "stats stats.run_acquire_vnodes", "#{addr}_#{port}"
199
+ splited = res.split(' ')
200
+ splited.each_with_index { |w, i|
201
+ if w == "stats.run_acquire_vnodes"
202
+ return splited[i + 1] == "true"
203
+ end
204
+ }
205
+ raise "not found a specified property: stats.run_acquire_vnodes"
206
+ end
207
+
208
+ def test_kill_join_recover
209
+ @log.info "begin method test_kill_join_recover"
210
+
211
+ # initialize a ROMA
212
+ init_roma
213
+
214
+ # start a ROMA
215
+ start_roma
216
+
217
+ sleep 10
218
+
219
+ # stress
220
+ start_roma_client @roma_procs[0].addr, @roma_procs[0].port
221
+
222
+ sleep 2
223
+
224
+ nlen = send_stats_routing_nodes_length @roma_procs[0].addr, @roma_procs[0].port
225
+ if nlen != 3
226
+ raise "fatal error nlen: #{nlen}"
227
+ end
228
+
229
+ sleep 2
230
+
231
+ # stop the specified roma process
232
+ stop_roma_proc 2
233
+
234
+ sleep 10
235
+
236
+ nlen = send_stats_routing_nodes_length @roma_procs[0].addr, @roma_procs[0].port
237
+ if nlen != 2
238
+ raise "fatal error nlen: #{nlen}"
239
+ end
240
+
241
+ #ret = send_stats_run_acquire_vnodes @roma_procs[0].addr, @roma_procs[0].port
242
+ #puts "$$ #{ret}"
243
+ #send_stats @roma_procs[0].addr, @roma_procs[0].port
244
+ #puts "$$"
245
+ #ret = send_stats_run_acquire_vnodes @roma_procs[0].addr, @roma_procs[0].port
246
+ #puts "$$ #{ret}"
247
+ #send_stats @roma_procs[0].addr, @roma_procs[0].port
248
+ #send_recover @roma_procs[0].addr, @roma_procs[0].port
249
+
250
+
251
+ sleep 2
252
+
253
+ stop_roma_client
254
+
255
+ #stop_roma
256
+ stop_roma_proc 0
257
+ stop_roma_proc 1
258
+
259
+ @log.info "end method test_kill_join_recover"
260
+ end
261
+
262
+ def test_suite
263
+ test_kill_join_recover
264
+ end
265
+ end
266
+
267
+ class Config
268
+ attr_reader :number_of_nodes
269
+ attr_reader :port
270
+ attr_reader :hostname
271
+ attr_reader :working_path
272
+
273
+ def initialize(argv)
274
+ opts = OptionParser.new
275
+ opts.banner="usage:#{File.basename($0)} [options]"
276
+
277
+ opts.on_tail("-h", "--help", "show this message") {
278
+ puts opts; exit
279
+ }
280
+ @number_of_nodes = 3
281
+ opts.on("-n N", "number of nodes[default: 3]", Integer) { |v|
282
+ @number_of_nodes = v
283
+ }
284
+
285
+ @working_path = '.'
286
+ opts.on("-p PATH", "working path[default: .]", String) { |v|
287
+ @working_path = v
288
+ }
289
+
290
+ @hostname = 'localhost'
291
+ opts.on("--hname HOSTNAME", "hostname[default: localhost]", String) { |v|
292
+ @hostname = v
293
+ }
294
+
295
+ @port = 11211
296
+ opts.on("--port PORT_NUMBER", "port number[default: 11211]", Integer) { |v|
297
+ @port = v
298
+ }
299
+
300
+ opts.parse!(argv)
301
+ rescue OptionParser::ParseError => e
302
+ $stderr.puts e.message
303
+ $stderr.puts opts.help
304
+ exit 1
305
+ end
306
+ end
307
+
308
+ end
309
+ end
310
+
311
+ cnf = Roma::Test::Config.new(ARGV)
312
+
313
+ # check for a working path
314
+ unless File::exist?("#{cnf.working_path}/bin/romad")
315
+ # in invalid path
316
+ $stderr.puts "#{cnf.working_path}/bin/romad dose't found"
317
+ $stderr.puts "You should set to a working path option(-p)."
318
+ exit 1
319
+ end
320
+
321
+ procs = []
322
+ cnf.number_of_nodes.times{ |i|
323
+ procs << Roma::Test::RomaProc.new(cnf.hostname, cnf.port + i)
324
+ }
325
+
326
+ s = Roma::Test::Scenario.new(cnf.working_path, procs)
327
+ s.test_suite