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,278 @@
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
+ require 'msgpack/rpc'
19
+ require 'pp'
20
+
21
+ def usage
22
+ puts "Usage: #{File.basename($0)} <cs address[:port]> <command> [options]"
23
+ puts "command:"
24
+ puts " nodes show list of nodes"
25
+ puts " stat show statistics of nodes"
26
+ puts " remove_node <nid> remove a node from a replica-set"
27
+ puts " locate <key> show which servers store the key"
28
+ puts " weight show list of replica-sets"
29
+ puts " set_weight <rsid> <weight> change a weight of a replica-set"
30
+ puts " mds show MDS uri"
31
+ puts " set_mds <expr> set MDS uri"
32
+ puts " mds_cache show MDS cache uri"
33
+ puts " set_mds_cache <expr> set MDS cache uri"
34
+ puts " items show stored number of objects"
35
+ puts " version show software version of nodes"
36
+ exit 1
37
+ end
38
+
39
+ if ARGV.length < 2
40
+ usage
41
+ end
42
+
43
+ $net = MessagePack::RPC::SessionPool.new
44
+ addr = ARGV.shift
45
+ host, port = addr.split(':', 2)
46
+ port = port.to_i
47
+ port = 18700 if port == 0
48
+ $addr = [host,port]#Address.new(host, port)
49
+
50
+ cmd = ARGV.shift
51
+
52
+ def cmd_args(n)
53
+ if n < 0
54
+ return ARGV
55
+ end
56
+ usage if ARGV.length != n
57
+ ARGV.map! {|ar| ar == '-' ? $stdin.read : ar }
58
+ if n == 1
59
+ ARGV[0]
60
+ else
61
+ ARGV
62
+ end
63
+ end
64
+
65
+ def call(klass, *args)
66
+ #start = Time.now
67
+
68
+ s = $net.get_session(*$addr)
69
+ s.timeout = 20
70
+ result = s.call(*args)
71
+ if klass && result
72
+ result = klass.new.from_msgpack(result)
73
+ end
74
+
75
+ #finish = Time.now
76
+ #puts "#{finish - start} sec."
77
+
78
+ result
79
+ end
80
+
81
+ Node = Struct.new('Node', :nid, :address, :name, :rsids, :location)
82
+
83
+ def get_nodes
84
+ call(nil, :stat, 'nodes').map {|nid,address,name,rsids,location|
85
+ address = MessagePack::RPC::Address.load(address)
86
+ Node.new(nid, address, name, rsids, location)
87
+ }.sort_by {|node|
88
+ node.nid
89
+ }
90
+ end
91
+
92
+ def get_node_map
93
+ map = {}
94
+ call(nil, :stat, 'nodes').each {|nid,address,name,rsids|
95
+ address = MessagePack::RPC::Address.load(address)
96
+ map[nid] = [address, name, rsids]
97
+ }
98
+ map
99
+ end
100
+
101
+ def each_node(&block)
102
+ get_nodes.map {|node|
103
+ result = yield($net.get_session(node.address), node)
104
+ [node, result]
105
+ }
106
+ end
107
+
108
+ case cmd
109
+ when 'nodes'
110
+ cmd_args(0)
111
+
112
+ fault_nids = call(nil, :stat, 'fault')
113
+
114
+ NODES_FORMAT = "%3s %15s %23s %23s %7s %10s"
115
+ puts NODES_FORMAT % %w[nid name address location rsid state]
116
+
117
+ each_node {|s,node|
118
+ rsids = node.rsids.sort.join(',')
119
+ state = fault_nids.include?(node.nid) ? 'FAULT' : 'active'
120
+ puts NODES_FORMAT % [node.nid, node.name, node.address, node.location, rsids, state]
121
+ }
122
+
123
+ when 'remove_node'
124
+ nid_s = cmd_args(1)
125
+ nid = nid_s.to_i
126
+ if nid.to_s != nid_s
127
+ raise "invalid nid: #{nid}"
128
+ end
129
+ pp call(nil, :remove_node, nid)
130
+
131
+ when 'weight'
132
+ cmd_args(0)
133
+ REPLSET_FORMAT = "%4s %8s %10s %s"
134
+ puts REPLSET_FORMAT % %w[rsid weight nids names]
135
+ node_map = get_node_map
136
+ rsid_replset = call(nil, :stat, 'replset').sort_by {|rsid,(nids,weight)|
137
+ if nids.empty?
138
+ rsid += (2<<16)
139
+ end
140
+ rsid
141
+ }
142
+ rsid_replset.each {|rsid,(nids,weight)|
143
+ names = nids.map {|nid| node_map[nid][1] }.join(',')
144
+ nids = nids.sort.join(',')
145
+ puts REPLSET_FORMAT % [rsid, weight, nids, names]
146
+ }
147
+
148
+ when 'set_weight'
149
+ rsid_s, weight_s = cmd_args(2)
150
+ rsid = rsid_s.to_i
151
+ weight = weight_s.to_i
152
+ if rsid.to_s != rsid_s
153
+ raise "invalid rsid: #{rsid}"
154
+ end
155
+ if weight.to_s != weight_s
156
+ raise "invalid weight: #{weight}"
157
+ end
158
+ pp call(nil, :set_replset_weight, rsid, weight)
159
+
160
+ when 'reset_weight'
161
+ rsid_s = cmd_args(1)
162
+ rsid = rsid_s.to_i
163
+ if rsid.to_s != rsid_s
164
+ raise "invalid rsid: #{rsid}"
165
+ end
166
+ pp call(nil, :reset_replset_weight, rsid)
167
+
168
+ when 'mds'
169
+ cmd_args(0)
170
+ uri = call(nil, :get_mds_uri)
171
+ puts uri
172
+
173
+ when 'set_mds'
174
+ uri = cmd_args(1)
175
+ pp call(nil, :set_mds_uri, uri)
176
+
177
+ when 'mds_cache'
178
+ cmd_args(0)
179
+ uri = call(nil, :get_mds_cache_uri)
180
+ if !uri || uri.empty?
181
+ puts "null"
182
+ else
183
+ puts uri
184
+ end
185
+
186
+ when 'set_mds_cache'
187
+ uri = cmd_args(1)
188
+ pp call(nil, :set_mds_cache_uri, uri)
189
+
190
+ when 'stat', 'status'
191
+ STAT_FORMAT = "%4s %15s %10s %10s %10s %10s %30s"
192
+ puts STAT_FORMAT % %w[nid name uptime #read #write #delete time]
193
+ each_node {|s,node|
194
+ f_uptime = s.call_async(:stat, 'uptime') rescue nil
195
+ f_read = s.call_async(:stat, 'cmd_read') rescue nil
196
+ f_write = s.call_async(:stat, 'cmd_write') rescue nil
197
+ f_delete = s.call_async(:stat, 'cmd_delete') rescue nil
198
+ f_time = s.call_async(:stat, 'time') rescue nil
199
+ [f_uptime, f_read, f_write, f_delete, f_time]
200
+ }.each {|node,(f_uptime,f_read,f_write,f_delete,f_time)|
201
+ uptime = f_uptime.get rescue nil
202
+ read = f_read.get rescue nil
203
+ write = f_write.get rescue nil
204
+ delete = f_delete.get rescue nil
205
+ time = f_time.get rescue nil
206
+ time &&= Time.at(time).localtime
207
+ puts STAT_FORMAT % [node.nid, node.name, uptime, read, write, delete, time]
208
+ }
209
+
210
+ when 'items'
211
+ ITEMS_FORMAT = "%4s %15s %10s %10s"
212
+ puts ITEMS_FORMAT % %w[nid name rsid #items]
213
+
214
+ map = {}
215
+ each_node {|s,node|
216
+ f_items = s.call_async(:stat, 'db_items')
217
+ f_items
218
+ }.each {|node,f_items|
219
+ items = f_items.get rescue nil
220
+ rsids = node.rsids.sort.join(',')
221
+ puts ITEMS_FORMAT % [node.nid, node.name, rsids, items]
222
+
223
+ items ||= 0
224
+ node.rsids.each {|rsid|
225
+ if !map[rsid] || map[rsid] < items
226
+ map[rsid] = items
227
+ end
228
+ }
229
+ }
230
+
231
+ total = map.values.inject(0) {|r,n| r + n }
232
+ puts "total: #{total}"
233
+
234
+ when 'version'
235
+ VERSION_FORMAT = "%4s %15s %10s %10s"
236
+ puts VERSION_FORMAT % %w[nid name pid version]
237
+
238
+ each_node {|s,node|
239
+ f_pid = s.call_async(:stat, 'pid')
240
+ f_version = s.call_async(:stat, 'version')
241
+ [f_pid, f_version]
242
+ }.each {|node,(f_pid,f_version)|
243
+ pid = f_pid.get rescue nil
244
+ version = f_version.get rescue nil
245
+ puts VERSION_FORMAT % [node.nid, node.name, pid, version]
246
+ }
247
+
248
+ when 'locate'
249
+ key = cmd_args(1)
250
+
251
+ nodes = get_nodes
252
+
253
+ gwnode = nodes.first
254
+ vers = $net.get_session(*gwnode.address).call(:util_locate, key)
255
+
256
+ if vers.empty?
257
+ $stderr.puts "not found."
258
+ exit 0
259
+ end
260
+
261
+ NODE_FORMAT = " > %-15s nid=%-3s %23s %23s"
262
+
263
+ vers.each {|(key,vtime,rsid),vname|
264
+ time = Time.at(vtime)
265
+ puts "vtime=[#{time}] vname=#{vname.inspect}\trsid=#{rsid}:"
266
+ nodes.each {|node|
267
+ if node.rsids.include?(rsid)
268
+ puts NODE_FORMAT % [node.name, node.nid, node.address, node.location]
269
+ end
270
+ }
271
+ }
272
+
273
+ else
274
+ puts "unknown command #{cmd}"
275
+ puts ""
276
+ usage
277
+ end
278
+
@@ -0,0 +1,335 @@
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
+ require 'msgpack/rpc'
19
+ require 'digest/md5'
20
+ require 'digest/sha1'
21
+ require 'csv'
22
+ require 'fileutils'
23
+ require 'cgi'
24
+ require 'ls4/lib/cclog'
25
+ require 'ls4/lib/ebus'
26
+ require 'ls4/lib/vbcode'
27
+ require 'ls4/logic/tsv_data'
28
+ require 'ls4/logic/weight'
29
+ require 'ls4/logic/fault_detector'
30
+ require 'ls4/logic/membership'
31
+ require 'ls4/logic/node'
32
+ require 'ls4/logic/okey'
33
+ require 'ls4/service/base'
34
+ require 'ls4/service/bus'
35
+ require 'ls4/service/process'
36
+ require 'ls4/service/rpc'
37
+ require 'ls4/service/rpc_gw'
38
+ require 'ls4/service/rpc_ds'
39
+ require 'ls4/service/stat'
40
+ require 'ls4/service/stat_gw'
41
+ require 'ls4/service/stat_ds'
42
+ require 'ls4/service/config'
43
+ require 'ls4/service/config_gw'
44
+ require 'ls4/service/config_ds'
45
+ require 'ls4/service/data_server'
46
+ require 'ls4/service/data_server_url'
47
+ require 'ls4/service/data_client'
48
+ require 'ls4/service/mds'
49
+ require 'ls4/service/mds_ha'
50
+ require 'ls4/service/mds_tt'
51
+ require 'ls4/service/mds_memcache'
52
+ require 'ls4/service/mds_cache'
53
+ require 'ls4/service/mds_cache_mem'
54
+ require 'ls4/service/mds_cache_memcached'
55
+ require 'ls4/service/gateway'
56
+ require 'ls4/service/gateway_ro'
57
+ require 'ls4/service/gw_http'
58
+ require 'ls4/service/sync'
59
+ require 'ls4/service/heartbeat'
60
+ require 'ls4/service/weight'
61
+ require 'ls4/service/balance'
62
+ require 'ls4/service/master_select'
63
+ require 'ls4/service/membership'
64
+ require 'ls4/service/rts'
65
+ require 'ls4/service/rts_file'
66
+ require 'ls4/service/rts_memory'
67
+ require 'ls4/service/slave'
68
+ require 'ls4/service/storage'
69
+ require 'ls4/service/storage_dir'
70
+ require 'ls4/service/ulog'
71
+ require 'ls4/service/ulog_file'
72
+ require 'ls4/service/ulog_memory'
73
+ require 'ls4/service/time_check'
74
+ require 'ls4/service/log'
75
+ require 'ls4/default'
76
+ require 'ls4/version'
77
+ require 'optparse'
78
+
79
+ include LS4
80
+
81
+ conf = DSConfigService.init
82
+
83
+ op = OptionParser.new
84
+
85
+ (class<<self;self;end).module_eval do
86
+ define_method(:usage) do |msg|
87
+ puts op.to_s
88
+ puts "error: #{msg}" if msg
89
+ exit 1
90
+ end
91
+ end
92
+
93
+ listen_host = '0.0.0.0'
94
+ listen_port = nil
95
+
96
+ read_only_gw = false
97
+
98
+ op.on('-c', '--cs ADDRESS', "address of config server (required)") do |addr|
99
+ host, port = addr.split(':',2)
100
+ port = port.to_i
101
+ port = CS_DEFAULT_PORT if port == 0
102
+ conf.cs_address = Address.new(host, port)
103
+ end
104
+
105
+ op.on('-i', '--nid ID', Integer, "unieque node id (required)") do |nid|
106
+ conf.self_nid = nid
107
+ end
108
+
109
+ op.on('-n', '--name NAME', "human-readable node name (required)") do |name|
110
+ conf.self_name = name
111
+ end
112
+
113
+ op.on('-a', '--address ADDRESS[:PORT]', "address of this node (required)") do |addr|
114
+ host, port = addr.split(':',2)
115
+ port = port.to_i
116
+ if port != 0
117
+ listen_port = port
118
+ else
119
+ port = DS_DEFAULT_PORT
120
+ end
121
+ conf.self_address = Address.new(host, port)
122
+ end
123
+
124
+ op.on('-l', '--listen HOST[:PORT]', "listen address") do |addr|
125
+ if addr.include?(':')
126
+ host, port = addr.split(':',2)
127
+ port = port.to_i
128
+ if port != 0
129
+ listen_port = port
130
+ end
131
+ listen_host = host
132
+ else
133
+ listen_host = addr
134
+ end
135
+ end
136
+
137
+ op.on('-g', '--rsid IDs', "replica-set IDs to join (required)") do |ids|
138
+ conf.self_rsids = ids.split(',').map {|id| id.to_i }
139
+ end
140
+
141
+ op.on('-L', '--location STRING', "location of this node") do |str|
142
+ conf.self_location = str
143
+ end
144
+
145
+ op.on('-s', '--store PATH', "path to storage directory (required)") do |path|
146
+ conf.storage_path = path
147
+ end
148
+
149
+ op.on('-u', '--ulog PATH', "path to update log directory") do |path|
150
+ conf.ulog_path = path
151
+ end
152
+
153
+ op.on('-r', '--rts PATH', "path to relay timestamp directory") do |path|
154
+ conf.rts_path = path
155
+ end
156
+
157
+ op.on('-t', '--http PORT', "http listen port") do |addr|
158
+ if addr.include?(':')
159
+ host, port = addr.split(':',2)
160
+ port = port.to_i
161
+ else
162
+ host = '0.0.0.0'
163
+ port = addr.to_i
164
+ end
165
+ conf.http_gateway_address = Address.new(host, port)
166
+ end
167
+
168
+ op.on('--http-error-page PATH', 'path to eRuby template file') do |path|
169
+ conf.http_gateway_error_template_file = path
170
+ end
171
+
172
+ op.on('--http-redirect-port PORT', Integer) do |port|
173
+ conf.http_redirect_port = port
174
+ end
175
+
176
+ op.on('--http-redirect-path FORMAT') do |format|
177
+ conf.http_redirect_path_format = format
178
+ end
179
+
180
+ op.on('-R', '--read-only', "read-only mode", TrueClass) do |b|
181
+ read_only_gw = b
182
+ end
183
+
184
+ op.on('-N', '--read-only-name NAME', "read-only mode using the version name") do |name|
185
+ read_only_gw = true
186
+ conf.read_only_version = name
187
+ end
188
+
189
+ op.on('-T', '--read-only-time TIME', "read-only mode using the time", Integer) do |time|
190
+ read_only_gw = true
191
+ conf.read_only_version = time
192
+ end
193
+
194
+ op.on('--fault_store PATH', "path to fault status file") do |path|
195
+ conf.fault_path = path
196
+ end
197
+
198
+ op.on('--membership_store PATH', "path to membership status file") do |path|
199
+ conf.membership_path = path
200
+ end
201
+
202
+ op.on('-o', '--log PATH') do |path|
203
+ conf.log_path = path
204
+ end
205
+
206
+ op.on('-v', '--verbose', "show debug messages", TrueClass) do |b|
207
+ $log.level = 1 if b
208
+ end
209
+
210
+ op.on('--trace', "show debug and trace messages", TrueClass) do |b|
211
+ $log.level = 0 if b
212
+ end
213
+
214
+ op.on('--color-log', "force to enable color log", TrueClass) do |b|
215
+ $log.enable_color
216
+ end
217
+
218
+
219
+ begin
220
+ op.parse!(ARGV)
221
+
222
+ if ARGV.length != 0
223
+ raise "unknown option: #{ARGV[0].dump}"
224
+ end
225
+
226
+ unless conf.self_nid
227
+ raise "--nid option is required"
228
+ end
229
+
230
+ unless conf.self_name
231
+ raise "--name option is required"
232
+ end
233
+
234
+ unless conf.self_address
235
+ raise "--address option is required"
236
+ end
237
+
238
+ unless conf.self_rsids
239
+ raise "--rsid option is required"
240
+ end
241
+
242
+ unless conf.cs_address
243
+ raise "--cs option is required"
244
+ end
245
+
246
+ unless conf.storage_path
247
+ raise "--store option is required"
248
+ end
249
+
250
+ FileUtils.mkdir_p(conf.storage_path)
251
+
252
+ unless conf.ulog_path
253
+ conf.ulog_path = conf.storage_path
254
+ #raise "--ulog option is required"
255
+ end
256
+
257
+ unless conf.rts_path
258
+ conf.rts_path = conf.storage_path
259
+ #raise "--rts option is required"
260
+ end
261
+
262
+ unless conf.fault_path
263
+ conf.fault_path = File.join(conf.storage_path, "fault")
264
+ end
265
+
266
+ unless conf.membership_path
267
+ conf.membership_path = File.join(conf.storage_path, "membership")
268
+ end
269
+
270
+ unless conf.weight_path
271
+ conf.weight_path = File.join(conf.storage_path, "weight")
272
+ end
273
+
274
+ if conf.http_redirect_path_format && !conf.http_redirect_port
275
+ $log.warn "--http-redirect-port option is ignored"
276
+ end
277
+
278
+ listen_port ||= DS_DEFAULT_PORT
279
+
280
+ rescue
281
+ usage $!.to_s
282
+ end
283
+
284
+
285
+ ProcessService.init
286
+ LogService.open!
287
+ SyncClientService.init
288
+ HeartbeatMemberService.init
289
+ RoutRobinWeightBalanceService.init
290
+ WeightMemberService.init
291
+ if conf.self_location.empty?
292
+ FlatMasterSelectService.init
293
+ else
294
+ LocationAwareMasterSelectService.init
295
+ end
296
+ MembershipMemberService.init
297
+ DataClientService.init
298
+ if read_only_gw
299
+ ReadOnlyGatewayService.init
300
+ else
301
+ GatewayService.init
302
+ end
303
+ if conf.http_gateway_address
304
+ HTTPGatewayService.open!
305
+ end
306
+ StorageSelector.open!
307
+ UpdateLogSelector.open!
308
+ RelayTimeStampSelector.open!
309
+ SlaveService.init
310
+ DataServerService.init
311
+ DataServerURLService.init
312
+ DSStatService.init
313
+ MDSService.init
314
+ MDSCacheService.init
315
+ CachedMDSService.init
316
+ TimeCheckService.init
317
+
318
+ LogService.instance.log_event_bus
319
+
320
+ ProcessBus.run
321
+
322
+ TimeCheckService.instance.check_blocking! rescue nil
323
+ SyncClientService.instance.sync_blocking! rescue nil
324
+ MembershipMemberService.instance.register_self_blocking! rescue nil
325
+ #HeartbeatMemberService.instance.heartbeat_blocking! rescue nil
326
+
327
+ net = ProcessBus.serve_rpc(DSRPCService.instance)
328
+ net.listen(listen_host, listen_port)
329
+
330
+ $log.info "start on #{listen_host}:#{listen_port}"
331
+
332
+ net.run
333
+
334
+ ProcessBus.shutdown
335
+