ls4 0.9.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.
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
+