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,37 @@
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 Bus < EventBus::Bus
22
+ def self.ebus_call_log(method, args, &block)
23
+ $log.trace { "ebus call #{method}" }
24
+ end
25
+
26
+ def self.ebus_signal_log(methods, args, &block)
27
+ $log.trace { "ebus signal #{methods.join(', ')}" }
28
+ end
29
+
30
+ def self.ebus_signal_error(err)
31
+ $log.warn err
32
+ $log.debug_backtrace err.backtrace
33
+ end
34
+ end
35
+
36
+
37
+ end
@@ -0,0 +1,63 @@
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 ConfigBus < Bus
22
+ call_slot :self_nid
23
+ call_slot :self_name
24
+ call_slot :self_address
25
+ call_slot :self_rsids
26
+ call_slot :self_location
27
+ call_slot :self_node
28
+ call_slot :get_storage_path
29
+ call_slot :get_ulog_path
30
+ call_slot :get_rts_path
31
+ call_slot :get_fault_path
32
+ call_slot :get_membership_path
33
+ call_slot :get_weight_path
34
+ call_slot :get_log_path
35
+
36
+ call_slot :get_initial_mds_uri
37
+ call_slot :get_initial_mds_cache_uri
38
+
39
+ call_slot :http_redirect_port
40
+ call_slot :http_redirect_path_format
41
+
42
+ call_slot :get_cs_address
43
+ call_slot :read_only_version
44
+ call_slot :http_gateway_address
45
+ call_slot :http_gateway_error_template_file
46
+ end
47
+
48
+
49
+ class ConfigService < Service
50
+ attr_accessor :fault_path
51
+ attr_accessor :membership_path
52
+ attr_accessor :weight_path
53
+ attr_accessor :log_path
54
+
55
+ ebus_connect :ConfigBus,
56
+ :get_fault_path => :fault_path,
57
+ :get_membership_path => :membership_path,
58
+ :get_weight_path => :weight_path,
59
+ :get_log_path => :log_path
60
+ end
61
+
62
+
63
+ end
@@ -0,0 +1,33 @@
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 CSConfigService < ConfigService
22
+ #attr_accessor :self_address
23
+
24
+ attr_accessor :mds_uri
25
+ attr_accessor :mds_cache_uri
26
+
27
+ ebus_connect :ConfigBus,
28
+ :get_initial_mds_uri => :mds_uri,
29
+ :get_initial_mds_cache_uri => :mds_cache_uri
30
+ end
31
+
32
+
33
+ end
@@ -0,0 +1,56 @@
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 DSConfigService < GWConfigService
22
+ def run
23
+ @self_node = Node.new(@self_nid, @self_address, @self_name, @self_rsids, @self_location)
24
+ end
25
+
26
+ attr_accessor :self_nid
27
+ attr_accessor :self_name
28
+ attr_accessor :self_address
29
+ attr_accessor :self_rsids
30
+ attr_accessor :storage_path
31
+ attr_accessor :ulog_path
32
+ attr_accessor :rts_path
33
+
34
+ attr_accessor :http_redirect_port
35
+ attr_accessor :http_redirect_path_format
36
+
37
+ attr_reader :self_node
38
+
39
+ ebus_connect :ConfigBus,
40
+ :self_nid,
41
+ :self_name,
42
+ :self_address,
43
+ :self_rsids,
44
+ :self_node,
45
+ :http_redirect_port,
46
+ :http_redirect_path_format,
47
+ :get_storage_path => :storage_path,
48
+ :get_ulog_path => :ulog_path,
49
+ :get_rts_path => :rts_path
50
+
51
+ ebus_connect :ProcessBus,
52
+ :run
53
+ end
54
+
55
+
56
+ end
@@ -0,0 +1,42 @@
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 GWConfigService < ConfigService
22
+ def initialize
23
+ @self_location = ""
24
+ end
25
+
26
+ attr_accessor :self_location
27
+ attr_accessor :cs_address
28
+
29
+ attr_accessor :read_only_version
30
+ attr_accessor :http_gateway_address
31
+ attr_accessor :http_gateway_error_template_file
32
+
33
+ ebus_connect :ConfigBus,
34
+ :self_location,
35
+ :read_only_version,
36
+ :http_gateway_address,
37
+ :http_gateway_error_template_file,
38
+ :get_cs_address => :cs_address
39
+ end
40
+
41
+
42
+ end
@@ -0,0 +1,122 @@
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 DataClientBus < Bus
22
+ # @return
23
+ # found: raw data
24
+ # not found: nil
25
+ call_slot :get
26
+
27
+ # @return
28
+ # found: raw data
29
+ # not found: nil
30
+ call_slot :read
31
+
32
+ # @return nil
33
+ call_slot :set
34
+
35
+ # @return
36
+ # deleted: true
37
+ # not found: nil
38
+ call_slot :delete
39
+
40
+ ## @return nil
41
+ #call_slot :write
42
+
43
+ # @return nil
44
+ #call_slot :resize
45
+
46
+ # @return
47
+ # found: url string
48
+ # not found: nil
49
+ call_slot :url
50
+ end
51
+
52
+
53
+ class DataClientService < Service
54
+ # TODO localhost optimization if DataServer is connected
55
+
56
+ def get(okey, found_expected=false, &cb)
57
+ call_rsid(okey, :get_direct, [okey], found_expected, &cb)
58
+ end
59
+
60
+ def read(okey, offset, size, found_expected=false, &cb)
61
+ call_rsid(okey, :read_direct, [okey, offset, size], found_expected, &cb)
62
+ end
63
+
64
+ def set(okey, data, &cb)
65
+ call_rsid(okey, :set_direct, [okey, data], &cb)
66
+ end
67
+
68
+ def delete(okey, &cb)
69
+ call_rsid(okey, :delete_direct, [okey], &cb)
70
+ end
71
+
72
+ #def write(okey, offset, data, &cb)
73
+ # call_rsid(okey, :write_direct, [okey, offset, data], &cb)
74
+ #end
75
+
76
+ #def resize(okey, size, &cb)
77
+ # call_rsid(okey, :resize_direct, [okey], size)
78
+ #end
79
+
80
+ def url(okey, found_expected, &cb)
81
+ call_rsid(okey, :url_direct, [okey], found_expected, &cb)
82
+ end
83
+
84
+ ebus_connect :DataClientBus,
85
+ :get,
86
+ :read,
87
+ :set,
88
+ :delete,
89
+ :url
90
+
91
+ private
92
+ def call_rsid(okey, method, args, not_nil_required=false, &cb)
93
+ nids = MasterSelectBus.select_master(okey.rsid, okey.key)
94
+ target_nids = nids.reject {|nid|
95
+ MembershipBus.is_fault(nid)
96
+ }
97
+ if target_nids.empty?
98
+ target_nids = nids
99
+ end
100
+ ha_call(target_nids, method, args, not_nil_required, &cb)
101
+ rescue
102
+ cb.call(nil, $!)
103
+ end
104
+
105
+ def ha_call(nids, method, args, not_nil_required=false, &cb)
106
+ nid = nids.shift
107
+ MembershipBus.get_session_nid(nid).callback(method, *args) do |f|
108
+ if f.error || (not_nil_required && f.result == nil)
109
+ if nids.empty?
110
+ cb.call(nil, f.error) rescue nil
111
+ else
112
+ ha_call(nids, method, args, not_nil_required, &cb)
113
+ end
114
+ else
115
+ cb.call(f.result, nil) rescue nil
116
+ end
117
+ end
118
+ end
119
+ end
120
+
121
+
122
+ end
@@ -0,0 +1,168 @@
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 DataServerService < Service
22
+ def initialize
23
+ @self_nid = ConfigBus.self_nid
24
+ @self_rsids = ConfigBus.self_rsids
25
+ @stat_cmd_read = 0
26
+ @stat_cmd_write = 0
27
+ @stat_cmd_delete = 0
28
+ end
29
+
30
+ def rpc_get_direct(okey)
31
+ @stat_cmd_read += 1
32
+ StorageBus.get(okey.vtime, okey.key)
33
+ end
34
+
35
+ def rpc_read_direct(okey, offset, size)
36
+ @stat_cmd_read += 1
37
+ StorageBus.read(okey.vtime, okey.key, offset, size)
38
+ end
39
+
40
+ def rpc_set_direct(okey, data)
41
+ @stat_cmd_write += 1
42
+ d = UpdateLogData.new(okey.vtime, okey.key)
43
+ UpdateLogBus.append(d.dump) do
44
+ StorageBus.set(okey.vtime, okey.key, data)
45
+ end
46
+ nil
47
+ end
48
+
49
+ #def rpc_write_direct(okey, offset, data)
50
+ # @stat_cmd_write += 1
51
+ # d = UpdateLogData.new(okey.vtime, okey.key, offset, data.size)
52
+ # UpdateLogBus.append(d.dump) do
53
+ # StorageBus.write(okey.vtime, okey.key, offset, data)
54
+ # end
55
+ # nil
56
+ #end
57
+
58
+ #def rpc_resize_direct(okey, size)
59
+ # # TODO: stat_cmd_resize?
60
+ # # FIXME size field?
61
+ # d = UpdateLogData.new(okey.vtime, okey.key, nil, size)
62
+ # UpdateLogBus.append(d.dump) do
63
+ # StorageBus.resize(okey.vtime, okey.key, size)
64
+ # end
65
+ # nil
66
+ #end
67
+
68
+ def rpc_exist_direct(okey)
69
+ StorageBus.exist(okey.vtime, okey.key)
70
+ end
71
+
72
+ def rpc_delete_direct(okey)
73
+ @stat_cmd_delete += 1
74
+ d = UpdateLogData.new(okey.vtime, okey.key)
75
+ deleted = nil
76
+ UpdateLogBus.append(d.dump) do
77
+ deleted = StorageBus.delete(okey.vtime, okey.key)
78
+ end
79
+ deleted
80
+ end
81
+
82
+ def rpc_replicate_pull(pos, limit)
83
+ mkeys = []
84
+ msgs = []
85
+ msize = 0
86
+ while true
87
+ raw, npos = UpdateLogBus.get(pos)
88
+ unless raw
89
+ break
90
+ end
91
+ d = UpdateLogData.load(raw)
92
+ # set or delete
93
+ if mkeys.include?(d.key)
94
+ pos = npos
95
+ else
96
+ if d.offset && d.size
97
+ data = StorageBus.read(d.vtime, d.key, d.offset, d.size)
98
+ else
99
+ data = StorageBus.get(d.vtime, d.key)
100
+ mkeys << d.key
101
+ end
102
+ # data may be null => deleted
103
+ if data
104
+ msgs << [d.vtime, d.key, d.offset, data]
105
+ msize += data.size
106
+ else
107
+ # data is deleted
108
+ msgs << [d.vtime, d.key, 0, nil]
109
+ end
110
+ pos = npos
111
+ break if msize > limit
112
+ end
113
+ end
114
+ [pos, msgs]
115
+ end
116
+
117
+ def rpc_replicate_notify(nid)
118
+ session = MembershipBus.get_session_nid(nid)
119
+ SlaveBus.try_replicate(nid, session)
120
+ nil
121
+ end
122
+
123
+ def stat_db_items
124
+ StorageBus.get_items
125
+ end
126
+
127
+ def on_timer
128
+ nids = []
129
+ @self_rsids.each {|rsid|
130
+ begin
131
+ nids.concat MasterSelectBus.select_master_static(rsid)
132
+ rescue
133
+ end
134
+ }
135
+ done = [@self_nid]
136
+ nids.each {|nid|
137
+ if !done.include?(nid) && !MembershipBus.is_fault(nid)
138
+ session = MembershipBus.get_session_nid(nid)
139
+ SlaveBus.try_replicate(nid, session)
140
+ done << nid
141
+ end
142
+ }
143
+ end
144
+
145
+ attr_reader :stat_cmd_read
146
+ attr_reader :stat_cmd_write
147
+ attr_reader :stat_cmd_delete
148
+
149
+ ebus_connect :ProcessBus,
150
+ :on_timer
151
+
152
+ ebus_connect :StatBus,
153
+ :db_items => :stat_db_items,
154
+ :cmd_read => :stat_cmd_read,
155
+ :cmd_write => :stat_cmd_write,
156
+ :cmd_delete => :stat_cmd_delete
157
+
158
+ ebus_connect :DSRPCBus,
159
+ :get_direct => :rpc_get_direct,
160
+ :set_direct => :rpc_set_direct,
161
+ :read_direct => :rpc_read_direct,
162
+ :delete_direct => :rpc_delete_direct,
163
+ :replicate_pull => :rpc_replicate_pull,
164
+ :replicate_notify => :rpc_replicate_notify
165
+ end
166
+
167
+
168
+ end