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,331 @@
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 MembershipBus < Bus
22
+ call_slot :get_session_nid
23
+ call_slot :get_node
24
+ call_slot :get_all_nodes
25
+ call_slot :get_active_rsids
26
+ call_slot :is_fault
27
+
28
+ call_slot :reset_fault_detector
29
+
30
+ call_slot :try_register_node
31
+ end
32
+
33
+
34
+ class MembershipService < Service
35
+ def initialize
36
+ @membership = Membership.new
37
+ @fault_list = FaultList.new
38
+ end
39
+
40
+ def run
41
+ @fault_path = ConfigBus.get_fault_path
42
+ @membership_path = ConfigBus.get_membership_path
43
+ @fault_list.open(@fault_path) if @fault_path
44
+ @membership.open(@membership_path) if @membership_path
45
+ on_membership_change
46
+ on_fault_list_change
47
+ end
48
+
49
+ def shutdown
50
+ @fault_list.close if @fault_path
51
+ @membership.close if @membership_path
52
+ end
53
+
54
+ def get_node(nid)
55
+ @membership.get_node(nid)
56
+ end
57
+
58
+ def get_all_nodes
59
+ @membership.get_all_nodes
60
+ end
61
+
62
+ def get_active_rsids
63
+ @membership.get_active_rsids
64
+ end
65
+
66
+ def is_fault(nid)
67
+ @fault_list.include?(nid)
68
+ end
69
+
70
+ def get_session_nid(nid)
71
+ ProcessBus.get_session(get_node(nid).address)
72
+ end
73
+
74
+ def stat_membership_info
75
+ @membership
76
+ end
77
+
78
+ def stat_fault_info
79
+ @fault_list
80
+ end
81
+
82
+ def on_membership_change
83
+ BalanceBus.update_weight
84
+ MasterSelectBus.update_nodes
85
+ end
86
+
87
+ def on_fault_list_change
88
+ # TODO update balance bus?
89
+ end
90
+
91
+ def stat_replset_info
92
+ rsid_nids = {}
93
+ MembershipBus.get_all_nodes.each {|node|
94
+ node.rsids.each {|rsid|
95
+ (rsid_nids[rsid] ||= []) << node.nid
96
+ }
97
+ }
98
+
99
+ rsids = WeightBus.get_registered_rsids + MembershipBus.get_active_rsids
100
+ rsids.uniq!
101
+
102
+ result = {}
103
+ rsids.each {|rsid|
104
+ weight = WeightBus.get_weight(rsid)
105
+ nids = rsid_nids[rsid] || []
106
+ result[rsid] = [nids, weight]
107
+ }
108
+
109
+ result
110
+ end
111
+
112
+ ebus_connect :ProcessBus,
113
+ :run,
114
+ :shutdown
115
+
116
+ ebus_connect :MembershipBus,
117
+ :get_node,
118
+ :get_all_nodes,
119
+ :get_active_rsids,
120
+ :is_fault,
121
+ :get_session_nid
122
+
123
+ ebus_connect :StatBus,
124
+ :membership_info => :stat_membership_info,
125
+ :fault_info => :stat_fault_info,
126
+ :replset_info => :stat_replset_info
127
+ end
128
+
129
+
130
+ class MembershipManagerService < MembershipService
131
+ def initialize
132
+ super
133
+ @fault_detector = FaultDetector.new
134
+ end
135
+
136
+ def run
137
+ super
138
+ @fault_detector.set_init(
139
+ @membership.get_all_nids,
140
+ @fault_list.get_list)
141
+ on_membership_change
142
+ on_fault_detector_change
143
+ end
144
+
145
+ def rpc_add_node(nid, address, name, rsids, location)
146
+ if @membership.include?(nid)
147
+ if @membership.update_node_info(nid, address, name, rsids, location)
148
+ $log.info "update node: nid=#{nid} name=#{name.dump} address=#{address} rsids=#{rsids.join(',')}"
149
+ end
150
+ else
151
+ @membership.add_node(nid, address, name, rsids, location)
152
+ $log.info "add node: nid=#{nid} name=#{name.dump} address=#{address} rsids=#{rsids.join(',')}"
153
+ end
154
+ @fault_detector.set_nid(nid)
155
+ on_membership_change
156
+ on_fault_detector_change
157
+ true
158
+ end
159
+
160
+ def rpc_remove_node(nid)
161
+ $log.info "remove node: nid=#{nid}"
162
+ @membership.remove_node(nid)
163
+ @fault_detector.delete_nid(nid)
164
+ on_membership_change
165
+ on_fault_detector_change
166
+ true
167
+ end
168
+
169
+ def rpc_update_node_info(nid, address, name, rsids)
170
+ @membership.update_node_info(nid, address, name, rsids)
171
+ on_membership_change
172
+ true
173
+ end
174
+
175
+ def rpc_recover_node(nid)
176
+ if @fault_detector.reset(nid)
177
+ on_fault_detector_change
178
+ true
179
+ else
180
+ nil
181
+ end
182
+ end
183
+
184
+ def reset_fault_detector(nid)
185
+ term = @fault_detector.update(nid)
186
+ term
187
+ end
188
+
189
+ def on_timer
190
+ fault_nids = @fault_detector.forward_timer
191
+ if !fault_nids.empty?
192
+ $log.info "fault detected: #{fault_nids.join(', ')}"
193
+ on_fault_detector_change
194
+ end
195
+ end
196
+
197
+ ebus_connect :ProcessBus,
198
+ :run,
199
+ :on_timer
200
+
201
+ ebus_connect :MembershipBus,
202
+ :reset_fault_detector
203
+
204
+ ebus_connect :CSRPCBus,
205
+ :add_node => :rpc_add_node,
206
+ :remove_node => :rpc_remove_node,
207
+ :update_node_info => :rpc_update_node_info,
208
+ :recover_node => :rpc_recover_node
209
+
210
+ def on_membership_change
211
+ SyncBus.update(SYNC_MEMBERSHIP,
212
+ @membership, @membership.get_hash)
213
+ super
214
+ end
215
+
216
+ def on_fault_detector_change
217
+ @fault_list.update(@fault_detector.get_fault_nids)
218
+ on_fault_list_change
219
+ end
220
+
221
+ def on_fault_list_change
222
+ SyncBus.update(SYNC_FAULT_LIST,
223
+ @fault_list, @fault_list.get_hash)
224
+ super
225
+ end
226
+ end
227
+
228
+
229
+ class MembershipClientService < MembershipService
230
+ def initialize
231
+ super
232
+ end
233
+
234
+ def run
235
+ super
236
+
237
+ SyncBus.register_callback(SYNC_MEMBERSHIP,
238
+ @membership.get_hash) do |obj|
239
+ @membership.from_msgpack(obj)
240
+ on_membership_change
241
+ @membership.get_hash
242
+ end
243
+
244
+ SyncBus.register_callback(SYNC_FAULT_LIST,
245
+ @fault_list.get_hash) do |obj|
246
+ @fault_list.from_msgpack(obj)
247
+ on_fault_list_change
248
+ @fault_list.get_hash
249
+ end
250
+ end
251
+ end
252
+
253
+
254
+ class MembershipMemberService < MembershipClientService
255
+ def initialize
256
+ super
257
+ @self_nid = ConfigBus.self_nid
258
+ @self_address = ConfigBus.self_address
259
+ @self_name = ConfigBus.self_name
260
+ @self_rsids = ConfigBus.self_rsids
261
+ @self_location = ConfigBus.self_location
262
+ end
263
+
264
+ def try_register_node
265
+ begin
266
+ node = @membership.get_node(@self_nid)
267
+ rescue
268
+ return register_self
269
+ end
270
+
271
+ if node.address != @self_address
272
+ return register_self
273
+ end
274
+
275
+ if node.name != @self_name
276
+ return register_self
277
+ end
278
+
279
+ if node.rsids != @self_rsids
280
+ return register_self
281
+ end
282
+
283
+ if node.location != @self_location
284
+ return register_self
285
+ end
286
+
287
+ if @fault_list.include?(@self_nid)
288
+ return register_self
289
+ end
290
+
291
+ nil
292
+ end
293
+
294
+ def register_self_blocking!
295
+ do_register_self.join
296
+ end
297
+
298
+ ebus_connect :MembershipBus,
299
+ :try_register_node
300
+
301
+ private
302
+ def get_cs_session
303
+ ProcessBus.get_session(ConfigBus.get_cs_address)
304
+ end
305
+
306
+ def do_register_self
307
+ get_cs_session.callback(:add_node, @self_nid, @self_address, @self_name, @self_rsids, @self_location) do |future|
308
+ ack_register_self(future)
309
+ end
310
+ end
311
+
312
+ def register_self
313
+ do_register_self
314
+ true
315
+ end
316
+
317
+ def ack_register_self(future)
318
+ future.get
319
+ rescue
320
+ $log.error "add_node error: #{future.error}"
321
+ end
322
+ end
323
+
324
+
325
+ class StandaloneMembershipService < MembershipManagerService
326
+ def on_timer
327
+ end
328
+ end
329
+
330
+
331
+ end
@@ -0,0 +1,90 @@
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 ProcessBus < Bus
22
+ signal_slot :run
23
+ signal_slot :shutdown
24
+ signal_slot :on_timer
25
+ signal_slot :on_sighup
26
+ call_slot :start_timer
27
+ call_slot :submit
28
+ call_slot :get_session
29
+ call_slot :serve_rpc
30
+ end
31
+
32
+
33
+ class ProcessService < Service
34
+ def initialize
35
+ @net = MessagePack::RPC::Server.new
36
+ submit_test
37
+ end
38
+
39
+ def serve_rpc(dp)
40
+ @net.serve(dp)
41
+ @net
42
+ end
43
+
44
+ def run
45
+ @timer = start_timer(1.0, true) do
46
+ ProcessBus.on_timer
47
+ end
48
+ Signal.trap(:HUP) {
49
+ ProcessBus.on_sighup
50
+ }
51
+ end
52
+
53
+ def submit(task=nil, &block)
54
+ task ||= block
55
+ @net.submit(task)
56
+ nil
57
+ end
58
+
59
+ def shutdown
60
+ @net.loop.detach(@timer) if @timer
61
+ end
62
+
63
+ def start_timer(interval, periodic, &block)
64
+ @net.start_timer(interval, periodic, &block)
65
+ end
66
+
67
+ def get_session(addr)
68
+ s = @net.get_session(addr)
69
+ s.timeout = 10 # FIXME timeout
70
+ s
71
+ end
72
+
73
+ ebus_connect :ProcessBus,
74
+ :run,
75
+ :shutdown,
76
+ :serve_rpc,
77
+ :start_timer,
78
+ :submit,
79
+ :get_session
80
+
81
+ private
82
+ def submit_test
83
+ @net.submit {
84
+ "ok"
85
+ }
86
+ end
87
+ end
88
+
89
+
90
+ end
@@ -0,0 +1,50 @@
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 RPCBus < Bus
22
+ call_slot :stat
23
+ end
24
+
25
+
26
+ class RPCService < Service
27
+ if "".respond_to?(:encoding)
28
+ def force_binary!(str)
29
+ str.force_encoding('ASCII-8BIT')
30
+ end
31
+ else
32
+ def force_binary!(str)
33
+ str
34
+ end
35
+ end
36
+
37
+ protected
38
+ def dispatch(bus, name, *args)
39
+ $log.trace { "rpc: #{name} #{args}" }
40
+ bus.__send__(name, *args)
41
+ rescue => e
42
+ msg = ["rpc error on #{name}: #{e}"]
43
+ e.backtrace.each {|bt| msg << " #{bt}" }
44
+ $log.error msg.join("\n")
45
+ raise
46
+ end
47
+ end
48
+
49
+
50
+ end