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.
- data/AUTHORS +1 -0
- data/COPYING +661 -0
- data/ChangeLog +9 -0
- data/NOTICE +8 -0
- data/README.rdoc +61 -0
- data/bin/ls4-cs +3 -0
- data/bin/ls4-ds +3 -0
- data/bin/ls4-gw +3 -0
- data/bin/ls4-standalone +3 -0
- data/bin/ls4cmd +3 -0
- data/bin/ls4ctl +3 -0
- data/bin/ls4rpc +3 -0
- data/bin/ls4stat +3 -0
- data/bin/ls4top +3 -0
- data/lib/ls4/command/cmd.rb +241 -0
- data/lib/ls4/command/cs.rb +190 -0
- data/lib/ls4/command/ctl.rb +278 -0
- data/lib/ls4/command/ds.rb +335 -0
- data/lib/ls4/command/gw.rb +256 -0
- data/lib/ls4/command/rpc.rb +172 -0
- data/lib/ls4/command/standalone.rb +318 -0
- data/lib/ls4/command/stat.rb +244 -0
- data/lib/ls4/command/top.rb +291 -0
- data/lib/ls4/default.rb +26 -0
- data/lib/ls4/lib/cclog.rb +220 -0
- data/lib/ls4/lib/ebus.rb +553 -0
- data/lib/ls4/lib/vbcode.rb +228 -0
- data/lib/ls4/logic/fault_detector.rb +212 -0
- data/lib/ls4/logic/membership.rb +253 -0
- data/lib/ls4/logic/node.rb +66 -0
- data/lib/ls4/logic/okey.rb +45 -0
- data/lib/ls4/logic/tsv_data.rb +81 -0
- data/lib/ls4/logic/weight.rb +166 -0
- data/lib/ls4/service/balance.rb +62 -0
- data/lib/ls4/service/base.rb +29 -0
- data/lib/ls4/service/bus.rb +37 -0
- data/lib/ls4/service/config.rb +63 -0
- data/lib/ls4/service/config_cs.rb +33 -0
- data/lib/ls4/service/config_ds.rb +56 -0
- data/lib/ls4/service/config_gw.rb +42 -0
- data/lib/ls4/service/data_client.rb +122 -0
- data/lib/ls4/service/data_server.rb +168 -0
- data/lib/ls4/service/data_server_url.rb +83 -0
- data/lib/ls4/service/gateway.rb +375 -0
- data/lib/ls4/service/gateway_ro.rb +91 -0
- data/lib/ls4/service/gw_http.rb +821 -0
- data/lib/ls4/service/heartbeat.rb +182 -0
- data/lib/ls4/service/log.rb +81 -0
- data/lib/ls4/service/master_select.rb +148 -0
- data/lib/ls4/service/mds.rb +292 -0
- data/lib/ls4/service/mds_cache.rb +294 -0
- data/lib/ls4/service/mds_cache_mem.rb +63 -0
- data/lib/ls4/service/mds_cache_memcached.rb +65 -0
- data/lib/ls4/service/mds_ha.rb +176 -0
- data/lib/ls4/service/mds_memcache.rb +209 -0
- data/lib/ls4/service/mds_tc.rb +508 -0
- data/lib/ls4/service/mds_tt.rb +472 -0
- data/lib/ls4/service/membership.rb +331 -0
- data/lib/ls4/service/process.rb +90 -0
- data/lib/ls4/service/rpc.rb +50 -0
- data/lib/ls4/service/rpc_cs.rb +101 -0
- data/lib/ls4/service/rpc_ds.rb +96 -0
- data/lib/ls4/service/rpc_gw.rb +255 -0
- data/lib/ls4/service/rts.rb +94 -0
- data/lib/ls4/service/rts_file.rb +76 -0
- data/lib/ls4/service/rts_memory.rb +55 -0
- data/lib/ls4/service/slave.rb +132 -0
- data/lib/ls4/service/stat.rb +91 -0
- data/lib/ls4/service/stat_cs.rb +25 -0
- data/lib/ls4/service/stat_ds.rb +40 -0
- data/lib/ls4/service/stat_gw.rb +25 -0
- data/lib/ls4/service/storage.rb +116 -0
- data/lib/ls4/service/storage_dir.rb +201 -0
- data/lib/ls4/service/sync.rb +206 -0
- data/lib/ls4/service/time_check.rb +80 -0
- data/lib/ls4/service/ulog.rb +159 -0
- data/lib/ls4/service/ulog_file.rb +398 -0
- data/lib/ls4/service/ulog_memory.rb +53 -0
- data/lib/ls4/service/weight.rb +134 -0
- data/lib/ls4/version.rb +5 -0
- data/test/01_add_get_remove.rt +84 -0
- data/test/02_read.rt +61 -0
- data/test/03_getd_readd.rt +69 -0
- data/test/04_version_time.rt +170 -0
- data/test/05_version_name.rt +161 -0
- data/test/06_http_get_set_remove_1.rt +119 -0
- data/test/07_http_get_set_remove_2.rt +116 -0
- data/test/08_read_only_time.rt +177 -0
- data/test/09_read_only_name.rt +173 -0
- data/test/10_http_get_set_remove_3.rt +73 -0
- data/test/11_mds_cache_memcached.rt +88 -0
- data/test/12_mds_cache_local_memory.rt +86 -0
- data/test/13_memcache_mds.rt +84 -0
- data/test/14_delete.rt +63 -0
- data/test/15_standalone.rt +71 -0
- data/test/chukan.rb +516 -0
- data/test/common.rb +250 -0
- data/test/load_test.rb +79 -0
- data/test/load_test_offload.rb +86 -0
- 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
|