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