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,83 @@
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 DataServerURLService < Service
22
+ # %p path encoded key
23
+ # %k url encoded key
24
+ # %v vtime
25
+ # %r rsid
26
+ def initialize
27
+ host = ConfigBus.self_address.host
28
+ if redirect_http_port = ConfigBus.http_redirect_port
29
+ if redirect_http_path_format = ConfigBus.http_redirect_path_format
30
+ @format = "http://#{host}:#{redirect_http_port}/#{redirect_http_path_format}"
31
+ @format << '%p' unless @format.include?('%')
32
+ else
33
+ @format = "http://#{host}:#{redirect_http_port}/%p"
34
+ end
35
+
36
+ elsif self_http_address = ConfigBus.http_gateway_address
37
+ @format = "http://#{host}:#{self_http_address.port}/direct/%r/%v/%k"
38
+
39
+ else
40
+ @format = nil
41
+ end
42
+ end
43
+
44
+ def rpc_url_direct(okey)
45
+ unless @format
46
+ raise "redirect url is not configured"
47
+ end
48
+
49
+ unless StorageBus.exist(okey.vtime, okey.key)
50
+ return nil
51
+ end
52
+
53
+ format_url(okey)
54
+ end
55
+
56
+ ebus_connect :DSRPCBus,
57
+ :url_direct => :rpc_url_direct
58
+
59
+ private
60
+ def format_url(okey)
61
+ url = @format.dup
62
+
63
+ url.gsub!('%v', okey.vtime.to_s)
64
+ url.gsub!('%r', okey.rsid.to_s)
65
+
66
+ path_key_index = url.index('%p')
67
+ url_key_index = url.index('%k')
68
+
69
+ if path_key_index
70
+ path_key = DirectoryStorageService.encode_okey(okey)
71
+ url[path_key_index,2] = path_key
72
+ end
73
+ if url_key_index
74
+ url_key = CGI.escape(okey.key)
75
+ url[url_key_index,2] = url_key
76
+ end
77
+
78
+ url
79
+ end
80
+ end
81
+
82
+
83
+ end
@@ -0,0 +1,375 @@
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 GatewayService < Service
22
+ def rpc_get(key)
23
+ rpc_get_impl(nil, key)
24
+ end
25
+
26
+ def rpc_get_data(key)
27
+ rpc_get_data_impl(nil, key)
28
+ end
29
+
30
+ def rpc_get_attrs(key)
31
+ rpc_get_attrs_impl(nil, key)
32
+ end
33
+
34
+ def rpc_read(key, offset, size)
35
+ rpc_read_impl(nil, key, offset, size)
36
+ end
37
+
38
+
39
+ def rpc_gett(vtime, key)
40
+ rpc_get_impl(vtime, key)
41
+ end
42
+
43
+ def rpc_gett_data(vtime, key)
44
+ rpc_get_data_impl(vtime, key)
45
+ end
46
+
47
+ def rpc_gett_attrs(vtime, key)
48
+ rpc_get_attrs_impl(vtime, key)
49
+ end
50
+
51
+ def rpc_readt(vtime, key, offset, size)
52
+ rpc_read_impl(vtime, key, offset, size)
53
+ end
54
+
55
+
56
+ def rpc_getv(vname, key)
57
+ rpc_get_impl(vname, key)
58
+ end
59
+
60
+ def rpc_getv_data(vname, key)
61
+ rpc_get_data_impl(vname, key)
62
+ end
63
+
64
+ def rpc_getv_attrs(vname, key)
65
+ rpc_get_attrs_impl(vname, key)
66
+ end
67
+
68
+ def rpc_readv(vname, key, offset, size)
69
+ rpc_read_impl(vname, key, offset, size)
70
+ end
71
+
72
+
73
+ def rpc_get_impl(version, key)
74
+ ar = MessagePack::RPC::AsyncResult.new
75
+ CachedMDSBus.get_okey_attrs(key, version) {|(okey,attrs),error|
76
+ if error
77
+ $log.warn("failed to get a key or attributes from MDS: key=#{key.inspect}: #{error}")
78
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
79
+ ar.error(error.to_s)
80
+ elsif okey
81
+ DataClientBus.get(okey, true) {|data,error|
82
+ if error
83
+ $log.warn(error)
84
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
85
+ end
86
+ #data ||= ""
87
+ ar.result([data,attrs])
88
+ }
89
+ else
90
+ ar.result([nil,nil])
91
+ end
92
+ }
93
+ ar
94
+ end
95
+
96
+ def rpc_get_data_impl(version, key)
97
+ ar = MessagePack::RPC::AsyncResult.new
98
+ CachedMDSBus.get_okey(key, version) {|okey,error|
99
+ if error
100
+ $log.warn("failed to get a key from MDS: key=#{key.inspect}: #{error}")
101
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
102
+ ar.error(error.to_s)
103
+ elsif okey
104
+ DataClientBus.get(okey, true) {|data,error|
105
+ if error
106
+ $log.warn(error)
107
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
108
+ end
109
+ #data ||= ""
110
+ ar.result(data, nil)
111
+ }
112
+ else
113
+ ar.result(nil)
114
+ end
115
+ }
116
+ ar
117
+ end
118
+
119
+ def rpc_get_attrs_impl(version, key)
120
+ ar = MessagePack::RPC::AsyncResult.new
121
+ CachedMDSBus.get_attrs(key, version) {|attrs,error|
122
+ if error
123
+ $log.warn("failed to get attributes from MDS: key=#{key.inspect}: #{error}")
124
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
125
+ ar.error(error.to_s)
126
+ elsif attrs
127
+ ar.result(attrs)
128
+ else
129
+ ar.result(nil)
130
+ end
131
+ }
132
+ ar
133
+ end
134
+
135
+ def rpc_read_impl(version, key, offset, size)
136
+ ar = MessagePack::RPC::AsyncResult.new
137
+ CachedMDSBus.get_okey(key, version) {|okey,error|
138
+ if error
139
+ $log.warn("failed to get a key from MDS: key=#{key.inspect}: #{error}")
140
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
141
+ ar.error(error.to_s)
142
+ elsif okey
143
+ DataClientBus.read(okey, offset, size, true) {|data,error|
144
+ if error
145
+ $log.warn("failed to get data from DS: key=#{key.inspect}: #{error} rsid=#{okey.rsid}")
146
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
147
+ end
148
+ #data ||= ""
149
+ ar.result(data)
150
+ }
151
+ else
152
+ ar.result(nil)
153
+ end
154
+ }
155
+ ar
156
+ end
157
+
158
+
159
+ def rpc_getd_data(okey)
160
+ ar = MessagePack::RPC::AsyncResult.new
161
+ DataClientBus.get(okey, true) {|data,error|
162
+ if error
163
+ $log.warn("failed to get data from DS: okey=#{okey}: #{error} rsid=#{okey.rsid}")
164
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
165
+ ar.error(error.to_s)
166
+ else
167
+ #data ||= ""
168
+ ar.result(data)
169
+ end
170
+ }
171
+ ar
172
+ end
173
+
174
+ def rpc_readd(okey, offset, size)
175
+ ar = MessagePack::RPC::AsyncResult.new
176
+ DataClientBus.read(okey, offset, size, true) {|data,error|
177
+ if error
178
+ $log.warn("failed to get data from DS: okey=#{okey}: #{error} rsid=#{okey.rsid}")
179
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
180
+ ar.error(error.to_s)
181
+ else
182
+ #data ||= ""
183
+ ar.result(data)
184
+ end
185
+ }
186
+ ar
187
+ end
188
+
189
+
190
+ def rpc_add(key, data, attrs)
191
+ rpc_add_impl(nil, key, data, attrs)
192
+ end
193
+
194
+ def rpc_add_data(key, data)
195
+ rpc_add_impl(nil, key, data, {})
196
+ end
197
+
198
+
199
+ def rpc_addv(vname, key, data, attrs)
200
+ rpc_add_impl(vname, key, data, attrs)
201
+ end
202
+
203
+ def rpc_addv_data(vname, key, data)
204
+ rpc_add_impl(vname, key, data, {})
205
+ end
206
+
207
+
208
+ def rpc_add_impl(vname, key, data, attrs)
209
+ ar = MessagePack::RPC::AsyncResult.new
210
+ CachedMDSBus.add(key, attrs, vname) {|okey,error|
211
+ if error
212
+ $log.warn("failed to set a key or attributes to MDS: key=#{key.inspect}: #{error}")
213
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
214
+ ar.error(error.to_s)
215
+ else
216
+ DataClientBus.set(okey, data) {|_,error|
217
+ if error
218
+ ar.error(error.to_s)
219
+ else
220
+ ar.result(okey)
221
+ end
222
+ }
223
+ end
224
+ }
225
+ ar
226
+ end
227
+
228
+
229
+ def rpc_update_attrs(key, attrs)
230
+ ar = MessagePack::RPC::AsyncResult.new
231
+ CachedMDSBus.update_attrs(key, attrs) {|okey,error|
232
+ if error
233
+ $log.warn("failed to set a key or attributes to MDS: key=#{key.inspect}: #{error}")
234
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
235
+ ar.error(error.to_s)
236
+ else
237
+ ar.result(okey)
238
+ end
239
+ }
240
+ ar
241
+ end
242
+
243
+
244
+ def rpc_remove(key)
245
+ ar = MessagePack::RPC::AsyncResult.new
246
+ CachedMDSBus.remove(key) {|okey,error|
247
+ if error
248
+ $log.warn("failed remove a key from MDS: key=#{key.inspect}: #{error}")
249
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
250
+ ar.error(error.to_s)
251
+ elsif okey
252
+ ar.result(true)
253
+ else
254
+ ar.result(false)
255
+ end
256
+ }
257
+ ar
258
+ end
259
+
260
+
261
+ def rpc_delete(key)
262
+ rpc_delete_impl(nil, key)
263
+ end
264
+
265
+ def rpc_deletet(vtime, key)
266
+ rpc_delete_impl(vtime, key)
267
+ end
268
+
269
+ def rpc_deletev(vname, key)
270
+ rpc_delete_impl(vname, key)
271
+ end
272
+
273
+ def rpc_delete_impl(version, key)
274
+ ar = MessagePack::RPC::AsyncResult.new
275
+ CachedMDSBus.delete(key, version) {|okey,error|
276
+ if error
277
+ $log.warn("failed delete a key from MDS: key=#{key.inspect}: #{error}")
278
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
279
+ ar.error(error.to_s)
280
+ elsif okey
281
+ DataClientBus.delete(okey) {|deleted,error|
282
+ if error
283
+ ar.error(error.to_s)
284
+ else
285
+ ar.result(deleted)
286
+ end
287
+ }
288
+ else
289
+ ar.result(false)
290
+ end
291
+ }
292
+ ar
293
+ end
294
+
295
+
296
+ def rpc_url(key)
297
+ rpc_url_impl(nil, key)
298
+ end
299
+
300
+ def rpc_urlt(vtime, key)
301
+ rpc_urlt_impl(vtime, key)
302
+ end
303
+
304
+ def rpc_urlv(vname, key)
305
+ rpc_urlv_impl(vname, key)
306
+ end
307
+
308
+ def rpc_url_impl(version, key)
309
+ ar = MessagePack::RPC::AsyncResult.new
310
+ CachedMDSBus.get_okey(key, version) {|okey,error|
311
+ if error
312
+ $log.warn("failed to get a key or attributes from MDS: key=#{key.inspect}: #{error}")
313
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
314
+ ar.error(error.to_s)
315
+ elsif okey
316
+ DataClientBus.url(okey, true) {|url,error|
317
+ if error
318
+ $log.warn(error)
319
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
320
+ end
321
+ ar.result(url)
322
+ }
323
+ else
324
+ ar.result(nil)
325
+ end
326
+ }
327
+ ar
328
+ end
329
+
330
+ def rpc_util_locate(key)
331
+ ar = MessagePack::RPC::AsyncResult.new
332
+ CachedMDSBus.util_locate(key) {|array,error|
333
+ if error
334
+ $log.warn(error)
335
+ $log.debug_backtrace error.backtrace if error.is_a?(Exception)
336
+ ar.error(error.to_s)
337
+ else
338
+ ar.result(array)
339
+ end
340
+ }
341
+ ar
342
+ end
343
+
344
+ ebus_connect :GWRPCBus,
345
+ :get => :rpc_get,
346
+ :get_data => :rpc_get_data,
347
+ :get_attrs => :rpc_get_attrs,
348
+ :read => :rpc_read,
349
+ :gett => :rpc_gett,
350
+ :gett_data => :rpc_gett_data,
351
+ :gett_attrs => :rpc_gett_attrs,
352
+ :readt => :rpc_readt,
353
+ :getv => :rpc_getv,
354
+ :getv_data => :rpc_getv_data,
355
+ :getv_attrs => :rpc_getv_attrs,
356
+ :readv => :rpc_readv,
357
+ :getd_data => :rpc_getd_data,
358
+ :readd => :rpc_readd,
359
+ :add => :rpc_add,
360
+ :add_data => :rpc_add_data,
361
+ :addv => :rpc_addv,
362
+ :addv_data => :rpc_addv_data,
363
+ :update_attrs => :rpc_update_attrs,
364
+ :remove => :rpc_remove,
365
+ :delete => :rpc_delete,
366
+ :deletet => :rpc_deletet,
367
+ :deletev => :rpc_deletev,
368
+ :url => :rpc_url,
369
+ :urlt => :rpc_urlt,
370
+ :urlv => :rpc_urlv,
371
+ :util_locate => :rpc_util_locate
372
+ end
373
+
374
+
375
+ end