roma 0.8.14 → 1.0.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.
- checksums.yaml +4 -4
- data/CHANGELOG +19 -0
- data/ruby/server/lib/roma/async_process.rb +130 -16
- data/ruby/server/lib/roma/command/command_definition.rb +19 -3
- data/ruby/server/lib/roma/command/rt_command_receiver.rb +28 -0
- data/ruby/server/lib/roma/command/sys_command_receiver.rb +64 -2
- data/ruby/server/lib/roma/config.rb +1 -0
- data/ruby/server/lib/roma/plugin/plugin_gui.rb +66 -0
- data/ruby/server/lib/roma/plugin/plugin_storage.rb +49 -6
- data/ruby/server/lib/roma/romad.rb +23 -18
- data/ruby/server/lib/roma/routing/cb_rttable.rb +28 -10
- data/ruby/server/lib/roma/routing/random_partitioner.rb +34 -7
- data/ruby/server/lib/roma/routing/rttable.rb +24 -7
- data/ruby/server/lib/roma/stats.rb +11 -1
- data/ruby/server/lib/roma/storage/basic_storage.rb +36 -31
- data/ruby/server/lib/roma/tools/cpdb.rb +20 -2
- data/ruby/server/lib/roma/tools/safecopy_integration_test.rb +37 -16
- data/ruby/server/lib/roma/version.rb +1 -1
- data/ruby/server/test/t_protocol.rb +1 -1
- data/ruby/server/test/t_storage.rb +28 -21
- data/ruby/server/test/t_writebehind.rb +120 -5
- metadata +19 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 463ee73649102c0de8e1b6a7fa8e42f5130f2332
|
4
|
+
data.tar.gz: d8f360a9690da7729b3b939486ac9c12a3eb32bf
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ec235f905b6bf987aaa157b2c360dfe0b8adf683597cff10fb1149a27aff25a1e9d976a842b7c91907d78e4a2b0dafa281f5af97ce21d408571bbbad99911178
|
7
|
+
data.tar.gz: 6e9eda8b8885efc140708c2adc549b633263ed29e9bac65ccd5492f3d002c3bf0a8cc3556fc72220bca1ccbeda3111c0dc1c67365136a910a974b51530486742
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
*1.0.0 (Sep 30 2014)*
|
2
|
+
|
3
|
+
* Add new function to get vnodes information of each data [hiroaki-iwase] ad25c6e
|
4
|
+
* Add new function to get key list without stopping ROMA [hiroaki-iwase] f36e907
|
5
|
+
* Add new GUI control system(Gladiator) [hiroaki-iwase] 66dfd58
|
6
|
+
* Add new function to get log data via ROMA console [hiroaki-iwase] b1995e4
|
7
|
+
* change some snapshot and storage logic [hiroaki-iwase] 257b0df
|
8
|
+
* Add new function to check routing consistecy [hiroaki-iwase] dcd1ace
|
9
|
+
* Add new function of getting routing event [hiroaki-iwase] e297215
|
10
|
+
* fix : no data copy in the join process when 2 hosts, 2 processes [junji torii] 10eae74
|
11
|
+
* Merge branch 'master' of git@github.com:roma/roma into fix_join [junji torii] 41e0269
|
12
|
+
* refacort:error case for the release command. [junji torii] 0144b63
|
13
|
+
* change release logic [hiroaki-iwase] f950fa1
|
14
|
+
* bugfix:end condition of recover process in no_action [junji torii] 9b41a3c
|
15
|
+
* {func}__prev support for DSL [junji torii] d772c56
|
16
|
+
* Add new function to get first instance information [hiroaki-iwase] e4b465f
|
17
|
+
* {func}__prev support in write-behind [junji torii] 96af508
|
18
|
+
* each_vn_dump supported in normal status [junji torii] 546ee7d
|
19
|
+
|
1
20
|
*0.8.14 (Mar 26 2014)*
|
2
21
|
|
3
22
|
* add timeout parameter for a vnode copy [junji torii] 0522750
|
@@ -305,7 +305,7 @@ module Roma
|
|
305
305
|
t = Thread::new do
|
306
306
|
begin
|
307
307
|
timeout(@rttable.auto_recover_time){
|
308
|
-
loop{
|
308
|
+
loop{
|
309
309
|
sleep 1
|
310
310
|
break if @rttable.auto_recover_status != "preparing"
|
311
311
|
#break if @stats.run_join #run_join don't have possibility to be true in this case.
|
@@ -331,7 +331,7 @@ module Roma
|
|
331
331
|
when :no_action
|
332
332
|
@log.debug("auto recover NOT start. Because lost action is [no_action]")
|
333
333
|
end
|
334
|
-
end
|
334
|
+
end
|
335
335
|
end
|
336
336
|
t[:name] = __method__
|
337
337
|
end
|
@@ -366,6 +366,7 @@ module Roma
|
|
366
366
|
@do_acquired_recover_process = true
|
367
367
|
loop do
|
368
368
|
break unless @do_acquired_recover_process
|
369
|
+
break if @rttable.num_of_vn(@stats.ap_str)[2] == 0 # short vnodes
|
369
370
|
|
370
371
|
vn, nodes, is_primary = @rttable.select_vn_for_recover(exclude_nodes)
|
371
372
|
break unless vn
|
@@ -487,12 +488,18 @@ module Roma
|
|
487
488
|
|
488
489
|
@do_release_process = true
|
489
490
|
while(@rttable.has_node?(@stats.ap_str)) do
|
491
|
+
break unless @do_release_process
|
490
492
|
@rttable.each_vnode do |vn, nids|
|
491
493
|
break unless @do_release_process
|
492
494
|
if nids.include?(@stats.ap_str)
|
493
495
|
|
494
496
|
to_nid, new_nids = @rttable.select_node_for_release(@stats.ap_str, @stats.rep_host, nids)
|
495
|
-
|
497
|
+
res = sync_a_vnode_for_release(vn, to_nid, new_nids)
|
498
|
+
if res == :abort
|
499
|
+
@log.error("#{__method__}:release_process aborted due to SERVER_ERROR received.")
|
500
|
+
@do_release_process = false
|
501
|
+
end
|
502
|
+
if res == false
|
496
503
|
@log.warn("#{__method__}:error at vn=#{vn} to_nid=#{to_nid} new_nid=#{new_nids}")
|
497
504
|
redo
|
498
505
|
end
|
@@ -510,7 +517,7 @@ module Roma
|
|
510
517
|
def sync_a_vnode_for_release(vn, to_nid, new_nids)
|
511
518
|
nids = @rttable.search_nodes(vn)
|
512
519
|
|
513
|
-
if nids.include?(to_nid)==false
|
520
|
+
if nids.include?(to_nid)==false
|
514
521
|
@log.debug("#{__method__}:#{vn} #{to_nid}")
|
515
522
|
# change routing data at the vnode and synchronize a data
|
516
523
|
nids << to_nid
|
@@ -523,6 +530,7 @@ module Roma
|
|
523
530
|
if res != "STORED"
|
524
531
|
@rttable.rollback(vn)
|
525
532
|
@log.error("#{__method__}:push_a_vnode was failed:hname=#{hname} vn=#{vn}:#{res}")
|
533
|
+
return :abort if res.start_with?("SERVER_ERROR")
|
526
534
|
return false
|
527
535
|
end
|
528
536
|
}
|
@@ -607,14 +615,31 @@ module Roma
|
|
607
615
|
if @rttable.rn == 1
|
608
616
|
return [new_nid]
|
609
617
|
end
|
610
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
618
|
+
# [node_a, node_b, new_nid]
|
619
|
+
nodes.delete(new_nid)
|
620
|
+
# [node_a, node_b]
|
621
|
+
|
622
|
+
if nodes.length >= @rttable.rn
|
623
|
+
host = new_nid.split(/[:_]/)[0]
|
624
|
+
buf = [] # list of a same host
|
625
|
+
nodes.each do |nid|
|
626
|
+
buf << nid if nid.split(/[:_]/)[0] == host
|
627
|
+
end
|
628
|
+
if buf.length > 0
|
629
|
+
# include same host
|
630
|
+
# delete a last one, due to save a primary node
|
631
|
+
nodes.delete(buf.last)
|
632
|
+
else
|
633
|
+
nodes.delete(nodes.last)
|
634
|
+
end
|
614
635
|
end
|
636
|
+
|
615
637
|
if is_primary
|
616
|
-
|
638
|
+
# [new_nid, node_a]
|
617
639
|
nodes.insert(0,new_nid)
|
640
|
+
else
|
641
|
+
# [node_a, new_nid]
|
642
|
+
nodes << new_nid
|
618
643
|
end
|
619
644
|
nodes
|
620
645
|
end
|
@@ -636,7 +661,7 @@ module Roma
|
|
636
661
|
return res.chomp
|
637
662
|
end
|
638
663
|
|
639
|
-
@storages[hname].each_vn_dump(vn)
|
664
|
+
res_dump = @storages[hname].each_vn_dump(vn) do |data|
|
640
665
|
|
641
666
|
unless @do_push_a_vnode_stream
|
642
667
|
con.close
|
@@ -646,12 +671,16 @@ module Roma
|
|
646
671
|
|
647
672
|
con.write(data)
|
648
673
|
sleep @stats.stream_copy_wait_param
|
649
|
-
|
674
|
+
end
|
650
675
|
con.write("\0"*20) # end of steram
|
651
676
|
|
652
677
|
res = con.gets # STORED\r\n or error string
|
653
678
|
Roma::Messaging::ConPool.instance.return_connection(nid,con)
|
654
679
|
res.chomp! if res
|
680
|
+
if res_dump == false
|
681
|
+
@log.error("#{__method__}:each_vn_dump in hname=#{hname} vn=#{vn} nid=#{nid}")
|
682
|
+
return "CANCELED"
|
683
|
+
end
|
655
684
|
res
|
656
685
|
rescue =>e
|
657
686
|
@log.error("#{e}\n#{$@}")
|
@@ -773,7 +802,7 @@ module Roma
|
|
773
802
|
def asyncev_start_storage_flush_process(args)
|
774
803
|
hname, dn = args
|
775
804
|
@log.debug("#{__method__} #{args.inspect}")
|
776
|
-
|
805
|
+
|
777
806
|
st = @storages[hname]
|
778
807
|
if st.dbs[dn] != :safecopy_flushing
|
779
808
|
@log.error("Can not flush storage. stat = #{st.dbs[dn]}")
|
@@ -796,7 +825,7 @@ module Roma
|
|
796
825
|
def asyncev_start_storage_cachecleaning_process(args)
|
797
826
|
hname, dn = args
|
798
827
|
@log.debug("#{__method__} #{args.inspect}")
|
799
|
-
|
828
|
+
|
800
829
|
st = @storages[hname]
|
801
830
|
if st.dbs[dn] != :cachecleaning
|
802
831
|
@log.error("Can not start cachecleaning process. stat = #{st.dbs[dn]}")
|
@@ -818,16 +847,16 @@ module Roma
|
|
818
847
|
count = 0
|
819
848
|
rcount = 0
|
820
849
|
st = @storages[hname]
|
821
|
-
|
850
|
+
|
822
851
|
@do_storage_cachecleaning_process = true
|
823
852
|
loop do
|
824
853
|
# get keys in a cache up to 100 kyes
|
825
854
|
keys = st.get_keys_in_cache(dn)
|
826
855
|
break if keys == nil || keys.length == 0
|
827
856
|
break unless @do_storage_cachecleaning_process
|
828
|
-
|
857
|
+
|
829
858
|
# @log.debug("#{__method__}:#{keys.length} keys found")
|
830
|
-
|
859
|
+
|
831
860
|
# copy cache -> db
|
832
861
|
st.each_cache_by_keys(dn, keys) do |vn, last, clk, expt, k, v|
|
833
862
|
break unless @do_storage_cachecleaning_process
|
@@ -854,6 +883,91 @@ module Roma
|
|
854
883
|
@do_storage_cachecleaning_process = false
|
855
884
|
end
|
856
885
|
|
886
|
+
def asyncev_start_get_routing_event(args)
|
887
|
+
@log.debug("#{__method__} #{args}")
|
888
|
+
t = Thread::new do
|
889
|
+
begin
|
890
|
+
get_routing_event
|
891
|
+
rescue => e
|
892
|
+
@log.error("#{__method__}:#{e.inspect} #{$@}")
|
893
|
+
ensure
|
894
|
+
end
|
895
|
+
end
|
896
|
+
t[:name] = __method__
|
897
|
+
end
|
898
|
+
|
899
|
+
def get_routing_event
|
900
|
+
@log.info("#{__method__}:start.")
|
901
|
+
|
902
|
+
routing_path = Config::RTTABLE_PATH
|
903
|
+
f_list = Dir.glob("#{routing_path}/#{@stats.ap_str}*")
|
904
|
+
|
905
|
+
f_list.each{|fname|
|
906
|
+
IO.foreach(fname){|line|
|
907
|
+
if line =~ /join|leave/
|
908
|
+
@rttable.event.shift if @rttable.event.size >= @rttable.event_limit_line
|
909
|
+
@rttable.event << line.chomp
|
910
|
+
end
|
911
|
+
}
|
912
|
+
}
|
913
|
+
|
914
|
+
@log.info("#{__method__} has done.")
|
915
|
+
rescue =>e
|
916
|
+
@log.error("#{e}\n#{$@}")
|
917
|
+
end
|
918
|
+
|
919
|
+
def asyncev_start_get_logs(args)
|
920
|
+
@log.debug("#{__method__} #{args}")
|
921
|
+
t = Thread::new do
|
922
|
+
begin
|
923
|
+
get_logs(args)
|
924
|
+
rescue => e
|
925
|
+
@log.error("#{__method__}:#{e.inspect} #{$@}")
|
926
|
+
ensure
|
927
|
+
@stats.gui_run_gather_logs = false
|
928
|
+
end
|
929
|
+
end
|
930
|
+
t[:name] = __method__
|
931
|
+
end
|
932
|
+
|
933
|
+
def get_logs(args)
|
934
|
+
@log.debug("#{__method__}:start.")
|
935
|
+
|
936
|
+
log_path = Config::LOG_PATH
|
937
|
+
log_file = "#{log_path}/#{@stats.ap_str}.log"
|
938
|
+
|
939
|
+
raw_logs = []
|
940
|
+
start_time = Time.now
|
941
|
+
File.open(log_file){|f|
|
942
|
+
f.each_line{|line|
|
943
|
+
# hilatency check
|
944
|
+
ps = Time.now - start_time
|
945
|
+
if ps > 5
|
946
|
+
@log.warn("gather_logs process was failed.")
|
947
|
+
raise
|
948
|
+
end
|
949
|
+
|
950
|
+
raw_logs << line unless line.chomp == '.'
|
951
|
+
}
|
952
|
+
}
|
953
|
+
|
954
|
+
sliced_logs = []
|
955
|
+
if raw_logs.size > args[0]
|
956
|
+
sliced_logs = raw_logs.slice(-args[0]..-1)
|
957
|
+
else
|
958
|
+
raw_logs.shift # remove first line(date of log file was created)
|
959
|
+
sliced_logs = raw_logs
|
960
|
+
end
|
961
|
+
|
962
|
+
@rttable.logs = sliced_logs
|
963
|
+
@log.info("#{__method__} has done.")
|
964
|
+
rescue =>e
|
965
|
+
@rttable.logs = []
|
966
|
+
@log.error("#{e}\n#{$@}")
|
967
|
+
ensure
|
968
|
+
@stats.gui_run_gather_logs = false
|
969
|
+
end
|
970
|
+
|
857
971
|
end # module AsyncProcess
|
858
972
|
|
859
973
|
end # module Roma
|
@@ -119,6 +119,11 @@ module Roma
|
|
119
119
|
stored.vn, stored.last, stored.clk, stored.expt, stored.value =
|
120
120
|
@storages[params.hash_name].get_raw(params.vn, params.key, params.digest)
|
121
121
|
stored = nil if stored.vn == nil || Time.now.to_i > stored.expt
|
122
|
+
if stored && @stats.wb_command_map.key?("#{cmd}__prev".to_sym)
|
123
|
+
Roma::WriteBehindProcess::push(params.hash_name,
|
124
|
+
@stats.wb_command_map["#{cmd}__prev".to_sym],
|
125
|
+
params.key, stored.value)
|
126
|
+
end
|
122
127
|
ctx = CommandContext.new(s, params, stored)
|
123
128
|
|
124
129
|
ret = instance_exec(ctx, &block)
|
@@ -137,7 +142,9 @@ module Roma
|
|
137
142
|
|
138
143
|
if ret
|
139
144
|
if @stats.wb_command_map.key?(cmd.to_sym)
|
140
|
-
Roma::WriteBehindProcess::push(ctx.params.hash_name,
|
145
|
+
Roma::WriteBehindProcess::push(ctx.params.hash_name,
|
146
|
+
@stats.wb_command_map[cmd.to_sym],
|
147
|
+
ctx.params.key, ret[4])
|
141
148
|
end
|
142
149
|
redundant(ctx.params.nodes[1..-1], ctx.params.hash_name,
|
143
150
|
ctx.params.key, ctx.params.digest, ret[2],
|
@@ -223,8 +230,15 @@ module Roma
|
|
223
230
|
stored.vn, stored.last, stored.clk, stored.expt, stored.value =
|
224
231
|
@storages[params.hash_name].get_raw(params.vn, params.key, params.digest)
|
225
232
|
stored = nil if stored.vn == nil || Time.now.to_i > stored.expt
|
226
|
-
ctx = CommandContext.new(s, params, stored)
|
227
233
|
|
234
|
+
if stored && @stats.wb_command_map.key?("#{cmd}__prev".to_sym)
|
235
|
+
Roma::WriteBehindProcess::push(params.hash_name,
|
236
|
+
@stats.wb_command_map["#{cmd}__prev".to_sym],
|
237
|
+
params.key, stored.value)
|
238
|
+
end
|
239
|
+
|
240
|
+
ctx = CommandContext.new(s, params, stored)
|
241
|
+
|
228
242
|
ret = instance_exec(ctx, &block)
|
229
243
|
if ret.instance_of? Array
|
230
244
|
flg, expt, value, count, msg = ret
|
@@ -241,7 +255,9 @@ module Roma
|
|
241
255
|
|
242
256
|
if ret
|
243
257
|
if @stats.wb_command_map.key?(cmd.to_sym)
|
244
|
-
Roma::WriteBehindProcess::push(ctx.params.hash_name,
|
258
|
+
Roma::WriteBehindProcess::push(ctx.params.hash_name,
|
259
|
+
@stats.wb_command_map[cmd.to_sym],
|
260
|
+
ctx.params.key, ret[4])
|
245
261
|
end
|
246
262
|
redundant(ctx.params.nodes[1..-1], ctx.params.hash_name,
|
247
263
|
ctx.params.key, ctx.params.digest, ret[2],
|
@@ -60,6 +60,19 @@ module Roma
|
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
|
+
def ev_enabled_repetition_in_routing?(s)
|
64
|
+
rt = @rttable
|
65
|
+
rd = @rttable.sub_nid_rd(@addr)
|
66
|
+
rt = Roma::Routing::RoutingTable.new(rd) if rd
|
67
|
+
|
68
|
+
if s.length == 1
|
69
|
+
repetition = rt.check_repetition_in_routing
|
70
|
+
send_data("#{repetition}\r\n")
|
71
|
+
else
|
72
|
+
send_data("CLIENT_ERROR\r\n")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
63
76
|
# setroute <vnode-id> <clock> <node-id> ...
|
64
77
|
def ev_setroute(s)
|
65
78
|
if s.length < 4
|
@@ -275,6 +288,21 @@ module Roma
|
|
275
288
|
end
|
276
289
|
end
|
277
290
|
|
291
|
+
# get_key_info <key>
|
292
|
+
def ev_get_key_info(s)
|
293
|
+
if s.length != 2
|
294
|
+
return send_data("CLIENT_ERROR number of arguments(0 for 1)\r\n")
|
295
|
+
end
|
296
|
+
|
297
|
+
d = Digest::SHA1.hexdigest(s[1]).hex % @rttable.hbits
|
298
|
+
vn = @rttable.get_vnode_id(d)
|
299
|
+
nodes = @rttable.search_nodes_for_write(vn)
|
300
|
+
send_data(sprintf("d = %s 0x%x\r\n",d,d))
|
301
|
+
send_data(sprintf("vn = %s 0x%x\r\n",vn,vn))
|
302
|
+
send_data("nodes = #{nodes.inspect}\r\n")
|
303
|
+
send_data("END\r\n")
|
304
|
+
end
|
305
|
+
|
278
306
|
end # module RoutingCommandReceiver
|
279
307
|
end # module Command
|
280
308
|
end # module Roma
|
@@ -1052,7 +1052,7 @@ module Roma
|
|
1052
1052
|
return send_data("CLIENT_ERROR storage[#{dn}] != :normal status\r\n")
|
1053
1053
|
end
|
1054
1054
|
if st.set_db_stat(dn, :safecopy_flushing) == false
|
1055
|
-
return send_data("CLIENT_ERROR storage[#{dn}]
|
1055
|
+
return send_data("CLIENT_ERROR storage[#{dn}] status can't changed\r\n")
|
1056
1056
|
end
|
1057
1057
|
Roma::AsyncProcess::queue.push(Roma::AsyncMessage.new('start_storage_flush_process',[hname, dn]))
|
1058
1058
|
elsif s[2] == 'normal'
|
@@ -1060,7 +1060,7 @@ module Roma
|
|
1060
1060
|
return send_data("CLIENT_ERROR storage[#{dn}] != :safecopy_flushed status\r\n")
|
1061
1061
|
end
|
1062
1062
|
if st.set_db_stat(dn, :cachecleaning) == false
|
1063
|
-
return send_data("CLIENT_ERROR storage[#{dn}]
|
1063
|
+
return send_data("CLIENT_ERROR storage[#{dn}] status can't changed\r\n")
|
1064
1064
|
end
|
1065
1065
|
Roma::AsyncProcess::queue.push(Roma::AsyncMessage.new('start_storage_cachecleaning_process',[hname, dn]))
|
1066
1066
|
else
|
@@ -1070,6 +1070,68 @@ module Roma
|
|
1070
1070
|
send_data("PUSHED\r\n")
|
1071
1071
|
end
|
1072
1072
|
|
1073
|
+
# set_gui_run_snapshot [true|false]
|
1074
|
+
def ev_set_gui_run_snapshot(s)
|
1075
|
+
if s.length != 2
|
1076
|
+
return send_data("CLIENT_ERROR number of arguments\n\r")
|
1077
|
+
end
|
1078
|
+
|
1079
|
+
case s[1]
|
1080
|
+
when 'true'
|
1081
|
+
@stats.gui_run_snapshot = true
|
1082
|
+
send_data("STORED\r\n")
|
1083
|
+
when 'false'
|
1084
|
+
@stats.gui_run_snapshot = false
|
1085
|
+
send_data("STORED\r\n")
|
1086
|
+
else
|
1087
|
+
return send_data("CLIENT_ERROR value must be true or false\r\n")
|
1088
|
+
end
|
1089
|
+
end
|
1090
|
+
|
1091
|
+
# set_gui_last_snapshot_date [%Y/%m/%d %H:%M:%S]
|
1092
|
+
def ev_set_gui_last_snapshot(s)
|
1093
|
+
if s.length != 2
|
1094
|
+
return send_data("CLIENT_ERROR number of arguments\n\r")
|
1095
|
+
end
|
1096
|
+
if s[1] !~ /^\d+\/\d+\/\d+T\d+:\d+:\d+$/
|
1097
|
+
return send_data("CLIENT_ERROR format is [%Y/%m/%dT%H:%M:%S]\r\n")
|
1098
|
+
end
|
1099
|
+
res = broadcast_cmd("rset_gui_last_snapshot #{s[1]}\r\n")
|
1100
|
+
@stats.gui_last_snapshot = s[1]
|
1101
|
+
res[@stats.ap_str] = "PUSHED"
|
1102
|
+
send_data("#{res}\r\n")
|
1103
|
+
end
|
1104
|
+
|
1105
|
+
# rset_gui_last_snapshot(s)
|
1106
|
+
def ev_rset_gui_last_snapshot(s)
|
1107
|
+
if s.length != 2
|
1108
|
+
return send_data("CLIENT_ERROR number of arguments\n\r")
|
1109
|
+
end
|
1110
|
+
if s[1] !~ /^\d+\/\d+\/\d+T\d+:\d+:\d+$/
|
1111
|
+
return send_data("CLIENT_ERROR format is [%Y/%m/%dT%H:%M:%S]\r\n")
|
1112
|
+
end
|
1113
|
+
@stats.gui_last_snapshot = s[1]
|
1114
|
+
send_data("PUSHED\r\n")
|
1115
|
+
end
|
1116
|
+
|
1117
|
+
# set_cleanup_regexp <regexp>
|
1118
|
+
def ev_set_cleanup_regexp(s)
|
1119
|
+
if s.length != 2
|
1120
|
+
return send_data("CLIENT_ERROR number of arguments #{s.length-1} to 1\r\n")
|
1121
|
+
end
|
1122
|
+
|
1123
|
+
# failover check
|
1124
|
+
unless @rttable.enabled_failover
|
1125
|
+
return send_data("CLIENT_ERROR failover disable now!!\r\n")
|
1126
|
+
end
|
1127
|
+
|
1128
|
+
@storages.each{|hname,st|
|
1129
|
+
st.cleanup_regexp = s[1]
|
1130
|
+
st.stop_clean_up
|
1131
|
+
send_data("STORED\r\n")
|
1132
|
+
}
|
1133
|
+
end
|
1134
|
+
|
1073
1135
|
private
|
1074
1136
|
|
1075
1137
|
def dcnice(p)
|