roma 0.8.2 → 0.8.10

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 (114) hide show
  1. data/CHANG +326 -0
  2. data/CHANGELOG +132 -0
  3. data/{README.rdoc → FETCH_HEAD} +0 -0
  4. data/{LICENSE.rdoc → LICENSE} +0 -1
  5. data/README +17 -0
  6. data/Rakefile +33 -18
  7. data/ruby/server/bin/chg_redundancy +10 -0
  8. data/ruby/server/bin/key_access +7 -0
  9. data/ruby/server/bin/key_list +7 -0
  10. data/ruby/server/bin/mkconfig +19 -0
  11. data/{bin → ruby/server/bin}/mkrecent +0 -1
  12. data/{bin → ruby/server/bin}/mkroute +0 -1
  13. data/ruby/server/bin/multi_commander +19 -0
  14. data/ruby/server/bin/recoverlost +10 -0
  15. data/ruby/server/bin/recoverlost_alist +10 -0
  16. data/ruby/server/bin/recoverlost_alist_all +10 -0
  17. data/ruby/server/bin/recoverlost_alist_keys +10 -0
  18. data/{bin/recoverlost → ruby/server/bin/roma_watcher} +1 -2
  19. data/ruby/server/bin/romad +36 -0
  20. data/{bin → ruby/server/bin}/sample_watcher +0 -1
  21. data/{bin → ruby/server/bin}/sample_watcher2 +0 -1
  22. data/{bin/simple_bench → ruby/server/bin/sample_watcher3} +1 -2
  23. data/ruby/server/bin/simple_bench +26 -0
  24. data/{bin → ruby/server/bin}/ssroute +0 -1
  25. data/ruby/server/bin/test-scenario +11 -0
  26. data/{bin → ruby/server/bin}/tribunus +0 -1
  27. data/{lib → ruby/server/lib}/roma/async_process.rb +67 -15
  28. data/{lib → ruby/server/lib}/roma/command/bg_command_receiver.rb +1 -1
  29. data/ruby/server/lib/roma/command/command_definition.rb +422 -0
  30. data/ruby/server/lib/roma/command/mh_command_receiver.rb +127 -0
  31. data/ruby/server/lib/roma/command/receiver.rb +64 -0
  32. data/{lib → ruby/server/lib}/roma/command/rt_command_receiver.rb +6 -1
  33. data/ruby/server/lib/roma/command/sys_command_receiver.rb +609 -0
  34. data/{lib → ruby/server/lib}/roma/command/util_command_receiver.rb +15 -5
  35. data/{lib → ruby/server/lib}/roma/command/vn_command_receiver.rb +12 -4
  36. data/{lib → ruby/server/lib}/roma/command_plugin.rb +0 -0
  37. data/ruby/server/lib/roma/config.rb +84 -0
  38. data/{lib → ruby/server/lib}/roma/event/con_pool.rb +12 -1
  39. data/ruby/server/lib/roma/event/handler.rb +256 -0
  40. data/ruby/server/lib/roma/live_patch-20120302-001.rb +107 -0
  41. data/ruby/server/lib/roma/logging/rlogger.rb +163 -0
  42. data/ruby/server/lib/roma/messaging/con_pool.rb +92 -0
  43. data/{lib → ruby/server/lib}/roma/plugin/plugin_alist.rb +118 -240
  44. data/ruby/server/lib/roma/plugin/plugin_debug.rb +31 -0
  45. data/ruby/server/lib/roma/plugin/plugin_map.rb +177 -0
  46. data/ruby/server/lib/roma/plugin/plugin_mapcount.rb +185 -0
  47. data/{lib/roma/command/st_command_receiver.rb → ruby/server/lib/roma/plugin/plugin_storage.rb} +170 -146
  48. data/ruby/server/lib/roma/plugin/plugin_stub.rb +283 -0
  49. data/{lib → ruby/server/lib}/roma/plugin/plugin_test.rb +0 -0
  50. data/{lib → ruby/server/lib}/roma/romad.rb +221 -94
  51. data/{lib → ruby/server/lib}/roma/routing/cb_rttable.rb +4 -6
  52. data/{lib → ruby/server/lib}/roma/routing/merkle_tree.rb +0 -0
  53. data/ruby/server/lib/roma/routing/routing_data.rb +307 -0
  54. data/{lib → ruby/server/lib}/roma/routing/rttable.rb +4 -0
  55. data/{lib → ruby/server/lib}/roma/stats.rb +19 -3
  56. data/{lib → ruby/server/lib}/roma/storage/basic_storage.rb +25 -26
  57. data/{lib → ruby/server/lib}/roma/storage/dbm_storage.rb +1 -23
  58. data/{lib → ruby/server/lib}/roma/storage/dummy_storage.rb +0 -0
  59. data/{lib → ruby/server/lib}/roma/storage/rh_storage.rb +0 -0
  60. data/{lib → ruby/server/lib}/roma/storage/sqlite3_storage.rb +0 -0
  61. data/{lib → ruby/server/lib}/roma/storage/tc_storage.rb +62 -2
  62. data/ruby/server/lib/roma/tools/chg_redundancy.rb +36 -0
  63. data/ruby/server/lib/roma/tools/key_access.rb +105 -0
  64. data/ruby/server/lib/roma/tools/key_list.rb +94 -0
  65. data/ruby/server/lib/roma/tools/mkconfig.rb +535 -0
  66. data/{lib → ruby/server/lib}/roma/tools/mkrecent.rb +0 -0
  67. data/{lib → ruby/server/lib}/roma/tools/mkroute.rb +0 -0
  68. data/ruby/server/lib/roma/tools/multi_commander.rb +45 -0
  69. data/{lib → ruby/server/lib}/roma/tools/recoverlost.rb +0 -0
  70. data/{lib → ruby/server/lib}/roma/tools/recoverlost_alist.rb +0 -0
  71. data/ruby/server/lib/roma/tools/recoverlost_alist_all.rb +8 -0
  72. data/ruby/server/lib/roma/tools/recoverlost_alist_keys.rb +16 -0
  73. data/ruby/server/lib/roma/tools/recoverlost_lib.rb +349 -0
  74. data/ruby/server/lib/roma/tools/roma_watcher.rb +150 -0
  75. data/ruby/server/lib/roma/tools/roma_watcher_config.yml.example +20 -0
  76. data/{lib → ruby/server/lib}/roma/tools/sample_watcher.rb +3 -1
  77. data/{lib → ruby/server/lib}/roma/tools/sample_watcher2.rb +3 -1
  78. data/ruby/server/lib/roma/tools/sample_watcher3.rb +49 -0
  79. data/{lib → ruby/server/lib}/roma/tools/simple_bench.rb +2 -0
  80. data/ruby/server/lib/roma/tools/simple_bench2.rb +78 -0
  81. data/{lib → ruby/server/lib}/roma/tools/ssroute.rb +0 -0
  82. data/ruby/server/lib/roma/tools/test-scenario.rb +327 -0
  83. data/{lib → ruby/server/lib}/roma/tools/tribunus.rb +0 -0
  84. data/ruby/server/lib/roma/version.rb +4 -0
  85. data/{lib → ruby/server/lib}/roma/write_behind.rb +1 -0
  86. data/ruby/server/test/config4mhash.rb +68 -0
  87. data/ruby/server/test/config4storage_error.rb +69 -0
  88. data/{lib/roma/config.rb → ruby/server/test/config4test.rb} +6 -3
  89. data/{test → ruby/server/test}/rcirb.rb +0 -1
  90. data/{test → ruby/server/test}/roma-test-utils.rb +21 -8
  91. data/{test → ruby/server/test}/run-test.rb +3 -2
  92. data/ruby/server/test/storage_error_storage.rb +37 -0
  93. data/ruby/server/test/t_command_definition.rb +326 -0
  94. data/{test → ruby/server/test}/t_cpdata.rb +9 -3
  95. data/{test → ruby/server/test}/t_listplugin.rb +48 -12
  96. data/ruby/server/test/t_mapcountplugin.rb +231 -0
  97. data/ruby/server/test/t_mapplugin.rb +131 -0
  98. data/ruby/server/test/t_mhash.rb +222 -0
  99. data/ruby/server/test/t_rclient.rb +199 -0
  100. data/{test → ruby/server/test}/t_routing_data.rb +56 -0
  101. data/{test → ruby/server/test}/t_storage.rb +107 -111
  102. data/ruby/server/test/t_storage_error.rb +61 -0
  103. data/ruby/server/test/t_writebehind.rb +374 -0
  104. metadata +150 -82
  105. data/bin/recoverlost_alist +0 -8
  106. data/bin/romad +0 -7
  107. data/lib/roma/command/mh_command_receiver.rb +0 -117
  108. data/lib/roma/command/receiver.rb +0 -287
  109. data/lib/roma/event/handler.rb +0 -159
  110. data/lib/roma/plugin/plugin_debug.rb +0 -19
  111. data/lib/roma/tools/recoverlost_lib.rb +0 -217
  112. data/lib/roma/version.rb +0 -4
  113. data/test/t_rclient.rb +0 -318
  114. data/test/t_writebehind.rb +0 -200
@@ -0,0 +1,64 @@
1
+ require 'roma/stats'
2
+ require 'roma/version'
3
+ require 'roma/event/handler'
4
+ require 'roma/messaging/con_pool'
5
+ require 'roma/command/bg_command_receiver'
6
+ require 'roma/command/rt_command_receiver'
7
+ require 'roma/command/util_command_receiver'
8
+ require 'roma/command/mh_command_receiver'
9
+ require 'roma/command/sys_command_receiver'
10
+
11
+ module Roma
12
+ module Command
13
+
14
+ class Receiver < Roma::Event::Handler
15
+
16
+ include BackgroundCommandReceiver
17
+ include RoutingCommandReceiver
18
+ include UtilCommandReceiver
19
+ include MultiHashCommandReceiver
20
+ include SystemCommandReceiver
21
+
22
+ def initialize(storages, rttable)
23
+ super(storages, rttable)
24
+ @stats = Roma::Stats.instance
25
+ @nid = @stats.ap_str
26
+ @defhash = 'roma'
27
+ end
28
+
29
+ def self.mk_starting_evlist
30
+ Event::Handler.ev_list.clear
31
+ each_system_commands{|m|
32
+ Event::Handler.ev_list[m.to_s[3..-1]] = m
33
+ Event::Handler.system_commands[m.to_s[3..-1]] = nil
34
+ }
35
+ end
36
+
37
+ def self.each_system_commands
38
+ methods = RoutingCommandReceiver::public_instance_methods
39
+ methods << BackgroundCommandReceiver::public_instance_methods
40
+ methods << SystemCommandReceiver::public_instance_methods
41
+
42
+ if Receiver::public_instance_methods.include?(:ev_eval)
43
+ methods << :ev_eval
44
+ end
45
+ methods.flatten.each{|m|
46
+ yield m if m.to_s.start_with?('ev_')
47
+ }
48
+ end
49
+
50
+ def self.mk_evlist
51
+ each_system_commands{|m|
52
+ Event::Handler.system_commands[m.to_s[3..-1]] = nil
53
+ }
54
+ Receiver::public_instance_methods.each{|m|
55
+ if m.to_s.start_with?('ev_')
56
+ Event::Handler.ev_list[m.to_s[3..-1]] = m
57
+ end
58
+ }
59
+ end
60
+
61
+ end # class Receiver < Roma::Event::Handler
62
+
63
+ end # module Command
64
+ end # module Roma
@@ -34,7 +34,7 @@ module Roma
34
34
  send_data("CREATED\r\n")
35
35
  end
36
36
 
37
- # routingdump [yaml|json|yamlbytes]\r\n
37
+ # routingdump [yaml|json|yamlbytes|bin]\r\n
38
38
  def ev_routingdump(s)
39
39
  if s.length == 1
40
40
  dmp = @rttable.dump
@@ -48,6 +48,11 @@ module Roma
48
48
  elsif s[1] == 'yamlbytes'
49
49
  dmp = @rttable.dump_yaml
50
50
  send_data("#{dmp.length + 7}\r\nEND\r\n")
51
+ elsif s[1] == 'bin'
52
+ dmp = @rttable.dump_binary
53
+ send_data("#{dmp.length}\r\n#{dmp}\r\nEND\r\n")
54
+ else
55
+ send_data("CLIENT_ERROR\r\n")
51
56
  end
52
57
  end
53
58
 
@@ -0,0 +1,609 @@
1
+
2
+ module Roma
3
+ module Command
4
+
5
+ module SystemCommandReceiver
6
+
7
+ # balse [reason]
8
+ def ev_balse(s)
9
+ send_data("Are you sure?(yes/no)\r\n")
10
+ if gets != "yes\r\n"
11
+ close_connection_after_writing
12
+ return
13
+ end
14
+
15
+ if s.length == 2
16
+ @log.info("Receive a balse #{s[1]}")
17
+ else
18
+ @log.info("Receive a balse command.")
19
+ end
20
+ @rttable.enabled_failover = false
21
+ res = broadcast_cmd("rbalse\r\n")
22
+ send_data("#{res.inspect}\r\n")
23
+ close_connection_after_writing
24
+ @stop_event_loop = true
25
+ end
26
+
27
+ # rbalse [reason]
28
+ def ev_rbalse(s)
29
+ if s.length == 2
30
+ @log.info("Receive a rbalse #{s[1]}")
31
+ else
32
+ @log.info("Receive a rbalse command.")
33
+ end
34
+ @rttable.enabled_failover = false
35
+ send_data("BYE\r\n")
36
+ close_connection_after_writing
37
+ @stop_event_loop = true
38
+ end
39
+
40
+ # shutdown_instance [node-id]
41
+ def ev_shutdown_instance(s)
42
+ if s.length != 2
43
+ send_data("usage:shutdown_instance [node-id]\r\n")
44
+ else
45
+ if s[1] == @stats.ap_str
46
+ @rttable.enabled_failover = false
47
+ send_data("BYE\r\n")
48
+ @stop_event_loop = true
49
+ close_connection_after_writing
50
+ else
51
+ send_data("invalid [node-id]\r\n")
52
+ end
53
+ end
54
+ end
55
+
56
+ # version
57
+ def ev_version(s)
58
+ send_data("VERSION ROMA-#{Roma::VERSION}\r\n")
59
+ end
60
+
61
+ # quit
62
+ def ev_quit(s)
63
+ close_connection
64
+ end
65
+
66
+ def ev_whoami(s)
67
+ send_data("#{@stats.name}\r\n")
68
+ end
69
+
70
+ # stats [regexp]
71
+ def ev_stats(s); ev_stat(s); end
72
+
73
+ # stat [regexp]
74
+ def ev_stat(s)
75
+ regexp = s[1] if s.length == 2
76
+ h = {}
77
+ h['version'] = Roma::VERSION
78
+ send_stat_result(nil,h,regexp)
79
+ send_stat_result(nil,get_config_stat,regexp)
80
+ send_stat_result(nil,@stats.get_stat,regexp)
81
+ @storages.each{|hname,st|
82
+ send_stat_result("storages[#{hname}].",st.get_stat,regexp)
83
+ }
84
+ send_stat_result(nil,$roma.wb_get_stat,regexp)
85
+ send_stat_result(nil,@rttable.get_stat(@stats.ap_str),regexp)
86
+ send_stat_result(nil,conn_get_stat,regexp)
87
+ send_data("END\r\n")
88
+ end
89
+
90
+ def send_stat_result(prefix,h,regexp = nil)
91
+ h.each{|k,v|
92
+ if prefix
93
+ key = "#{prefix}#{k}"
94
+ else
95
+ key = "#{k}"
96
+ end
97
+ if regexp
98
+ send_data("#{key} #{v}\r\n") if key =~ /#{regexp}/
99
+ else
100
+ send_data("#{key} #{v}\r\n")
101
+ end
102
+ }
103
+ end
104
+ private :send_stat_result
105
+
106
+ # writebehind_rotate [hash_name]
107
+ def ev_writebehind_rotate(s)
108
+ if s.length < 2
109
+ return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
110
+ end
111
+ res = broadcast_cmd("rwritebehind_rotate #{s[1]}\r\n")
112
+
113
+ if $roma.wb_rotate(s[1])
114
+ res[@stats.ap_str] = "ROTATED"
115
+ else
116
+ res[@stats.ap_str] = "NOT_OPEND"
117
+ end
118
+ send_data("#{res}\r\n")
119
+ end
120
+
121
+ # rwritebehind_rotate [hash_name]
122
+ def ev_rwritebehind_rotate(s)
123
+ if s.length < 2
124
+ return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
125
+ end
126
+ if $roma.wb_rotate(s[1])
127
+ send_data("ROTATED\r\n")
128
+ else
129
+ send_data("NOT_OPEND\r\n")
130
+ end
131
+ end
132
+
133
+ # writebehind_get_path [hash_name]
134
+ def ev_writebehind_get_path(s)
135
+ if s.length < 2
136
+ return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
137
+ end
138
+ res = broadcast_cmd("rwritebehind_get_path #{s[1]}\r\n")
139
+
140
+ ret = $roma.wb_get_path(s[1])
141
+ res[@stats.ap_str] = ret
142
+
143
+ send_data("#{res}\r\n")
144
+ end
145
+
146
+ # rwritebehind_get_path [hash_name]
147
+ def ev_rwritebehind_get_path(s)
148
+ if s.length < 2
149
+ return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
150
+ end
151
+
152
+ ret = $roma.wb_get_path(s[1])
153
+ send_data("#{ret}\r\n")
154
+ end
155
+
156
+ # writebehind_get_current_file [hash_name]
157
+ def ev_writebehind_get_current_file(s)
158
+ if s.length < 2
159
+ return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
160
+ end
161
+ res = broadcast_cmd("rwritebehind_get_current_file #{s[1]}\r\n")
162
+
163
+ ret = $roma.wb_get_current_file_path(s[1])
164
+ if ret
165
+ res[@stats.ap_str] = ret
166
+ else
167
+ res[@stats.ap_str] = "NOT_OPEND"
168
+ end
169
+ send_data("#{res}\r\n")
170
+ end
171
+
172
+ # rwritebehind_get_current_file [hash_name]
173
+ def ev_rwritebehind_get_current_file(s)
174
+ if s.length < 2
175
+ return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
176
+ end
177
+ ret = $roma.wb_get_current_file_path(s[1])
178
+ if ret
179
+ send_data("#{ret}\r\n")
180
+ else
181
+ send_data("NOT_OPEND\r\n")
182
+ end
183
+ end
184
+
185
+ # dcnice command is setting priority for a data-copy thread.
186
+ # a niceness of 1 is the highest priority and 5 is the lowest priority.
187
+ # dcnice <priority:1 to 5>
188
+ def ev_dcnice(s)
189
+ if s.length < 2
190
+ return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
191
+ end
192
+ res = broadcast_cmd("rdcnice #{s[1]}\r\n")
193
+ res[@stats.ap_str] = dcnice(s[1].to_i)
194
+ send_data("#{res}\r\n")
195
+ end
196
+
197
+ def ev_rdcnice(s)
198
+ if s.length < 2
199
+ return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
200
+ end
201
+
202
+ send_data("#{dcnice(s[1].to_i)}\r\n")
203
+ end
204
+
205
+ def ev_restart(s)
206
+ res = broadcast_cmd("rrestart\r\n")
207
+ $roma.eventloop = true
208
+ @rttable.enabled_failover = false
209
+ Messaging::ConPool.instance.close_all
210
+ Event::EMConPool::instance.close_all
211
+ EventMachine::stop_event_loop
212
+ res[@stats.ap_str] = "RESTARTED"
213
+ send_data("#{res}\r\n")
214
+ end
215
+
216
+ def ev_rrestart(s)
217
+ $roma.eventloop = true
218
+ @rttable.enabled_failover = false
219
+ Messaging::ConPool.instance.close_all
220
+ Event::EMConPool::instance.close_all
221
+ EventMachine::stop_event_loop
222
+ send_data("RESTARTED\r\n")
223
+ end
224
+
225
+ # set_log_level [ 'debug' | 'info' | 'warn' | 'error' ]
226
+ def ev_set_log_level(s)
227
+ if s.length < 2
228
+ return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
229
+ end
230
+
231
+ case s[1].downcase
232
+ when 'debug'
233
+ @log.level = Roma::Logging::RLogger::Severity::DEBUG
234
+ when 'info'
235
+ @log.level = Roma::Logging::RLogger::Severity::INFO
236
+ when 'warn'
237
+ @log.level = Roma::Logging::RLogger::Severity::WARN
238
+ when 'error'
239
+ @log.level = Roma::Logging::RLogger::Severity::ERROR
240
+ else
241
+ return send_data("CLIENT_ERROR no match log-level string\r\n")
242
+ end
243
+ send_data("STORED\r\n")
244
+ end
245
+
246
+ # out <key> <vn>
247
+ def ev_out(s)
248
+ key,hname = s[1].split("\e")
249
+ hname ||= @defhash
250
+ if s.length >= 3
251
+ vn = s[2].to_i
252
+ else
253
+ d = Digest::SHA1.hexdigest(key).hex % @rttable.hbits
254
+ vn = @rttable.get_vnode_id(d)
255
+ end
256
+ res = @storages[hname].out(vn, key, 0)
257
+ @stats.out_message_count += 1
258
+ unless res
259
+ return send_data("NOT_DELETED\r\n")
260
+ end
261
+ send_data("DELETED\r\n")
262
+ end
263
+
264
+ # rset <key> <hash value> <timelimit> <length>
265
+ # "set" means "store this data".
266
+ # <command name> <key> <digest> <exptime> <bytes> [noreply]\r\n
267
+ # <data block>\r\n
268
+ def ev_rset(s)
269
+ key,hname = s[1].split("\e")
270
+ hname ||= @defhash
271
+ d = s[2].to_i
272
+ d = Digest::SHA1.hexdigest(key).hex % @rttable.hbits if d == 0
273
+ data = read_bytes(s[5].to_i)
274
+ read_bytes(2)
275
+ vn = @rttable.get_vnode_id(d)
276
+ unless @storages.key?(hname)
277
+ send_data("SERVER_ERROR #{hname} dose not exists.\r\n")
278
+ return
279
+ end
280
+ if @storages[hname].rset(vn, key, d, s[3].to_i, s[4].to_i, data)
281
+ send_data("STORED\r\n")
282
+ else
283
+ @log.error("rset NOT_STORED:#{@storages[hname].error_message} #{vn} #{s[1]} #{d} #{s[3]} #{s[4]}")
284
+ send_data("NOT_STORED\r\n")
285
+ end
286
+ @stats.redundant_count += 1
287
+ end
288
+
289
+ # <command name> <key> <digest> <exptime> <bytes> [noreply]\r\n
290
+ # <compressed data block>\r\n
291
+ def ev_rzset(s)
292
+ key,hname = s[1].split("\e")
293
+ hname ||= @defhash
294
+ d = s[2].to_i
295
+ d = Digest::SHA1.hexdigest(key).hex % @rttable.hbits if d == 0
296
+ zdata = read_bytes(s[5].to_i)
297
+ read_bytes(2)
298
+ vn = @rttable.get_vnode_id(d)
299
+ unless @storages.key?(hname)
300
+ send_data("SERVER_ERROR #{hname} dose not exists.\r\n")
301
+ return
302
+ end
303
+
304
+ data = Zlib::Inflate.inflate(zdata)
305
+ # @log.debug("data = #{data}")
306
+ if @storages[hname].rset(vn, key, d, s[3].to_i, s[4].to_i, data)
307
+ send_data("STORED\r\n")
308
+ else
309
+ @log.error("rzset NOT_STORED:#{@storages[hname].error_message} #{vn} #{s[1]} #{d} #{s[3]} #{s[4]}")
310
+ send_data("NOT_STORED\r\n")
311
+ end
312
+ @stats.redundant_count += 1
313
+ rescue Zlib::DataError => e
314
+ @log.error("rzset NOT_STORED:#{e} #{vn} #{s[1]} #{d} #{s[3]} #{s[4]}")
315
+ send_data("NOT_STORED\r\n")
316
+ end
317
+
318
+ def ev_forcedly_start(s)
319
+ @log.info("ROMA forcedly start.")
320
+ AsyncProcess::queue.clear
321
+ @rttable.enabled_failover = true
322
+ Command::Receiver::mk_evlist
323
+ $roma.startup = false
324
+ send_data("STARTED\r\n")
325
+ end
326
+
327
+ # switch_failover <on|off>
328
+ def ev_switch_failover(s)
329
+ if s.length != 2
330
+ return send_data("CLIENT_ERROR number of arguments\r\n")
331
+ end
332
+ res = broadcast_cmd("rswitch_failover #{s[1]}\r\n")
333
+ if s[1] == 'on'
334
+ Messaging::ConPool.instance.close_all
335
+ Event::EMConPool::instance.close_all
336
+ @rttable.enabled_failover = true
337
+ @log.info("failover enabled")
338
+ res[@stats.ap_str] = "ENABLED"
339
+ elsif s[1] == 'off'
340
+ @rttable.enabled_failover = false
341
+ @log.info("failover disabled")
342
+ res[@stats.ap_str] = "DISABLED"
343
+ else
344
+ res[@stats.ap_str] = "NOTSWITCHED"
345
+ end
346
+ send_data("#{res}\r\n")
347
+ end
348
+
349
+ # rswitch_failover <on|off>
350
+ def ev_rswitch_failover(s)
351
+ if s.length != 2
352
+ return send_data("CLIENT_ERROR number of arguments\r\n")
353
+ end
354
+ if s[1] == 'on'
355
+ Messaging::ConPool.instance.close_all
356
+ Event::EMConPool::instance.close_all
357
+ @rttable.enabled_failover = true
358
+ @log.info("failover enabled")
359
+ return send_data("ENABLED\r\n")
360
+ elsif s[1] == 'off'
361
+ @rttable.enabled_failover = false
362
+ @log.info("failover disabled")
363
+ return send_data("DISABLED\r\n")
364
+ else
365
+ send_data("NOTSWITCHED\r\n")
366
+ end
367
+ end
368
+
369
+ def ev_set_continuous_limit(s)
370
+ if s.length < 2
371
+ return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
372
+ end
373
+
374
+ res = broadcast_cmd("rset_continuous_limit #{s[1]}\r\n")
375
+
376
+ if Event::Handler.set_ccl(s[1])
377
+ res[@stats.ap_str] = "STORED"
378
+ else
379
+ res[@stats.ap_str] = "NOT_STORED"
380
+ end
381
+ send_data("#{res}\r\n")
382
+ end
383
+
384
+ def ev_rset_continuous_limit(s)
385
+ if s.length < 2
386
+ return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
387
+ end
388
+ if Event::Handler.set_ccl(s[1])
389
+ send_data("STORED\r\n")
390
+ else
391
+ send_data("NOT_STORED\r\n")
392
+ end
393
+ end
394
+
395
+ # set_connection_pool_maxlength <length>
396
+ # set to max length of the connection pool
397
+ def ev_set_connection_pool_maxlength(s)
398
+ if s.length != 2
399
+ return send_data("CLIENT_ERROR number of arguments\r\n")
400
+ end
401
+ if s[1].to_i < 1
402
+ return send_data("CLIENT_ERROR length must be greater than zero\r\n")
403
+ end
404
+
405
+ res = broadcast_cmd("rset_connection_pool_maxlength #{s[1]}\r\n")
406
+ Messaging::ConPool.instance.maxlength = s[1].to_i
407
+ res[@stats.ap_str] = "STORED"
408
+ send_data("#{res}\r\n")
409
+ end
410
+
411
+ # rset_connection_pool_maxlength <length>
412
+ def ev_rset_connection_pool_maxlength(s)
413
+ if s.length != 2
414
+ return send_data("CLIENT_ERROR number of arguments\r\n")
415
+ end
416
+ if s[1].to_i < 1
417
+ return send_data("CLIENT_ERROR length must be greater than zero\r\n")
418
+ end
419
+
420
+ Messaging::ConPool.instance.maxlength = s[1].to_i
421
+ send_data("STORED\r\n")
422
+ end
423
+
424
+ # set_connection_pool_maxlength <length>
425
+ # set to max length of the connection pool
426
+ def ev_set_emconnection_pool_maxlength(s)
427
+ if s.length != 2
428
+ return send_data("CLIENT_ERROR number of arguments\r\n")
429
+ end
430
+ if s[1].to_i < 1
431
+ return send_data("CLIENT_ERROR length must be greater than zero\r\n")
432
+ end
433
+
434
+ res = broadcast_cmd("rset_emconnection_pool_maxlength #{s[1]}\r\n")
435
+ Event::EMConPool.instance.maxlength = s[1].to_i
436
+ res[@stats.ap_str] = "STORED"
437
+ send_data("#{res}\r\n")
438
+ end
439
+
440
+ # rset_connection_pool_maxlength <length>
441
+ def ev_rset_emconnection_pool_maxlength(s)
442
+ if s.length != 2
443
+ return send_data("CLIENT_ERROR number of arguments\r\n")
444
+ end
445
+ if s[1].to_i < 1
446
+ return send_data("CLIENT_ERROR length must be greater than zero\r\n")
447
+ end
448
+
449
+ Event::EMConPool.instance.maxlength = s[1].to_i
450
+ send_data("STORED\r\n")
451
+ end
452
+
453
+ # set_accepted_connection_expire_time <sec>
454
+ # set to expired time(sec) for accepted connections
455
+ def ev_set_accepted_connection_expire_time(s)
456
+ if s.length != 2
457
+ return send_data("CLIENT_ERROR number of arguments\r\n")
458
+ end
459
+
460
+ res = broadcast_cmd("rset_accepted_connection_expire_time #{s[1]}\r\n")
461
+ Event::Handler::connection_expire_time = s[1].to_i
462
+ res[@stats.ap_str] = "STORED"
463
+ send_data("#{res}\r\n")
464
+ end
465
+
466
+ # rset_accepted_connection_expire_time <sec>
467
+ def ev_rset_accepted_connection_expire_time(s)
468
+ if s.length != 2
469
+ return send_data("CLIENT_ERROR number of arguments\r\n")
470
+ end
471
+ Event::Handler::connection_expire_time = s[1].to_i
472
+ send_data("STORED\r\n")
473
+ end
474
+
475
+ # set_hilatency_warn_time <sec>
476
+ # set to threshold of warn message into a log when hilatency occured in a command.
477
+ def ev_set_hilatency_warn_time(s)
478
+ if s.length != 2
479
+ return send_data("CLIENT_ERROR number of arguments\r\n")
480
+ end
481
+ if s[1].to_f <= 0
482
+ return send_data("CLIENT_ERROR time value must be lager than 0\r\n")
483
+ end
484
+
485
+ res = broadcast_cmd("rset_hilatency_warn_time #{s[1]}\r\n")
486
+ @stats.hilatency_warn_time = s[1].to_f
487
+ res[@stats.ap_str] = "STORED"
488
+ send_data("#{res}\r\n")
489
+ end
490
+
491
+ # rset_hilatency_warn_time <sec>
492
+ def ev_rset_hilatency_warn_time(s)
493
+ if s.length != 2
494
+ return send_data("CLIENT_ERROR number of arguments\r\n")
495
+ end
496
+ if s[1].to_f <= 0
497
+ return send_data("CLIENT_ERROR time value must be lager than 0\r\n")
498
+ end
499
+ @stats.hilatency_warn_time = s[1].to_f
500
+ send_data("STORED\r\n")
501
+ end
502
+
503
+ # wb_command_map <hash string>
504
+ # ex.
505
+ # {:set=>1,:append=>2,:delete=>3}
506
+ def ev_wb_command_map(s)
507
+ if s.length < 2
508
+ return send_data("CLIENT_ERROR number of arguments\r\n")
509
+ end
510
+ map = {}
511
+ cmd = s[1..-1].join
512
+ if cmd =~ /^\{(.+)\}$/
513
+ $1.split(',').each do |kv|
514
+ k, v = kv.split('=>')
515
+ map[k[1..-1].to_sym] = v.to_i if v && k[0]==':'
516
+ end
517
+
518
+ res = broadcast_cmd("rwb_command_map #{s[1..-1].join}\r\n")
519
+ @stats.wb_command_map = map
520
+ res[@stats.ap_str] = map.inspect
521
+ send_data("#{res}\r\n")
522
+ else
523
+ send_data("CLIENT_ERROR hash string parse error\r\n")
524
+ end
525
+ end
526
+
527
+ def ev_rwb_command_map(s)
528
+ if s.length < 2
529
+ return send_data("CLIENT_ERROR number of arguments\r\n")
530
+ end
531
+ map = {}
532
+ cmd = s[1..-1].join
533
+ if cmd =~ /^\{(.+)\}$/
534
+ $1.split(',').each do |kv|
535
+ k, v = kv.split('=>')
536
+ map[k[1..-1].to_sym] = v.to_i if v && k[0]==':'
537
+ end
538
+ @stats.wb_command_map = map
539
+ send_data("#{map}\r\n")
540
+ else
541
+ send_data("CLIENT_ERROR hash string parse error\r\n")
542
+ end
543
+ end
544
+
545
+ private
546
+
547
+ def dcnice(p)
548
+ case(p)
549
+ when 1 # highest priority
550
+ @stats.stream_copy_wait_param = 0.001
551
+ @storages.each_value{|st|
552
+ st.each_vn_dump_sleep = 0.001
553
+ st.each_vn_dump_sleep_count = 1000
554
+ }
555
+ when 2
556
+ @stats.stream_copy_wait_param = 0.005
557
+ @storages.each_value{|st|
558
+ st.each_vn_dump_sleep = 0.005
559
+ st.each_vn_dump_sleep_count = 100
560
+ }
561
+ when 3 # default priority
562
+ @stats.stream_copy_wait_param = 0.01
563
+ @storages.each_value{|st|
564
+ st.each_vn_dump_sleep = 0.001
565
+ st.each_vn_dump_sleep_count = 10
566
+ }
567
+ when 4
568
+ @stats.stream_copy_wait_param = 0.01
569
+ @storages.each_value{|st|
570
+ st.each_vn_dump_sleep = 0.005
571
+ st.each_vn_dump_sleep_count = 10
572
+ }
573
+ when 5 # lowest priority
574
+ @stats.stream_copy_wait_param = 0.01
575
+ @storages.each_value{|st|
576
+ st.each_vn_dump_sleep = 0.01
577
+ st.each_vn_dump_sleep_count = 10
578
+ }
579
+ else
580
+ return "CLIENT_ERROR You sholud input a priority from 1 to 5."
581
+ end
582
+ @stats.dcnice = p
583
+ "STORED"
584
+ end
585
+
586
+ def get_config_stat
587
+ ret = {}
588
+ ret['config.DEFAULT_LOST_ACTION'] = Config::DEFAULT_LOST_ACTION
589
+ ret['config.LOG_SHIFT_AGE'] = Config::LOG_SHIFT_AGE
590
+ ret['config.LOG_SHIFT_SIZE'] = Config::LOG_SHIFT_SIZE
591
+ ret['config.LOG_PATH'] = File.expand_path(Config::LOG_PATH)
592
+ ret['config.RTTABLE_PATH'] = File.expand_path(Config::RTTABLE_PATH)
593
+ ret['config.STORAGE_DELMARK_EXPTIME'] = Config::STORAGE_DELMARK_EXPTIME
594
+ if Config.const_defined?(:STORAGE_EXCEPTION_ACTION)
595
+ ret['config.STORAGE_EXCEPTION_ACTION'] = Config::STORAGE_EXCEPTION_ACTION
596
+ end
597
+ ret['config.DATACOPY_STREAM_COPY_WAIT_PARAM'] = Config::DATACOPY_STREAM_COPY_WAIT_PARAM
598
+ ret['config.PLUGIN_FILES'] = Config::PLUGIN_FILES.inspect
599
+ ret['config.WRITEBEHIND_PATH'] = File.expand_path(Config::WRITEBEHIND_PATH)
600
+ ret['config.WRITEBEHIND_SHIFT_SIZE'] = Config::WRITEBEHIND_SHIFT_SIZE
601
+ if Config.const_defined?(:CONNECTION_DESCRIPTOR_TABLE_SIZE)
602
+ ret['config.CONNECTION_DESCRIPTOR_TABLE_SIZE'] = Config::CONNECTION_DESCRIPTOR_TABLE_SIZE
603
+ end
604
+ ret
605
+ end
606
+
607
+ end # module SystemCommandReceiver
608
+ end # module Command
609
+ end # module Roma