ls4 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/AUTHORS +1 -0
  2. data/COPYING +661 -0
  3. data/ChangeLog +9 -0
  4. data/NOTICE +8 -0
  5. data/README.rdoc +61 -0
  6. data/bin/ls4-cs +3 -0
  7. data/bin/ls4-ds +3 -0
  8. data/bin/ls4-gw +3 -0
  9. data/bin/ls4-standalone +3 -0
  10. data/bin/ls4cmd +3 -0
  11. data/bin/ls4ctl +3 -0
  12. data/bin/ls4rpc +3 -0
  13. data/bin/ls4stat +3 -0
  14. data/bin/ls4top +3 -0
  15. data/lib/ls4/command/cmd.rb +241 -0
  16. data/lib/ls4/command/cs.rb +190 -0
  17. data/lib/ls4/command/ctl.rb +278 -0
  18. data/lib/ls4/command/ds.rb +335 -0
  19. data/lib/ls4/command/gw.rb +256 -0
  20. data/lib/ls4/command/rpc.rb +172 -0
  21. data/lib/ls4/command/standalone.rb +318 -0
  22. data/lib/ls4/command/stat.rb +244 -0
  23. data/lib/ls4/command/top.rb +291 -0
  24. data/lib/ls4/default.rb +26 -0
  25. data/lib/ls4/lib/cclog.rb +220 -0
  26. data/lib/ls4/lib/ebus.rb +553 -0
  27. data/lib/ls4/lib/vbcode.rb +228 -0
  28. data/lib/ls4/logic/fault_detector.rb +212 -0
  29. data/lib/ls4/logic/membership.rb +253 -0
  30. data/lib/ls4/logic/node.rb +66 -0
  31. data/lib/ls4/logic/okey.rb +45 -0
  32. data/lib/ls4/logic/tsv_data.rb +81 -0
  33. data/lib/ls4/logic/weight.rb +166 -0
  34. data/lib/ls4/service/balance.rb +62 -0
  35. data/lib/ls4/service/base.rb +29 -0
  36. data/lib/ls4/service/bus.rb +37 -0
  37. data/lib/ls4/service/config.rb +63 -0
  38. data/lib/ls4/service/config_cs.rb +33 -0
  39. data/lib/ls4/service/config_ds.rb +56 -0
  40. data/lib/ls4/service/config_gw.rb +42 -0
  41. data/lib/ls4/service/data_client.rb +122 -0
  42. data/lib/ls4/service/data_server.rb +168 -0
  43. data/lib/ls4/service/data_server_url.rb +83 -0
  44. data/lib/ls4/service/gateway.rb +375 -0
  45. data/lib/ls4/service/gateway_ro.rb +91 -0
  46. data/lib/ls4/service/gw_http.rb +821 -0
  47. data/lib/ls4/service/heartbeat.rb +182 -0
  48. data/lib/ls4/service/log.rb +81 -0
  49. data/lib/ls4/service/master_select.rb +148 -0
  50. data/lib/ls4/service/mds.rb +292 -0
  51. data/lib/ls4/service/mds_cache.rb +294 -0
  52. data/lib/ls4/service/mds_cache_mem.rb +63 -0
  53. data/lib/ls4/service/mds_cache_memcached.rb +65 -0
  54. data/lib/ls4/service/mds_ha.rb +176 -0
  55. data/lib/ls4/service/mds_memcache.rb +209 -0
  56. data/lib/ls4/service/mds_tc.rb +508 -0
  57. data/lib/ls4/service/mds_tt.rb +472 -0
  58. data/lib/ls4/service/membership.rb +331 -0
  59. data/lib/ls4/service/process.rb +90 -0
  60. data/lib/ls4/service/rpc.rb +50 -0
  61. data/lib/ls4/service/rpc_cs.rb +101 -0
  62. data/lib/ls4/service/rpc_ds.rb +96 -0
  63. data/lib/ls4/service/rpc_gw.rb +255 -0
  64. data/lib/ls4/service/rts.rb +94 -0
  65. data/lib/ls4/service/rts_file.rb +76 -0
  66. data/lib/ls4/service/rts_memory.rb +55 -0
  67. data/lib/ls4/service/slave.rb +132 -0
  68. data/lib/ls4/service/stat.rb +91 -0
  69. data/lib/ls4/service/stat_cs.rb +25 -0
  70. data/lib/ls4/service/stat_ds.rb +40 -0
  71. data/lib/ls4/service/stat_gw.rb +25 -0
  72. data/lib/ls4/service/storage.rb +116 -0
  73. data/lib/ls4/service/storage_dir.rb +201 -0
  74. data/lib/ls4/service/sync.rb +206 -0
  75. data/lib/ls4/service/time_check.rb +80 -0
  76. data/lib/ls4/service/ulog.rb +159 -0
  77. data/lib/ls4/service/ulog_file.rb +398 -0
  78. data/lib/ls4/service/ulog_memory.rb +53 -0
  79. data/lib/ls4/service/weight.rb +134 -0
  80. data/lib/ls4/version.rb +5 -0
  81. data/test/01_add_get_remove.rt +84 -0
  82. data/test/02_read.rt +61 -0
  83. data/test/03_getd_readd.rt +69 -0
  84. data/test/04_version_time.rt +170 -0
  85. data/test/05_version_name.rt +161 -0
  86. data/test/06_http_get_set_remove_1.rt +119 -0
  87. data/test/07_http_get_set_remove_2.rt +116 -0
  88. data/test/08_read_only_time.rt +177 -0
  89. data/test/09_read_only_name.rt +173 -0
  90. data/test/10_http_get_set_remove_3.rt +73 -0
  91. data/test/11_mds_cache_memcached.rt +88 -0
  92. data/test/12_mds_cache_local_memory.rt +86 -0
  93. data/test/13_memcache_mds.rt +84 -0
  94. data/test/14_delete.rt +63 -0
  95. data/test/15_standalone.rt +71 -0
  96. data/test/chukan.rb +516 -0
  97. data/test/common.rb +250 -0
  98. data/test/load_test.rb +79 -0
  99. data/test/load_test_offload.rb +86 -0
  100. metadata +295 -0
@@ -0,0 +1,53 @@
1
+ #
2
+ # LS4
3
+ # Copyright (C) 2010-2011 FURUHASHI Sadayuki
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Affero General Public License as
7
+ # published by the Free Software Foundation, either version 3 of the
8
+ # License, or (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ #
18
+ module LS4
19
+
20
+
21
+ class MemoryUpdateLog < UpdateLogService
22
+ UpdateLogSelector.register(:mem, self)
23
+
24
+ def open(expr)
25
+ @array = []
26
+ end
27
+
28
+ def close
29
+ @array.clear
30
+ end
31
+
32
+ def append(data, &block)
33
+ @array.push(data)
34
+ begin
35
+ block.call
36
+ rescue
37
+ @array.pop
38
+ raise
39
+ end
40
+ end
41
+
42
+ def get(pos)
43
+ data = @array[pos]
44
+ if data
45
+ return nil, pos
46
+ else
47
+ return data, pos+1
48
+ end
49
+ end
50
+ end
51
+
52
+
53
+ end
@@ -0,0 +1,134 @@
1
+ #
2
+ # LS4
3
+ # Copyright (C) 2010-2011 FURUHASHI Sadayuki
4
+ #
5
+ # This program is free software: you can redistribute it and/or modify
6
+ # it under the terms of the GNU Affero General Public License as
7
+ # published by the Free Software Foundation, either version 3 of the
8
+ # License, or (at your option) any later version.
9
+ #
10
+ # This program is distributed in the hope that it will be useful,
11
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ # GNU Affero General Public License for more details.
14
+ #
15
+ # You should have received a copy of the GNU Affero General Public License
16
+ # along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ #
18
+ module LS4
19
+
20
+
21
+ class WeightBus < Bus
22
+ call_slot :get_weight
23
+ call_slot :get_registered_rsids
24
+
25
+ call_slot :set_weight
26
+
27
+ call_slot :set_active_rsids
28
+ call_slot :select_next_rsid
29
+ end
30
+
31
+
32
+ class WeightService < Service
33
+ def initialize
34
+ @winfo = WeightInfo.new
35
+ end
36
+
37
+ def run
38
+ @weight_path = ConfigBus.get_weight_path
39
+ @winfo.open(@weight_path) if @weight_path
40
+ on_change
41
+ end
42
+
43
+ def shutdown
44
+ @winfo.close if @weight_path
45
+ end
46
+
47
+ def get_weight(rsid)
48
+ @winfo.get_weight(rsid)
49
+ end
50
+
51
+ def get_registered_rsids
52
+ @winfo.get_registered_rsids
53
+ end
54
+
55
+ def on_change
56
+ BalanceBus.update_weight
57
+ end
58
+
59
+ ebus_connect :WeightBus,
60
+ :get_weight,
61
+ :get_registered_rsids
62
+
63
+ ebus_connect :ProcessBus,
64
+ :run,
65
+ :shutdown
66
+ end
67
+
68
+
69
+ class WeightManagerService < WeightService
70
+ def initialize
71
+ super
72
+ end
73
+
74
+ def set_weight(rsid, weight)
75
+ if @winfo.set_weight(rsid, weight)
76
+ on_change
77
+ true
78
+ else
79
+ false
80
+ end
81
+ end
82
+
83
+ def reset_weight(rsid)
84
+ if @winfo.reset_weight(rsid)
85
+ on_change
86
+ true
87
+ else
88
+ false
89
+ end
90
+ end
91
+
92
+ def rpc_set_replset_weight(rsid, weight)
93
+ set_weight(rsid, weight)
94
+ end
95
+
96
+ def rpc_reset_replset_weight(rsid)
97
+ reset_weight(rsid)
98
+ end
99
+
100
+ ebus_connect :WeightBus,
101
+ :set_weight
102
+
103
+ ebus_connect :CSRPCBus,
104
+ :set_replset_weight => :rpc_set_replset_weight,
105
+ :reset_replset_weight => :rpc_reset_replset_weight
106
+
107
+ private
108
+ def on_change
109
+ SyncBus.update(SYNC_REPLSET_WEIGHT,
110
+ @winfo, @winfo.get_hash)
111
+ super
112
+ end
113
+ end
114
+
115
+
116
+ class WeightMemberService < WeightService
117
+ def initialize
118
+ super
119
+ end
120
+
121
+ def run
122
+ super
123
+
124
+ SyncBus.register_callback(SYNC_REPLSET_WEIGHT,
125
+ @winfo.get_hash) do |obj|
126
+ @winfo.from_msgpack(obj)
127
+ on_change
128
+ @winfo.get_hash
129
+ end
130
+ end
131
+ end
132
+
133
+
134
+ end
@@ -0,0 +1,5 @@
1
+ module LS4
2
+
3
+ VERSION = '0.9.0'
4
+
5
+ end
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH << File.dirname(__FILE__)
3
+ require 'common'
4
+
5
+ LOOP = (ARGV[0] || ENV["LOOP"] || (ENV["HEAVY"] ? 20 : 3)).to_i
6
+ SIZE = (ARGV[1] || 10).to_i
7
+ NUM = (ARGV[2] || 50).to_i
8
+
9
+ mds = start_mds
10
+ cs = start_cs
11
+ ds0 = start_ds(0, 0)
12
+ ds1 = start_ds(1, 0)
13
+ ds2 = start_ds(2, 1)
14
+ ds3 = start_ds(3, 1)
15
+
16
+ cs.show_nodes
17
+ cs.show_version
18
+
19
+ gw = start_gw
20
+
21
+ pid = Process.pid
22
+ keyf = "#{pid}-key%d"
23
+ _data = "@"*SIZE
24
+
25
+ test "run normally" do
26
+ c = gw.client
27
+
28
+ LOOP.times {|o|
29
+ NUM.times do |i|
30
+ key = keyf % i
31
+ _attrs = {"loop"=>o.to_s, "attr#{i}"=>i.to_s}
32
+
33
+ test 'add' do
34
+ c.call(:add, key, _data, _attrs)
35
+ end
36
+ end
37
+
38
+ NUM.times do |i|
39
+ key = keyf % i
40
+ _attrs = {"loop"=>o.to_s, "attr#{i}"=>i.to_s}
41
+
42
+ test 'get' do
43
+ data, attrs = c.call(:get, key)
44
+ test_equals _data, data, 'get _data == data'
45
+ test_equals _attrs, attrs, 'get _attrs == attrs'
46
+ end
47
+
48
+ test 'get_data' do
49
+ data = c.call(:get_data, key)
50
+ test_equals _data, data, 'get_data _data == data'
51
+ end
52
+
53
+ test 'get_attrs' do
54
+ attrs = c.call(:get_attrs, key)
55
+ test_equals _attrs, attrs, 'get_attrs _attrs == attrs'
56
+ end
57
+ end
58
+
59
+ NUM.times do |i|
60
+ key = keyf % i
61
+
62
+ test "remove" do
63
+ removed = c.call(:remove, key)
64
+ test_equals true, removed, 'removed == true'
65
+ end
66
+ end
67
+
68
+ NUM.times do |i|
69
+ key = keyf % i
70
+
71
+ test 'removed get' do
72
+ data, attrs = c.call(:get, key)
73
+ test_equals nil, data, 'get_data _data is removed'
74
+ test_equals nil, attrs, 'get_attrs _attrs is removed'
75
+ end
76
+ end
77
+ }
78
+ end
79
+
80
+ cs.show_items
81
+ cs.show_stat
82
+
83
+ term_all(ds0, ds1, ds2, ds3, gw, mds, cs)
84
+
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH << File.dirname(__FILE__)
3
+ require 'common'
4
+
5
+ LOOP = (ARGV[0] || ENV["LOOP"] || (ENV["HEAVY"] ? 20 : 3)).to_i
6
+ SIZE = (ARGV[1] || 10).to_i
7
+ NUM = (ARGV[2] || 50).to_i
8
+
9
+ mds = start_mds
10
+ cs = start_cs
11
+ ds0 = start_ds(0, 0)
12
+ ds1 = start_ds(1, 0)
13
+ ds2 = start_ds(2, 1)
14
+ ds3 = start_ds(3, 1)
15
+
16
+ cs.show_nodes
17
+ cs.show_version
18
+
19
+ gw = start_gw
20
+
21
+ pid = Process.pid
22
+ keyf = "#{pid}-key%d"
23
+ _data = "@"*SIZE
24
+
25
+ _data[2,4] = "OVER"
26
+ _data_0_8 = _data[0,8]
27
+ _data_3_20 = _data[3,20]
28
+
29
+ test "run normally" do
30
+ c = gw.client
31
+
32
+ LOOP.times {|o|
33
+ NUM.times do |i|
34
+ key = keyf % i
35
+
36
+ test 'add_data' do
37
+ c.call(:add_data, key, _data)
38
+ end
39
+ end
40
+
41
+ NUM.times do |i|
42
+ key = keyf % i
43
+
44
+ test 'read offset=0 size=8' do
45
+ data = c.call(:read, key, 0, 8)
46
+ test_equals _data_0_8, data, 'read _data[0,8] == data'
47
+ end
48
+
49
+ test 'read offset=3 size=20' do
50
+ data = c.call(:read, key, 3, 20)
51
+ test_equals _data_3_20, data, 'read _data[3,20] == data'
52
+ end
53
+ end
54
+ }
55
+ end
56
+
57
+ cs.show_items
58
+ cs.show_stat
59
+
60
+ term_all(ds0, ds1, ds2, ds3, gw, mds, cs)
61
+
@@ -0,0 +1,69 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH << File.dirname(__FILE__)
3
+ require 'common'
4
+
5
+ LOOP = (ARGV[0] || ENV["LOOP"] || (ENV["HEAVY"] ? 20 : 3)).to_i
6
+ SIZE = (ARGV[1] || 10).to_i
7
+ NUM = (ARGV[2] || 50).to_i
8
+
9
+ mds = start_mds
10
+ cs = start_cs
11
+ ds0 = start_ds(0, 0)
12
+ ds1 = start_ds(1, 0)
13
+ ds2 = start_ds(2, 1)
14
+ ds3 = start_ds(3, 1)
15
+
16
+ cs.show_nodes
17
+ cs.show_version
18
+
19
+ gw = start_gw
20
+
21
+ pid = Process.pid
22
+ keyf = "#{pid}-key%d"
23
+ _data = "@"*SIZE
24
+
25
+ _data[2,4] = "OVER"
26
+ _data_0_8 = _data[0,8]
27
+ _data_3_20 = _data[3,20]
28
+
29
+ test "run normally" do
30
+ c = gw.client
31
+
32
+ LOOP.times {|o|
33
+ okeys = []
34
+
35
+ NUM.times do |i|
36
+ key = keyf % i
37
+
38
+ test 'add_data' do
39
+ okey = c.call(:add_data, key, _data)
40
+ okeys[i] = okey
41
+ end
42
+ end
43
+
44
+ NUM.times do |i|
45
+ okey = okeys[i]
46
+
47
+ test 'getd_data' do
48
+ data = c.call(:getd_data, okey)
49
+ test_equals _data, data, 'getd_data _data == data'
50
+ end
51
+
52
+ test 'readd offset=0 size=8' do
53
+ data = c.call(:readd, okey, 0, 8)
54
+ test_equals _data_0_8, data, 'readd _data[0,8] == data'
55
+ end
56
+
57
+ test 'readd offset=3 size=20' do
58
+ data = c.call(:readd, okey, 3, 20)
59
+ test_equals _data_3_20, data, 'readd _data[3,20] == data'
60
+ end
61
+ end
62
+ }
63
+ end
64
+
65
+ cs.show_items
66
+ cs.show_stat
67
+
68
+ term_all(ds0, ds1, ds2, ds3, gw, mds, cs)
69
+
@@ -0,0 +1,170 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH << File.dirname(__FILE__)
3
+ require 'common'
4
+
5
+ LOOP = (ARGV[0] || ENV["LOOP"] || (ENV["HEAVY"] ? 20 : 3)).to_i
6
+ SIZE = (ARGV[1] || 10).to_i
7
+ NUM = (ARGV[2] || 50).to_i
8
+
9
+ mds = start_mds
10
+ cs = start_cs
11
+ ds0 = start_ds(0, 0)
12
+ ds1 = start_ds(1, 0)
13
+ ds2 = start_ds(2, 1)
14
+ ds3 = start_ds(3, 1)
15
+
16
+ cs.show_nodes
17
+ cs.show_version
18
+
19
+ gw = start_gw
20
+
21
+ pid = Process.pid
22
+ keyf = "#{pid}-key%d"
23
+ _data1 = "1"*SIZE
24
+ _data2 = "2"*SIZE
25
+
26
+ _data1[2,4] = "OVER"
27
+ _data1_0_8 = _data1[0,8]
28
+ _data1_3_20 = _data1[3,20]
29
+
30
+ _data2[2,4] = "OVER"
31
+ _data2_0_8 = _data2[0,8]
32
+ _data2_3_20 = _data2[3,20]
33
+
34
+ test "run normally" do
35
+ c = gw.client
36
+
37
+ start_time = Time.now.utc.to_i
38
+
39
+ LOOP.times {|o|
40
+ okeys1 = []
41
+ okeys2 = []
42
+
43
+ NUM.times do |i|
44
+ key = keyf % i
45
+ _attrs1 = {"loop"=>o.to_s, "attr#{i}"=>i.to_s}
46
+
47
+ test 'add 1' do
48
+ okey = c.call(:add, key, _data1, _attrs1)
49
+ okeys1 << okey
50
+ end
51
+ end
52
+
53
+ sleep 3
54
+
55
+ NUM.times do |i|
56
+ key = keyf % i
57
+ _attrs2 = {"loop"=>"2", "attr2#{i}"=>i.to_s}
58
+
59
+ test 'add 2' do
60
+ okey = c.call(:add, key, _data2, _attrs2)
61
+ okeys2 << okey
62
+ end
63
+ end
64
+
65
+ NUM.times do |i|
66
+ key = keyf % i
67
+ _attrs2 = {"loop"=>"2", "attr2#{i}"=>i.to_s}
68
+
69
+ test 'get head' do
70
+ data, attrs = c.call(:get, key)
71
+ test_equals _data2, data, 'get head _data2 == data'
72
+ test_equals _attrs2, attrs, 'get head _attrs2 == attrs'
73
+ end
74
+
75
+ test 'get_data head' do
76
+ data = c.call(:get_data, key)
77
+ test_equals _data2, data, 'get_data head _data2 == data'
78
+ end
79
+
80
+ test 'get_attrs head' do
81
+ attrs = c.call(:get_attrs, key)
82
+ test_equals _attrs2, attrs, 'get_attrs head _attrs2 == attrs'
83
+ end
84
+
85
+ test 'read head offset=0 size=8' do
86
+ data = c.call(:read, key, 0, 8)
87
+ test_equals _data2_0_8, data, 'read head _data2[0,8] == data'
88
+ end
89
+
90
+ test 'read head offset=3 size=20' do
91
+ data = c.call(:read, key, 3, 20)
92
+ test_equals _data2_3_20, data, 'read head _data2[3,20] == data'
93
+ end
94
+ end
95
+
96
+ NUM.times do |i|
97
+ key = keyf % i
98
+ okey = okeys1[i]
99
+ _attrs1 = {"loop"=>o.to_s, "attr#{i}"=>i.to_s}
100
+
101
+ vtime = okey[1]
102
+
103
+ test 'gett 1' do
104
+ data, attrs = c.call(:gett, vtime, key)
105
+ test_equals _data1, data, 'gett 1 _data1 == data'
106
+ test_equals _attrs1, attrs, 'gett 1 _attrs1 == attrs'
107
+ end
108
+
109
+ test 'gett_data 1' do
110
+ data = c.call(:gett_data, vtime, key)
111
+ test_equals _data1, data, 'gett 1 _data1 == data'
112
+ end
113
+
114
+ test 'gett_attrs 1' do
115
+ attrs = c.call(:gett_attrs, vtime, key)
116
+ test_equals _attrs1, attrs, 'gett 1 _attrs1 == attrs'
117
+ end
118
+
119
+ test 'readt 1 offset=0 size=8' do
120
+ data = c.call(:readt, vtime, key, 0, 8)
121
+ test_equals _data1_0_8, data, 'readt 1 _data1[0,8] == data'
122
+ end
123
+
124
+ test 'readt 1 offset=3 size=20' do
125
+ data = c.call(:readt, vtime, key, 3, 20)
126
+ test_equals _data1_3_20, data, 'readt 1 _data1[3,20] == data'
127
+ end
128
+ end
129
+
130
+ sleep 3
131
+ }
132
+
133
+ NUM.times do |i|
134
+ key = keyf % i
135
+
136
+ vtime = start_time - 1
137
+
138
+ test 'gett 0' do
139
+ data, attrs = c.call(:gett, vtime, key)
140
+ test_equals nil, data, 'gett 0 _data1 is not found'
141
+ test_equals nil, attrs, 'gett 0 _attrs1 is not founds'
142
+ end
143
+
144
+ test 'gett_data 0' do
145
+ data = c.call(:gett_data, vtime, key)
146
+ test_equals nil, data, 'gett 0 _data1 is not found'
147
+ end
148
+
149
+ test 'gett_attrs 0' do
150
+ attrs = c.call(:gett_attrs, vtime, key)
151
+ test_equals nil, attrs, 'gett 0 _attrs1 is not founds'
152
+ end
153
+
154
+ test 'readt 0 offset=0 size=8' do
155
+ data = c.call(:readt, vtime, key, 0, 8)
156
+ test_equals nil, data, 'readt 0 _data1[0,8] is not found'
157
+ end
158
+
159
+ test 'readt 0 offset=3 size=20' do
160
+ data = c.call(:readt, vtime, key, 3, 20)
161
+ test_equals nil, data, 'readt 0 _data1[3,20] is not found'
162
+ end
163
+ end
164
+ end
165
+
166
+ cs.show_items
167
+ cs.show_stat
168
+
169
+ term_all(ds0, ds1, ds2, ds3, gw, mds, cs)
170
+