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,173 @@
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
+ rogw = []
22
+
23
+ pid = Process.pid
24
+ keyf = "#{pid}-key%d"
25
+ _data1 = "1"*SIZE
26
+ _data2 = "2"*SIZE
27
+
28
+ _data1[2,4] = "OVER"
29
+ _data1_0_8 = _data1[0,8]
30
+ _data1_3_20 = _data1[3,20]
31
+
32
+ _data2[2,4] = "OVER"
33
+ _data2_0_8 = _data2[0,8]
34
+ _data2_3_20 = _data2[3,20]
35
+
36
+ test "run normally" do
37
+ c = gw.client
38
+
39
+ vname1 = "ver0-1"
40
+ vname2 = "ver0-2"
41
+ vname0 = "ver0-0"
42
+
43
+ gw0 = start_gw(rogw.size+1, "--read-only-name #{vname0}")
44
+ rogw << gw0
45
+
46
+ gw1 = start_gw(rogw.size+1, "--read-only-name #{vname1}")
47
+ rogw << gw1
48
+
49
+ gw2 = start_gw(rogw.size+1, "--read-only-name #{vname2}")
50
+ rogw << gw2
51
+
52
+ NUM.times do |i|
53
+ key = keyf % i
54
+ _attrs1 = {"loop"=>"0", "attr#{i}"=>i.to_s}
55
+
56
+ test 'addv 1' do
57
+ c.call(:addv, vname1, key, _data1, _attrs1)
58
+ end
59
+ end
60
+
61
+ NUM.times do |i|
62
+ key = keyf % i
63
+ _attrs2 = {"loop"=>"2", "attr2#{i}"=>i.to_s}
64
+
65
+ test 'addv 2' do
66
+ c.call(:addv, vname2, key, _data2, _attrs2)
67
+ end
68
+ end
69
+
70
+ c2 = gw2.client
71
+
72
+ NUM.times do |i|
73
+ key = keyf % i
74
+ _attrs2 = {"loop"=>"2", "attr2#{i}"=>i.to_s}
75
+
76
+ test 'get 2' do
77
+ data, attrs = c2.call(:get, key)
78
+ test_equals _data2, data, 'get 2 _data2 == data'
79
+ test_equals _attrs2, attrs, 'get 2 _attrs2 == attrs'
80
+ end
81
+
82
+ test 'get_data 2' do
83
+ data = c2.call(:get_data, key)
84
+ test_equals _data2, data, 'get_data 2 _data2 == data'
85
+ end
86
+
87
+ test 'get_attrs 2' do
88
+ attrs = c2.call(:get_attrs, key)
89
+ test_equals _attrs2, attrs, 'get_attrs 2 _attrs2 == attrs'
90
+ end
91
+
92
+ test 'read 2 offset=0 size=8' do
93
+ data = c2.call(:read, key, 0, 8)
94
+ test_equals _data2_0_8, data, 'read 2 _data2[0,8] == data'
95
+ end
96
+
97
+ test 'read 2 offset=3 size=20' do
98
+ data = c2.call(:read, key, 3, 20)
99
+ test_equals _data2_3_20, data, 'read 2 _data2[3,20] == data'
100
+ end
101
+ end
102
+
103
+ c1 = gw1.client
104
+
105
+ NUM.times do |i|
106
+ key = keyf % i
107
+ _attrs1 = {"loop"=>"0", "attr#{i}"=>i.to_s}
108
+
109
+ test 'get 1' do
110
+ data, attrs = c1.call(:get, key)
111
+ test_equals _data1, data, 'get 1 _data1 == data'
112
+ test_equals _attrs1, attrs, 'get 1 _attrs1 == attrs'
113
+ end
114
+
115
+ test 'get_data 1' do
116
+ data = c1.call(:get_data, key)
117
+ test_equals _data1, data, 'get 1 _data1 == data'
118
+ end
119
+
120
+ test 'get_attrs 1' do
121
+ attrs = c1.call(:get_attrs, key)
122
+ test_equals _attrs1, attrs, 'get 1 _attrs1 == attrs'
123
+ end
124
+
125
+ test 'read 1 offset=0 size=8' do
126
+ data = c1.call(:read, key, 0, 8)
127
+ test_equals _data1_0_8, data, 'read 1 _data1[0,8] == data'
128
+ end
129
+
130
+ test 'read 1 offset=3 size=20' do
131
+ data = c1.call(:read, key, 3, 20)
132
+ test_equals _data1_3_20, data, 'read 1 _data1[3,20] == data'
133
+ end
134
+ end
135
+
136
+ c0 = gw0.client
137
+
138
+ NUM.times do |i|
139
+ key = keyf % i
140
+
141
+ test 'get 0' do
142
+ data, attrs = c0.call(:get, key)
143
+ test_equals nil, data, 'get 0 _data1 is not found'
144
+ test_equals nil, attrs, 'get 0 _attrs1 is not founds'
145
+ end
146
+
147
+ test 'get_data 0' do
148
+ data = c0.call(:get_data, key)
149
+ test_equals nil, data, 'get 0 _data1 is not found'
150
+ end
151
+
152
+ test 'get_attrs 0' do
153
+ attrs = c0.call(:get_attrs, key)
154
+ test_equals nil, attrs, 'get 0 _attrs1 is not founds'
155
+ end
156
+
157
+ test 'read 0 offset=0 size=8' do
158
+ data = c0.call(:read, key, 0, 8)
159
+ test_equals nil, data, 'read 0 _data1[0,8] is not found'
160
+ end
161
+
162
+ test 'read 0 offset=3 size=20' do
163
+ data = c0.call(:read, key, 3, 20)
164
+ test_equals nil, data, 'read 0 _data1[3,20] is not found'
165
+ end
166
+ end
167
+ end
168
+
169
+ cs.show_items
170
+ cs.show_stat
171
+
172
+ term_all(ds0, ds1, ds2, ds3, gw, mds, cs, *rogw)
173
+
@@ -0,0 +1,73 @@
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
+ LOOP.times {|o|
27
+ NUM.times do |i|
28
+ key = keyf % i
29
+ _attrs = {"loop"=>o.to_s, "attr#{i}"=>i.to_s}
30
+
31
+ test 'add_data /api' do
32
+ gw.http_client {|http|
33
+ req = Net::HTTP::Post.new('/api/add')
34
+ req.set_form_data({:key=>key, :data=>_data})
35
+ res = http.request(req)
36
+ test_equals "200", res.code, "add_data 200 OK"
37
+ }
38
+ end
39
+
40
+ test 'update_attrs /api' do
41
+ gw.http_client {|http|
42
+ req = Net::HTTP::Post.new('/api/update_attrs')
43
+ req.set_form_data({:key=>key, :attrs=>JSON.dump(_attrs)})
44
+ res = http.request(req)
45
+ test_equals "200", res.code, "update_attrs 200 OK"
46
+ }
47
+ end
48
+ end
49
+
50
+ NUM.times do |i|
51
+ key = keyf % i
52
+ _attrs = {"loop"=>o.to_s, "attr#{i}"=>i.to_s}
53
+
54
+ test "get_attrs /api msgpack" do
55
+ attrs = nil
56
+
57
+ gw.http_client {|http|
58
+ res = http.get("/api/get_attrs?key=#{key}&format=msgpack")
59
+ test_equals "200", res.code, "get_attrs msgpack 200 OK"
60
+ attrs = MessagePack.unpack(res.body)
61
+ }
62
+
63
+ test_equals _attrs, attrs, 'get_attrs msgpack _attrs == attrs'
64
+ end
65
+ end
66
+ }
67
+ end
68
+
69
+ cs.show_items
70
+ cs.show_stat
71
+
72
+ term_all(ds0, ds1, ds2, ds3, gw, mds, cs)
73
+
@@ -0,0 +1,88 @@
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
+ mc1 = start_memcached(50100)
10
+ mc2 = start_memcached(50101)
11
+ mds = start_mds
12
+ cs = start_cs("--mds-cache mc:127.0.0.1:50100,127.0.0.1:50101")
13
+ ds0 = start_ds(0, 0)
14
+ ds1 = start_ds(1, 0)
15
+ ds2 = start_ds(2, 1)
16
+ ds3 = start_ds(3, 1)
17
+
18
+ cs.show_nodes
19
+ cs.show_version
20
+
21
+ gw = start_gw
22
+
23
+ pid = Process.pid
24
+ keyf = "#{pid}-key%d"
25
+ _data = "@"*SIZE
26
+
27
+ test "run normally" do
28
+ c = gw.client
29
+
30
+ LOOP.times {|o|
31
+ NUM.times do |i|
32
+ key = keyf % i
33
+ _attrs = {"loop"=>o.to_s, "attr#{i}"=>i.to_s}
34
+
35
+ test 'add' do
36
+ c.call(:add, key, _data, _attrs)
37
+ end
38
+ end
39
+
40
+ 3.times do
41
+ NUM.times do |i|
42
+ key = keyf % i
43
+ _attrs = {"loop"=>o.to_s, "attr#{i}"=>i.to_s}
44
+
45
+ test 'get' do
46
+ data, attrs = c.call(:get, key)
47
+ test_equals _data, data, 'get _data == data'
48
+ test_equals _attrs, attrs, 'get _attrs == attrs'
49
+ end
50
+
51
+ test 'get_data' do
52
+ data = c.call(:get_data, key)
53
+ test_equals _data, data, 'get_data _data == data'
54
+ end
55
+
56
+ test 'get_attrs' do
57
+ attrs = c.call(:get_attrs, key)
58
+ test_equals _attrs, attrs, 'get_attrs _attrs == attrs'
59
+ end
60
+ end
61
+ end
62
+
63
+ NUM.times do |i|
64
+ key = keyf % i
65
+
66
+ test "remove" do
67
+ removed = c.call(:remove, key)
68
+ test_equals true, removed, 'removed == true'
69
+ end
70
+ end
71
+
72
+ NUM.times do |i|
73
+ key = keyf % i
74
+
75
+ test 'removed get' do
76
+ data, attrs = c.call(:get, key)
77
+ test_equals nil, data, 'get_data _data is removed'
78
+ test_equals nil, attrs, 'get_attrs _attrs is removed'
79
+ end
80
+ end
81
+ }
82
+ end
83
+
84
+ cs.show_items
85
+ cs.show_stat
86
+
87
+ term_all(ds0, ds1, ds2, ds3, gw, mds, cs, mc1, mc2)
88
+
@@ -0,0 +1,86 @@
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("--mds-cache local:64m")
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
+ 3.times do
39
+ NUM.times do |i|
40
+ key = keyf % i
41
+ _attrs = {"loop"=>o.to_s, "attr#{i}"=>i.to_s}
42
+
43
+ test 'get' do
44
+ data, attrs = c.call(:get, key)
45
+ test_equals _data, data, 'get _data == data'
46
+ test_equals _attrs, attrs, 'get _attrs == attrs'
47
+ end
48
+
49
+ test 'get_data' do
50
+ data = c.call(:get_data, key)
51
+ test_equals _data, data, 'get_data _data == data'
52
+ end
53
+
54
+ test 'get_attrs' do
55
+ attrs = c.call(:get_attrs, key)
56
+ test_equals _attrs, attrs, 'get_attrs _attrs == attrs'
57
+ end
58
+ end
59
+ end
60
+
61
+ NUM.times do |i|
62
+ key = keyf % i
63
+
64
+ test "remove" do
65
+ removed = c.call(:remove, key)
66
+ test_equals true, removed, 'removed == true'
67
+ end
68
+ end
69
+
70
+ NUM.times do |i|
71
+ key = keyf % i
72
+
73
+ test 'removed get' do
74
+ data, attrs = c.call(:get, key)
75
+ test_equals nil, data, 'get_data _data is removed'
76
+ test_equals nil, attrs, 'get_attrs _attrs is removed'
77
+ end
78
+ end
79
+ }
80
+ end
81
+
82
+ cs.show_items
83
+ cs.show_stat
84
+
85
+ term_all(ds0, ds1, ds2, ds3, gw, mds, cs)
86
+
@@ -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_memcached(MDS_PORT)
10
+ cs = start_cs("--mds mc:127.0.0.1:#{MDS_PORT}")
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
+