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,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
+