roma 0.8.12 → 0.8.13p1

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 (44) hide show
  1. data/CHANGELOG +34 -1
  2. data/Gemfile +17 -0
  3. data/Rakefile +2 -3
  4. data/ruby/server/lib/roma/async_process.rb +158 -20
  5. data/ruby/server/lib/roma/command/bg_command_receiver.rb +3 -4
  6. data/ruby/server/lib/roma/command/rt_command_receiver.rb +133 -5
  7. data/ruby/server/lib/roma/command/sys_command_receiver.rb +353 -0
  8. data/ruby/server/lib/roma/command/vn_command_receiver.rb +9 -3
  9. data/ruby/server/lib/roma/config.rb +6 -0
  10. data/ruby/server/lib/roma/dns_cache.rb +40 -0
  11. data/ruby/server/lib/roma/event/con_pool.rb +3 -1
  12. data/ruby/server/lib/roma/event/handler.rb +18 -3
  13. data/ruby/server/lib/roma/messaging/con_pool.rb +3 -1
  14. data/ruby/server/lib/roma/romad.rb +19 -3
  15. data/ruby/server/lib/roma/routing/cb_rttable.rb +22 -1
  16. data/ruby/server/lib/roma/routing/random_balancer.rb +76 -0
  17. data/ruby/server/lib/roma/routing/routing_data.rb +16 -2
  18. data/ruby/server/lib/roma/routing/rttable.rb +55 -8
  19. data/ruby/server/lib/roma/stats.rb +32 -0
  20. data/ruby/server/lib/roma/storage/sqlite3_storage.rb +9 -3
  21. data/ruby/server/lib/roma/tools/mkconfig.rb +135 -73
  22. data/ruby/server/lib/roma/tools/mkrecent.rb +3 -4
  23. data/ruby/server/lib/roma/tools/mkroute.rb +6 -7
  24. data/ruby/server/lib/roma/tools/multi_commander.rb +3 -4
  25. data/ruby/server/lib/roma/tools/recoverlost.rb +0 -1
  26. data/ruby/server/lib/roma/tools/recoverlost_alist.rb +0 -1
  27. data/ruby/server/lib/roma/tools/recoverlost_lib.rb +10 -11
  28. data/ruby/server/lib/roma/tools/roma_watcher.rb +0 -1
  29. data/ruby/server/lib/roma/tools/sample_watcher.rb +3 -4
  30. data/ruby/server/lib/roma/tools/sample_watcher2.rb +3 -4
  31. data/ruby/server/lib/roma/tools/sample_watcher3.rb +0 -1
  32. data/ruby/server/lib/roma/tools/simple_bench.rb +3 -3
  33. data/ruby/server/lib/roma/tools/simple_bench2.rb +1 -2
  34. data/ruby/server/lib/roma/tools/ssroute.rb +0 -1
  35. data/ruby/server/lib/roma/tools/tribunus.rb +5 -6
  36. data/ruby/server/lib/roma/version.rb +1 -1
  37. data/ruby/server/lib/roma/write_behind.rb +4 -1
  38. data/ruby/server/test/rcirb.rb +0 -1
  39. data/ruby/server/test/t_cpdata.rb +8 -9
  40. data/ruby/server/test/t_rclient.rb +1 -2
  41. data/ruby/server/test/t_routing_data.rb +13 -14
  42. data/ruby/server/test/t_storage.rb +1 -1
  43. data/ruby/server/test/t_writebehind.rb +29 -30
  44. metadata +25 -24
data/CHANGELOG CHANGED
@@ -1,3 +1,36 @@
1
+ *0.8.13-p1 (Jan 15 2014)*
2
+
3
+ * add timeout parameter for a vnode copy [junji torii] 0522750
4
+ * remove some debug log [hiroaki-iwase] 94d96dc
5
+ * Add Gemfile. [Hiroki Matsue] 9029bf8
6
+ * Ignore test related files. [Hiroki Matsue] 556a931
7
+ * fix:add rescue in timer_event_1sec [junji torii] 11cc4ea
8
+
9
+ *0.8.13 (Sep 12 2013)*
10
+
11
+ * change target ruby version about encoding problem (upper 1.9.2 => upper 1.9.1) [hiroaki-iwase] e56d2f4
12
+ * modify end message of join. [hiroaki-iwase] a649dfb
13
+ * modify typo [hiroaki-iwase] c47802b
14
+ * fix:for a problem of encording on 1.9.2 [junji torii] 3501622
15
+ * modify ongoing setting changing cmd. [hiroaki-iwase] 190db49
16
+ * Add new async process for calculate latency average & add some commands for change setting. [hiroaki-iwase] 49dc9cb
17
+ * add new function "calculate latency average" [hiroaki-iwase] 40b6266
18
+ * Add command of changing CONNECTION_POOL_EXPTIME & DEFAULT_LOST_ACTION & CONNECTION_DESCRIPTOR_TABLE_SIZE & WRITEBEHIND_SHIFT_SIZE [hiroaki-iwase] de757af
19
+ * add vnode balancing logic [junji torii] bfa16cd
20
+ * add *_rttable_sub_nid commands [junji torii] 8bd4a31
21
+ * add auto_recover function [hiroaki-iwase] 473df72
22
+ * modify message when execute "balse" [hiroaki-iwase] a3d61b1
23
+ * add node-id substitution feature in routingdump command. [junji torii] a3693e8
24
+ * fixed recoverlost_lib's value error [hiroaki-iwase] deb9430
25
+ * add log output(info level) when new wb file was created. [hiroaki-iwase] dcec49a
26
+ * add new function "calculate latency average" [hiroaki-iwase] 4158ccd
27
+ * Add DNS caching function. [Hiroki Matsue] abf4464
28
+ * Modify some default values. Change plugin selecting(plugin_storage.rb is set without question). [hiroaki-iwase] d2542f0
29
+ * add command of changing CONNECTION_EMPOOL_EXPTIME. [hiroaki-iwase] 1d3df93
30
+ * improve mkconfig.rb [hiroaki-iwase] 74be88d
31
+ * remove utf-8 manifesto # -*- coding: utf-8 -*-" # encoding: utf-8 [hiroaki-iwase] d54e30c
32
+ * translate comment JP to ENG [hiroaki-iwase] 1b091fd
33
+
1
34
  *0.8.12 (Feb 12 2013)*
2
35
 
3
36
  * refactor: for protocol [Hiroki Matsue] a6f9152
@@ -171,4 +204,4 @@
171
204
  * fixed bug in t_rclient.rb. [junji torii] 68880b5
172
205
  * support running test with Ruby not named as 'ruby'. [Kouhei Sutou] 6fd1ec2
173
206
 
174
- *0.8.0 (Oct 23 2009)*
207
+ *0.8.0 (Oct 23 2009)*
data/Gemfile ADDED
@@ -0,0 +1,17 @@
1
+ source "https://rubygems.org"
2
+
3
+ gem 'eventmachine'
4
+
5
+ # Back-end storages
6
+ group :tokyocabinet do
7
+ gem 'tokyocabinet', :git => 'https://github.com/roma/tokyocabinet-ruby.git'
8
+ end
9
+
10
+ group :gdbm do
11
+ gem 'ffi'
12
+ gem 'gdbm'
13
+ end
14
+
15
+ group :sqlite3 do
16
+ gem 'sqlite3'
17
+ end
data/Rakefile CHANGED
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  require 'rubygems'
3
2
  require 'rake'
4
3
 
@@ -40,8 +39,8 @@ EXEC_TABLE = Dir.entries(base + 'bin').reject{ |d| d =~ /^\.+$/ || d =~ /^sample
40
39
  require File.expand_path(File.join('ruby', 'server', 'lib', 'roma', 'version'), File.dirname(__FILE__))
41
40
  VER_NUM = Roma::VERSION
42
41
 
43
- if VER_NUM =~ /([0-9.]+)$/
44
- CURRENT_VERSION = $1
42
+ if VER_NUM =~ /([0-9.p-]+)$/
43
+ CURRENT_VERSION = $1.delete("-")
45
44
  else
46
45
  CURRENT_VERSION = "0.0.0"
47
46
  end
@@ -1,9 +1,9 @@
1
- # -*- coding: utf-8 -*-
2
1
  require 'thread'
3
2
  require 'digest/sha1'
3
+ require "timeout"
4
4
 
5
5
  module Roma
6
-
6
+
7
7
  class AsyncMessage
8
8
  attr_accessor :event
9
9
  attr_accessor :args
@@ -34,16 +34,26 @@ module Roma
34
34
  module AsyncProcess
35
35
 
36
36
  @@async_queue = Queue.new
37
+ @@async_queue_latency = Queue.new
37
38
 
38
39
  def self.queue
39
40
  @@async_queue
40
41
  end
41
42
 
43
+ def self.queue_latency
44
+ @@async_queue_latency
45
+ end
46
+
42
47
  def start_async_process
43
48
  @async_thread = Thread.new{
44
49
  async_process_loop
45
50
  }
46
51
  @async_thread[:name] = __method__
52
+
53
+ @async_thread_latency = Thread.new{
54
+ async_process_loop_for_latency
55
+ }
56
+ @async_thread_latency[:name] = __method__
47
57
  rescue =>e
48
58
  @log.error("#{e}\n#{$@}")
49
59
  end
@@ -57,6 +67,13 @@ module Roma
57
67
  sleep 0.1
58
68
  end
59
69
  @async_thread.exit
70
+
71
+ count = 0
72
+ while @@async_queue_latency.empty? == false && count < 100
73
+ count += 1
74
+ sleep 0.1
75
+ end
76
+ @async_thread_latency.exit
60
77
  end
61
78
 
62
79
  def async_process_loop
@@ -84,6 +101,31 @@ module Roma
84
101
  retry
85
102
  end
86
103
 
104
+ def async_process_loop_for_latency
105
+ loop {
106
+ while msg = @@async_queue_latency.pop
107
+ if send("asyncev_#{msg.event}",msg.args)
108
+ msg.callback.call(msg,true) if msg.callback
109
+ else
110
+ if msg.retry?
111
+ t = Thread.new{
112
+ msg.wait
113
+ msg.incr_count
114
+ @@async_queue_latency.push(msg)
115
+ }
116
+ t[:name] = __method__
117
+ else
118
+ @log.error("async process retry out:#{msg.inspect}")
119
+ msg.callback.call(msg,false) if msg.callback
120
+ end
121
+ end
122
+ end
123
+ }
124
+ rescue =>e
125
+ @log.error("#{e}\n#{$@}")
126
+ retry
127
+ end
128
+
87
129
  def asyncev_broadcast_cmd(args)
88
130
  @log.debug("#{__method__} #{args.inspect}")
89
131
  cmd, nids, tout = args
@@ -120,7 +162,7 @@ module Roma
120
162
  end
121
163
  end
122
164
  t[:name] = __method__
123
- true
165
+ true
124
166
  end
125
167
 
126
168
  def asyncev_start_balance_process(args)
@@ -148,7 +190,7 @@ module Roma
148
190
  end
149
191
  end
150
192
  t[:name] = __method__
151
- true
193
+ true
152
194
  end
153
195
 
154
196
  def asyncev_redundant(args)
@@ -193,7 +235,7 @@ module Roma
193
235
  @log.warn("async redundant failed:#{k}\e#{hname} #{clk} -> #{nid}")
194
236
  return false # retry
195
237
  end
196
- true
238
+ true
197
239
  end
198
240
 
199
241
  def asyncev_reqpushv(args)
@@ -243,6 +285,57 @@ module Roma
243
285
  t[:name] = __method__
244
286
  end
245
287
 
288
+ def asyncev_start_auto_recover_process(args)
289
+ @log.debug("#{__method__} #{args.inspect}")
290
+ ###run_join don't have possibility to be true in this case.
291
+ #if @stats.run_join
292
+ # @log.error("#{__method__}:join process running")
293
+ # return true
294
+ #end
295
+ if @stats.run_recover
296
+ @log.error("#{__method__}:recover process running.")
297
+ return false
298
+ end
299
+ if @stats.run_balance
300
+ @log.error("#{__method__}:balance process running")
301
+ return true
302
+ end
303
+
304
+ @rttable.auto_recover_status = "preparing"
305
+ t = Thread::new do
306
+ begin
307
+ timeout(@rttable.auto_recover_time){
308
+ loop{
309
+ sleep 1
310
+ break if @rttable.auto_recover_status != "preparing"
311
+ #break if @stats.run_join #run_join don't have possibility to be true in this case.
312
+ break if @stats.run_recover
313
+ break if @stats.run_balance
314
+ }
315
+ }
316
+ @log.debug("inactivated AUTO_RECOVER")
317
+ rescue
318
+ case @rttable.lost_action
319
+ when :auto_assign, :shutdown
320
+ @stats.run_recover = true
321
+ @rttable.auto_recover_status = "executing"
322
+ begin
323
+ @log.debug("auto recover start")
324
+ acquired_recover_process
325
+ rescue => e
326
+ @log.error("#{__method__}:#{e.inspect} #{$@}")
327
+ ensure
328
+ @stats.run_recover = false
329
+ @rttable.auto_recover_status = "waiting"
330
+ end
331
+ when :no_action
332
+ @log.debug("auto recover NOT start. Because lost action is [no_action]")
333
+ end
334
+ end
335
+ end
336
+ t[:name] = __method__
337
+ end
338
+
246
339
  def asyncev_start_release_process(args)
247
340
  @log.debug("#{__method__} #{args}")
248
341
  if @stats.run_iterate_storage
@@ -269,7 +362,7 @@ module Roma
269
362
  @log.info("#{__method__}:start")
270
363
 
271
364
  exclude_nodes = @rttable.exclude_nodes_for_recover(@stats.ap_str, @stats.rep_host)
272
-
365
+
273
366
  @do_acquired_recover_process = true
274
367
  loop do
275
368
  break unless @do_acquired_recover_process
@@ -293,7 +386,7 @@ module Roma
293
386
  ensure
294
387
  @do_acquired_recover_process = false
295
388
  end
296
-
389
+
297
390
  def join_process
298
391
  @log.info("#{__method__}:start")
299
392
  count = 0
@@ -309,7 +402,7 @@ module Roma
309
402
  @log.warn("#{__method__}:vnode dose not found")
310
403
  return false
311
404
  end
312
- ret = req_push_a_vnode(vn, nodes[0], is_primary)
405
+ ret = req_push_a_vnode(vn, nodes[0], is_primary)
313
406
  if ret == :rejected
314
407
  sleep 5
315
408
  else
@@ -317,10 +410,10 @@ module Roma
317
410
  count += 1
318
411
  end
319
412
  end
320
- @log.info("#{__method__} has done.")
321
413
  rescue => e
322
414
  @log.error("#{e.inspect} #{$@}")
323
415
  ensure
416
+ @log.info("#{__method__} has done.")
324
417
  @do_join_process = false
325
418
  end
326
419
 
@@ -339,7 +432,7 @@ module Roma
339
432
  @log.warn("#{__method__}:vnode dose not found")
340
433
  return false
341
434
  end
342
- ret = req_push_a_vnode(vn, nodes[0], is_primary)
435
+ ret = req_push_a_vnode(vn, nodes[0], is_primary)
343
436
  if ret == :rejected
344
437
  sleep 5
345
438
  else
@@ -369,11 +462,11 @@ module Roma
369
462
  Roma::Messaging::ConPool.instance.return_connection(src_nid,con)
370
463
  # waiting for pushv
371
464
  count = 0
372
- while @rttable.search_nodes(vn).include?(@stats.ap_str)==false && count < 300
465
+ while @rttable.search_nodes(vn).include?(@stats.ap_str)==false && count < @stats.reqpushv_timeout_count
373
466
  sleep 0.1
374
467
  count += 1
375
468
  end
376
- if count >= 300
469
+ if count >= @stats.reqpushv_timeout_count
377
470
  @log.warn("#{__method__}:request has been time-out.vn=#{vn} nid=#{src_nid}")
378
471
  return :timeout
379
472
  end
@@ -383,7 +476,7 @@ module Roma
383
476
  @rttable.proc_failed(src_nid)
384
477
  false
385
478
  end
386
-
479
+
387
480
  def release_process
388
481
  @log.info("#{__method__}:start.")
389
482
 
@@ -397,7 +490,7 @@ module Roma
397
490
  @rttable.each_vnode do |vn, nids|
398
491
  break unless @do_release_process
399
492
  if nids.include?(@stats.ap_str)
400
-
493
+
401
494
  to_nid, new_nids = @rttable.select_node_for_release(@stats.ap_str, @stats.rep_host, nids)
402
495
  unless sync_a_vnode_for_release(vn, to_nid, new_nids)
403
496
  @log.warn("#{__method__}:error at vn=#{vn} to_nid=#{to_nid} new_nid=#{new_nids}")
@@ -413,10 +506,10 @@ module Roma
413
506
  @do_release_process = false
414
507
  Roma::Messaging::ConPool.instance.close_all
415
508
  end
416
-
509
+
417
510
  def sync_a_vnode_for_release(vn, to_nid, new_nids)
418
511
  nids = @rttable.search_nodes(vn)
419
-
512
+
420
513
  if nids.include?(to_nid)==false || (is_primary && nids[0]!=to_nid)
421
514
  @log.debug("#{__method__}:#{vn} #{to_nid}")
422
515
  # change routing data at the vnode and synchronize a data
@@ -444,7 +537,7 @@ module Roma
444
537
  if clk.is_a?(Integer) == false
445
538
  clk,new_nids = @rttable.search_nodes_with_clk(vn)
446
539
  end
447
-
540
+
448
541
  cmd = "setroute #{vn} #{clk - 1}"
449
542
  new_nids.each{ |nn| cmd << " #{nn}"}
450
543
  res = async_broadcast_cmd("#{cmd}\r\n")
@@ -459,7 +552,7 @@ module Roma
459
552
 
460
553
  def sync_a_vnode(vn, to_nid, is_primary=nil)
461
554
  nids = @rttable.search_nodes(vn)
462
-
555
+
463
556
  if nids.include?(to_nid)==false || (is_primary && nids[0]!=to_nid)
464
557
  @log.debug("#{__method__}:#{vn} #{to_nid} #{is_primary}")
465
558
  # change routing data at the vnode and synchronize a data
@@ -488,7 +581,7 @@ module Roma
488
581
  if clk.is_a?(Integer) == false
489
582
  clk,nids = @rttable.search_nodes_with_clk(vn)
490
583
  end
491
-
584
+
492
585
  cmd = "setroute #{vn} #{clk - 1}"
493
586
  nids.each{ |nn| cmd << " #{nn}"}
494
587
  res = async_broadcast_cmd("#{cmd}\r\n")
@@ -534,7 +627,7 @@ module Roma
534
627
  con = Roma::Messaging::ConPool.instance.get_connection(nid)
535
628
 
536
629
  @do_push_a_vnode_stream = true
537
-
630
+
538
631
  con.write("spushv #{hname} #{vn}\r\n")
539
632
 
540
633
  res = con.gets # READY\r\n or error string
@@ -631,6 +724,51 @@ module Roma
631
724
  @log.info("#{__method__}:stop")
632
725
  end
633
726
 
727
+ def asyncev_calc_latency_average(args)
728
+ latency,cmd = args
729
+ #@log.debug(__method__)
730
+
731
+ if !@stats.latency_data.key?(cmd) #only first execute target cmd
732
+ @stats.latency_data[cmd].store("latency", Array.new())
733
+ @stats.latency_data[cmd].store("latency_max", Hash.new())
734
+ @stats.latency_data[cmd]["latency_max"].store("current", 0)
735
+ @stats.latency_data[cmd].store("latency_min", Hash.new())
736
+ @stats.latency_data[cmd]["latency_min"].store("current", 99999)
737
+ @stats.latency_data[cmd].store("time", Time.now.to_i)
738
+ end
739
+
740
+ begin
741
+ @stats.latency_data[cmd]["latency"].delete_at(0) if @stats.latency_data[cmd]["latency"].length >= 10
742
+ @stats.latency_data[cmd]["latency"].push(latency)
743
+
744
+ @stats.latency_data[cmd]["latency_max"]["current"] = latency if latency > @stats.latency_data[cmd]["latency_max"]["current"]
745
+ @stats.latency_data[cmd]["latency_min"]["current"] = latency if latency < @stats.latency_data[cmd]["latency_min"]["current"]
746
+
747
+ rescue =>e
748
+ @log.error("#{__method__}:#{e.inspect} #{$@}")
749
+
750
+ ensure
751
+ if @stats.latency_check_time_count != nil && Time.now.to_i - @stats.latency_data[cmd]["time"] > @stats.latency_check_time_count
752
+ average = @stats.latency_data[cmd]["latency"].inject(0.0){|r,i| r+=i }/@stats.latency_data[cmd]["latency"].size
753
+ max = @stats.latency_data[cmd]["latency_max"]["current"]
754
+ min = @stats.latency_data[cmd]["latency_min"]["current"]
755
+ @log.debug("Latency average[#{cmd}]: #{sprintf("%.8f", average)}"+
756
+ "(denominator=#{@stats.latency_data[cmd]["latency"].length}"+
757
+ " max=#{sprintf("%.8f", max)}"+
758
+ " min=#{sprintf("%.8f", min)})"
759
+ )
760
+
761
+ @stats.latency_data[cmd]["time"] = Time.now.to_i
762
+ @stats.latency_data[cmd]["latency_past"] = @stats.latency_data[cmd]["latency"]
763
+ @stats.latency_data[cmd]["latency"] = []
764
+ @stats.latency_data[cmd]["latency_max"]["past"] = @stats.latency_data[cmd]["latency_max"]["current"]
765
+ @stats.latency_data[cmd]["latency_max"]["current"] = 0
766
+ @stats.latency_data[cmd]["latency_min"]["past"] = @stats.latency_data[cmd]["latency_min"]["current"]
767
+ @stats.latency_data[cmd]["latency_min"]["current"] = 99999
768
+ end
769
+ end
770
+ true
771
+ end
634
772
 
635
773
  end # module AsyncProcess
636
774
 
@@ -1,4 +1,3 @@
1
- # -*- coding: utf-8 -*-
2
1
  require 'roma/async_process'
3
2
  require 'roma/messaging/con_pool'
4
3
  require 'roma/command/vn_command_receiver'
@@ -12,7 +11,7 @@ module Roma
12
11
  def ev_balance(s)
13
12
  res = broadcast_cmd("rbalance\r\n")
14
13
  if @stats.run_join == false &&
15
- @stats.run_recover == false &&
14
+ @stats.run_recover == false &&
16
15
  @stats.run_balance == false &&
17
16
  @rttable.vnode_balance(@stats.ap_str)==:less
18
17
  Roma::AsyncProcess::queue.push(Roma::AsyncMessage.new('start_balance_process'))
@@ -25,7 +24,7 @@ module Roma
25
24
 
26
25
  def ev_rbalance(s)
27
26
  if @stats.run_join == false &&
28
- @stats.run_recover == false &&
27
+ @stats.run_recover == false &&
29
28
  @stats.run_balance == false &&
30
29
  @rttable.vnode_balance(@stats.ap_str)==:less
31
30
  Roma::AsyncProcess::queue.push(Roma::AsyncMessage.new('start_balance_process'))
@@ -37,7 +36,7 @@ module Roma
37
36
 
38
37
  def ev_release(s)
39
38
  if @stats.run_join == false &&
40
- @stats.run_recover == false &&
39
+ @stats.run_recover == false &&
41
40
  @stats.run_balance == false &&
42
41
  @stats.run_release == false &&
43
42
  @stats.run_iterate_storage == false
@@ -36,20 +36,24 @@ module Roma
36
36
 
37
37
  # routingdump [yaml|json|yamlbytes|bin]\r\n
38
38
  def ev_routingdump(s)
39
+ rt = @rttable
40
+ rd = @rttable.sub_nid_rd(@addr)
41
+ rt = Roma::Routing::RoutingTable.new(rd) if rd
42
+
39
43
  if s.length == 1
40
- dmp = @rttable.dump
44
+ dmp = rt.dump
41
45
  send_data("#{dmp.length}\r\n#{dmp}\r\nEND\r\n")
42
46
  elsif s[1] == 'yaml'
43
- dmp = @rttable.dump_yaml
47
+ dmp = rt.dump_yaml
44
48
  send_data("#{dmp}\r\nEND\r\n")
45
49
  elsif s[1] == 'json'
46
- dmp = @rttable.dump_json
50
+ dmp = rt.dump_json
47
51
  send_data("#{dmp}\r\nEND\r\n")
48
52
  elsif s[1] == 'yamlbytes'
49
- dmp = @rttable.dump_yaml
53
+ dmp = rt.dump_yaml
50
54
  send_data("#{dmp.length + 7}\r\nEND\r\n")
51
55
  elsif s[1] == 'bin'
52
- dmp = @rttable.dump_binary
56
+ dmp = rt.dump_binary
53
57
  send_data("#{dmp.length}\r\n#{dmp}\r\nEND\r\n")
54
58
  else
55
59
  send_data("CLIENT_ERROR\r\n")
@@ -107,6 +111,69 @@ module Roma
107
111
  send_data("CLIENT_ERROR\r\n")
108
112
  end
109
113
 
114
+ # set_auto_recover [true|false] <sec>
115
+ def ev_set_auto_recover(s)
116
+ #check argument
117
+ if /^true$|^false$/ !~ s[1]
118
+ return send_data("CLIENT_ERROR arguments must be true or false\r\n")
119
+ elsif s.length != 2 && s.length != 3
120
+ return send_data("CLIENT_ERROR number of arguments(0 for 1)\r\n")
121
+ elsif s.length == 3 && s[2].to_i < 1
122
+ return send_data("CLIENT_ERROR length must be greater than zero\r\n")
123
+ end
124
+ res = broadcast_cmd("rset_auto_recover #{s[1]} #{s[2]}\r\n")
125
+ if s[1] == "true"
126
+ @rttable.auto_recover = true
127
+ elsif s[1] == "false"
128
+ @rttable.auto_recover = false
129
+ end
130
+ @rttable.auto_recover_status = "waiting"
131
+ @rttable.auto_recover_time = s[2].to_i if s[2]
132
+ res[@stats.ap_str] = "STORED"
133
+ send_data("#{res}\r\n")
134
+ end
135
+
136
+ def ev_rset_auto_recover(s)
137
+ if /^true$|^false$/ !~ s[1]
138
+ return send_data("CLIENT_ERROR arguments must be true or false #{s[1]} #{s[1].class} \r\n")
139
+ elsif s.length != 2 && s.length != 3
140
+ return send_data("CLIENT_ERROR number of arguments(0 for 1)\r\n")
141
+ elsif s.length == 3 && s[2].to_i < 1
142
+ return send_data("CLIENT_ERROR length must be greater than zero\r\n")
143
+ end
144
+ if s[1] == "true"
145
+ @rttable.auto_recover = true
146
+ elsif s[1] == "false"
147
+ @rttable.auto_recover = false
148
+ end
149
+ @rttable.auto_recover_status = "waiting"
150
+ @rttable.auto_recover_time = s[2].to_i if s[2]
151
+ send_data("STORED\r\n")
152
+ end
153
+
154
+ # set_lost_action [auto_assign|shutdown]
155
+ def ev_set_lost_action(s)
156
+ if s.length != 2 || /^auto_assign$|^shutdown$/ !~ s[1]
157
+ return send_data("CLIENT_ERROR changing lost_action must be auto_assign or shutdown\r\n")
158
+ elsif /^auto_assign$|^shutdown$/ !~ @rttable.lost_action
159
+ return send_data("CLIENT_ERROR can use this command only current lost action is auto_assign or shutdwn mode\r\n")
160
+ end
161
+ res = broadcast_cmd("rset_lost_action #{s[1]}\r\n")
162
+ @rttable.lost_action = s[1].to_sym
163
+ res[@stats.ap_str] = "STORED"
164
+ send_data("#{res}\r\n")
165
+ end
166
+
167
+ def ev_rset_lost_action(s)
168
+ if s.length != 2 || /^auto_assign$|^shutdown$/ !~ s[1]
169
+ return send_data("CLIENT_ERROR changing lost_action must be auto_assign or shutdown\r\n")
170
+ elsif /^auto_assign$|^shutdown$/ !~ @rttable.lost_action
171
+ return send_data("CLIENT_ERROR can use this command only current lost action is auto_assign or shutdwn mode\r\n")
172
+ end
173
+ @rttable.lost_action = s[1].to_sym
174
+ send_data("STORED\r\n")
175
+ end
176
+
110
177
  # set_threshold_for_failover <n>
111
178
  def ev_set_threshold_for_failover(s)
112
179
  if s.length != 2 || s[1].to_i == 0
@@ -147,6 +214,67 @@ module Roma
147
214
  send_data("STORED\r\n")
148
215
  end
149
216
 
217
+ # cleat RTTABLE_SUB_NID map
218
+ def ev_clear_rttable_sub_nid(s)
219
+ res = broadcast_cmd("rclear_rttable_sub_nid\r\n")
220
+ @rttable.sub_nid.clear()
221
+ res[@stats.ap_str] = "CLEARED"
222
+ send_data("#{res}\r\n")
223
+ end
224
+
225
+ def ev_rclear_rttable_sub_nid(s)
226
+ @rttable.sub_nid.clear()
227
+ send_data("CLEARED\r\n")
228
+ end
229
+
230
+ # add_rttable_sub_nid <netmask> <regexp> <replace>
231
+ def ev_add_rttable_sub_nid(s)
232
+ if s.length != 4
233
+ return send_data("usage:add_rttable_sub_nid <netmask> <regexp> <replace>\r\n")
234
+ end
235
+ res = broadcast_cmd("radd_rttable_sub_nid #{s[1]} #{s[2]} #{s[3]}\r\n")
236
+ @rttable.sub_nid[s[1]] = {:regexp => "#{s[2]}", :replace => "#{s[3]}"}
237
+ res[@stats.ap_str] = "ADDED"
238
+ send_data("#{res}\r\n")
239
+ end
240
+
241
+ # radd_rttable_sub_nid <netmask> <regexp> <replace>
242
+ def ev_radd_rttable_sub_nid(s)
243
+ if s.length != 4
244
+ return send_data("usage:add_rttable_sub_nid <netmask> <regexp> <replace>\r\n")
245
+ end
246
+ @rttable.sub_nid[s[1]] = {:regexp => "#{s[2]}", :replace => "#{s[3]}"}
247
+ send_data("ADDED\r\n")
248
+ end
249
+
250
+ # delete_rttable_sub_nid <netmask>
251
+ def ev_delete_rttable_sub_nid(s)
252
+ if s.length != 2
253
+ return send_data("usage:delete_rttable_sub_nid <netmask>\r\n")
254
+ end
255
+
256
+ res = broadcast_cmd("rdelete_rttable_sub_nid #{s[1]}\r\n")
257
+ unless @rttable.sub_nid.delete s[1]
258
+ res[@stats.ap_str] = "NOT_FOUND"
259
+ else
260
+ res[@stats.ap_str] = "DELETED"
261
+ end
262
+ send_data("#{res}\r\n")
263
+ end
264
+
265
+ # rdelete_rttable_sub_nid <netmask>
266
+ def ev_rdelete_rttable_sub_nid(s)
267
+ if s.length != 2
268
+ return send_data("usage:delete_rttable_sub_nid <netmask>\r\n")
269
+ end
270
+
271
+ unless @rttable.sub_nid.delete s[1]
272
+ send_data("NOT_FOUND\r\n")
273
+ else
274
+ send_data("DELETED\r\n")
275
+ end
276
+ end
277
+
150
278
  end # module RoutingCommandReceiver
151
279
  end # module Command
152
280
  end # module Roma