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
@@ -1,8 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- path = File.dirname(File.expand_path($PROGRAM_NAME))
4
- $LOAD_PATH << path + "/../lib"
5
- $LOAD_PATH << path + "/../../commons/lib"
6
- $LOAD_PATH << path + "/../../client/lib"
7
-
8
- require 'roma/tools/recoverlost_alist'
data/bin/romad DELETED
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- path = File.dirname(File.expand_path($PROGRAM_NAME))
4
- $LOAD_PATH << path + "/../lib"
5
- $LOAD_PATH << path + "/../../commons/lib"
6
-
7
- require 'roma/romad'
@@ -1,117 +0,0 @@
1
- require 'roma/stats'
2
- require 'roma/command/util_command_receiver'
3
-
4
- module Roma
5
- module Command
6
-
7
- module MultiHashCommandReceiver
8
-
9
- # defhash hashname
10
- def ev_defhash(s)
11
- if s.length!=2
12
- send_data("CLIENT_ERROR usage:defhash hashname\r\n")
13
- return
14
- end
15
- @defhash=s[1]
16
- send_data("STORED\r\n")
17
- end
18
-
19
- # hashlist
20
- def ev_hashlist(s)
21
- ret=''
22
- @storages.each_key{|hn| ret << hn << ' ' }
23
- send_data("#{ret[0...-1]}\r\n")
24
- end
25
-
26
- # createhash hashname
27
- def ev_createhash(s)
28
- if s.length != 2
29
- send_data("CLIENT_ERROR usage:createhash hashname\r\n")
30
- return
31
- end
32
- res = broadcast_cmd("rcreatehash #{s[1]}\r\n")
33
- res[@stats.ap_str] = createhash(s[1])
34
- send_data("#{res.inspect}\r\n")
35
- end
36
-
37
- # rcreatehash hashname
38
- def ev_rcreatehash(s)
39
- if s.length != 2
40
- send_data("CLIENT_ERROR usage:createhash hashname\r\n")
41
- return
42
- end
43
- send_data("#{createhash(s[1])}\r\n")
44
- end
45
-
46
- def createhash(hname)
47
- if @storages.key?(hname)
48
- return "SERVER_ERROR #{hname} already exists."
49
- end
50
- st = Roma::Config::STORAGE_CLASS.new
51
- st.storage_path = "#{@stats.ap_str}/#{hname}"
52
- st.vn_list = @rttable.vnodes
53
- st.divnum = Roma::Config::STORAGE_DIVNUM
54
- st.option = Roma::Config::STORAGE_OPTION
55
- @storages[hname] = st
56
- @storages[hname].opendb
57
- @log.info("createhash #{hname}")
58
- return "CREATED"
59
- rescue =>e
60
- @log.error("#{e}")
61
- end
62
- private :createhash
63
-
64
- # deletehash hashname
65
- def ev_deletehash(s)
66
- if s.length != 2
67
- send_data("CLIENT_ERROR usage:deletehash hashname\r\n")
68
- return
69
- end
70
- res = broadcast_cmd("rdeletehash #{s[1]}\r\n")
71
- res[@stats.ap_str] = deletehash(s[1])
72
- send_data("#{res.inspect}\r\n")
73
- end
74
-
75
- # rdeletehash hashname
76
- def ev_rdeletehash(s)
77
- if s.length != 2
78
- send_data("CLIENT_ERROR usage:rdeletehash hashname\r\n")
79
- return
80
- end
81
- send_data("#{deletehash(s[1])}\r\n")
82
- end
83
-
84
- def deletehash(hname)
85
- unless @storages.key?(hname)
86
- return "SERVER_ERROR #{hname} dose not exists."
87
- end
88
- if hname == 'roma'
89
- return "SERVER_ERROR the hash name of 'roma' can't delete."
90
- end
91
- st = @storages[hname]
92
- @storages.delete(hname)
93
- st.closedb
94
- rm_rf("#{@stats.ap_str}/#{hname}")
95
- @log.info("deletehash #{hname}")
96
- return "DELETED"
97
- rescue =>e
98
- @log.error("#{e}")
99
- end
100
- private :deletehash
101
-
102
- # looked like a "rm -rf" command
103
- def rm_rf(fname)
104
- return unless File.exists?(fname)
105
- if File::directory?(fname)
106
- Dir["#{fname}/*"].each{|f| rm_rf(f) }
107
- Dir.rmdir(fname)
108
- else
109
- File.delete(fname)
110
- end
111
- end
112
- private :rm_rf
113
-
114
- end # MultiHashCommandReceiver
115
-
116
- end # module Command
117
- end # module Roma
@@ -1,287 +0,0 @@
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/st_command_receiver'
8
- require 'roma/command/util_command_receiver'
9
- require 'roma/command/mh_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 StorageCommandReceiver
19
- include UtilCommandReceiver
20
- include MultiHashCommandReceiver
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
- # balse [reason]
30
- def ev_balse(s)
31
- send_data("Are you sure?(yes/no)\r\n")
32
- if gets != "yes\r\n"
33
- close_connection_after_writing
34
- return
35
- end
36
-
37
- if s.length == 2
38
- @log.info("Receive a balse #{s[1]}")
39
- else
40
- @log.info("Receive a balse command.")
41
- end
42
- @rttable.enabled_failover = false
43
- res = broadcast_cmd("rbalse\r\n")
44
- send_data("#{res.inspect}\r\n")
45
- close_connection_after_writing
46
- @stop_event_loop = true
47
- end
48
-
49
- # rbalse [reason]
50
- def ev_rbalse(s)
51
- if s.length == 2
52
- @log.info("Receive a rbalse #{s[1]}")
53
- else
54
- @log.info("Receive a rbalse command.")
55
- end
56
- @rttable.enabled_failover = false
57
- send_data("BYE\r\n")
58
- close_connection_after_writing
59
- @stop_event_loop = true
60
- end
61
-
62
- # version
63
- def ev_version(s)
64
- send_data("VERSION #{Roma::VERSION}\r\n")
65
- end
66
-
67
- # quit
68
- def ev_quit(s)
69
- close_connection
70
- end
71
-
72
- def ev_whoami(s)
73
- send_data("#{@stats.name}\r\n")
74
- end
75
-
76
- # stats [regexp]
77
- def ev_stats(s); ev_stat(s); end
78
-
79
- # stat [regexp]
80
- def ev_stat(s)
81
- regexp = s[1] if s.length == 2
82
- h = {}
83
- h['version'] = Roma::VERSION
84
- send_stat_result(nil,h,regexp)
85
- send_stat_result(nil,Roma::Config.get_stat,regexp)
86
- send_stat_result(nil,@stats.get_stat,regexp)
87
- @storages.each{|hname,st|
88
- send_stat_result("storages[#{hname}].",st.get_stat,regexp)
89
- }
90
- send_stat_result(nil,$roma.wb_get_stat,regexp)
91
- send_stat_result(nil,@rttable.get_stat(@stats.ap_str),regexp)
92
- send_data("END\r\n")
93
- end
94
-
95
- def send_stat_result(prefix,h,regexp = nil)
96
- h.each{|k,v|
97
- if prefix
98
- key = "#{prefix}#{k}"
99
- else
100
- key = "#{k}"
101
- end
102
- if regexp
103
- send_data("#{key} #{v}\r\n") if key =~ /#{regexp}/
104
- else
105
- send_data("#{key} #{v}\r\n")
106
- end
107
- }
108
- end
109
- private :send_stat_result
110
-
111
- # writebehind_rotate [hash_name]
112
- def ev_writebehind_rotate(s)
113
- if s.length < 2
114
- return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
115
- end
116
- res = broadcast_cmd("rwritebehind_rotate #{s[1]}\r\n")
117
-
118
- if $roma.wb_rotate(s[1])
119
- res[@stats.ap_str] = "ROTATED"
120
- else
121
- res[@stats.ap_str] = "NOT_OPEND"
122
- end
123
- send_data("#{res}\r\n")
124
- end
125
-
126
- # rwritebehind_rotate [hash_name]
127
- def ev_rwritebehind_rotate(s)
128
- if s.length < 2
129
- return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
130
- end
131
- if $roma.wb_rotate(s[1])
132
- send_data("ROTATED\r\n")
133
- else
134
- send_data("NOT_OPEND\r\n")
135
- end
136
- end
137
-
138
- # writebehind_get_path [hash_name]
139
- def ev_writebehind_get_path(s)
140
- if s.length < 2
141
- return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
142
- end
143
- res = broadcast_cmd("rwritebehind_get_path #{s[1]}\r\n")
144
-
145
- ret = $roma.wb_get_path(s[1])
146
- res[@stats.ap_str] = ret
147
-
148
- send_data("#{res}\r\n")
149
- end
150
-
151
- # rwritebehind_get_path [hash_name]
152
- def ev_rwritebehind_get_path(s)
153
- if s.length < 2
154
- return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
155
- end
156
-
157
- ret = $roma.wb_get_path(s[1])
158
- send_data("#{ret}\r\n")
159
- end
160
-
161
- # writebehind_get_current_file [hash_name]
162
- def ev_writebehind_get_current_file(s)
163
- if s.length < 2
164
- return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
165
- end
166
- res = broadcast_cmd("rwritebehind_get_current_file #{s[1]}\r\n")
167
-
168
- ret = $roma.wb_get_current_file_path(s[1])
169
- if ret
170
- res[@stats.ap_str] = ret
171
- else
172
- res[@stats.ap_str] = "NOT_OPEND"
173
- end
174
- send_data("#{res}\r\n")
175
- end
176
-
177
- # rwritebehind_get_current_file [hash_name]
178
- def ev_rwritebehind_get_current_file(s)
179
- if s.length < 2
180
- return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
181
- end
182
- ret = $roma.wb_get_current_file_path(s[1])
183
- if ret
184
- send_data("#{ret}\r\n")
185
- else
186
- send_data("NOT_OPEND\r\n")
187
- end
188
- end
189
-
190
- # dcnice command is setting priority for a data-copy thread.
191
- # a niceness of 1 is the highest priority and 5 is the lowest priority.
192
- # dcnice <priority:1 to 5>
193
- def ev_dcnice(s)
194
- if s.length < 2
195
- return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
196
- end
197
- res = broadcast_cmd("rdcnice #{s[1]}\r\n")
198
- res[@stats.ap_str] = dcnice(s[1].to_i)
199
- send_data("#{res}\r\n")
200
- end
201
-
202
- def ev_rdcnice(s)
203
- if s.length < 2
204
- return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
205
- end
206
-
207
- send_data("#{dcnice(s[1].to_i)}\r\n")
208
- end
209
-
210
- def ev_restart(s)
211
- res = broadcast_cmd("rrestart\r\n")
212
- $roma.eventloop = true
213
- EventMachine::stop_event_loop
214
- res[@stats.ap_str] = "RESTARTED"
215
- send_data("#{res}\r\n")
216
- end
217
-
218
- def ev_rrestart(s)
219
- $roma.eventloop = true
220
- EventMachine::stop_event_loop
221
- send_data("RESTARTED\r\n")
222
- end
223
-
224
- # set_log_level [ 'debug' | 'info' | 'warn' | 'error' ]
225
- def ev_set_log_level(s)
226
- if s.length < 2
227
- return send_data("CLIENT_ERROR number of arguments (0 for 1)\r\n")
228
- end
229
-
230
- case s[1].downcase
231
- when 'debug'
232
- @log.level = Roma::Logging::RLogger::Severity::DEBUG
233
- when 'info'
234
- @log.level = Roma::Logging::RLogger::Severity::INFO
235
- when 'warn'
236
- @log.level = Roma::Logging::RLogger::Severity::WARN
237
- when 'error'
238
- @log.level = Roma::Logging::RLogger::Severity::ERROR
239
- else
240
- return send_data("CLIENT_ERROR no match log-level string\r\n")
241
- end
242
- send_data("STORED\r\n")
243
- end
244
-
245
- private
246
-
247
- def dcnice(p)
248
- case(p)
249
- when 1 # highest priority
250
- @stats.stream_copy_wait_param = 0.001
251
- @storages.each_value{|st|
252
- st.each_vn_dump_sleep = 0.001
253
- st.each_vn_dump_sleep_count = 1000
254
- }
255
- when 2
256
- @stats.stream_copy_wait_param = 0.005
257
- @storages.each_value{|st|
258
- st.each_vn_dump_sleep = 0.005
259
- st.each_vn_dump_sleep_count = 100
260
- }
261
- when 3 # default priority
262
- @stats.stream_copy_wait_param = 0.01
263
- @storages.each_value{|st|
264
- st.each_vn_dump_sleep = 0.001
265
- st.each_vn_dump_sleep_count = 10
266
- }
267
- when 4
268
- @stats.stream_copy_wait_param = 0.01
269
- @storages.each_value{|st|
270
- st.each_vn_dump_sleep = 0.005
271
- st.each_vn_dump_sleep_count = 10
272
- }
273
- when 5 # lowest priority
274
- @stats.stream_copy_wait_param = 0.01
275
- @storages.each_value{|st|
276
- st.each_vn_dump_sleep = 0.01
277
- st.each_vn_dump_sleep_count = 10
278
- }
279
- else
280
- return "CLIENT_ERROR You sholud input a priority from 1 to 5."
281
- end
282
- "STORED"
283
- end
284
- end # class Receiver < Roma::Event::Handler
285
-
286
- end # module Command
287
- end # module Roma
@@ -1,159 +0,0 @@
1
- #
2
- # File: handler.rb
3
- #
4
- require 'eventmachine'
5
- require 'roma/event/con_pool'
6
- require 'roma/logging/rlogger'
7
- require 'socket'
8
-
9
- module Roma
10
- module Event
11
-
12
- class Handler < EventMachine::Connection
13
- @@ev_list={}
14
-
15
- attr :stop_event_loop
16
- attr :connected
17
- attr :fiber
18
- attr :rbuf
19
-
20
- attr :storages
21
- attr :rttable
22
- attr_accessor :timeout
23
- attr_reader :lastcmd
24
-
25
- def initialize(storages, rttable)
26
- @rbuf=''
27
- unless has_event?
28
- public_methods.each{|m|
29
- if m.to_s.start_with?('ev_')
30
- add_event(m.to_s[3..-1],m)
31
- end
32
- }
33
- end
34
-
35
- @storages = storages
36
- @rttable = rttable
37
- @timeout = 10
38
- @log = Roma::Logging::RLogger.instance
39
- end
40
-
41
- def post_init
42
- @addr = Socket.unpack_sockaddr_in(get_peername)
43
- @log.info("Connected from #{@addr[1]}:#{@addr[0]}")
44
- @connected = true
45
- @fiber = Fiber.new { dispatcher }
46
- end
47
-
48
- def receive_data(data)
49
- @rbuf << data
50
- @fiber.resume
51
- rescue =>e
52
- @log.error("#{__FILE__}:#{__LINE__}:#{@addr[1]}:#{@addr[0]} #{e.inspect} #{$@}")
53
- end
54
-
55
- def unbind
56
- @connected=false
57
- @fiber.resume
58
- EventMachine::stop_event_loop if @stop_event_loop
59
- @log.info("Disconnected from #{@addr[1]}:#{@addr[0]}")
60
- rescue =>e
61
- @log.warn("#{__FILE__}:#{__LINE__}:#{@addr[1]}:#{@addr[0]} #{e.inspect} #{$@}")
62
- end
63
-
64
- protected
65
-
66
- def has_event?
67
- @@ev_list.length!=0
68
- end
69
-
70
- def add_event(c,m)
71
- @@ev_list[c]=m
72
- end
73
-
74
- def exit
75
- EventMachine::stop_event_loop
76
- end
77
-
78
- private
79
-
80
- def get_connection(ap)
81
- con=Roma::Event::EMConPool::instance.get_connection(ap)
82
- con.fiber=@fiber
83
- con
84
- end
85
-
86
- def return_connection(ap,con)
87
- Roma::Event::EMConPool.instance.return_connection(ap,con)
88
- end
89
-
90
- def dispatcher
91
- while(@connected) do
92
- next unless s=gets
93
- s=s.chomp.split(/ /)
94
- if s[0] && @@ev_list.key?(s[0].downcase)
95
- send(@@ev_list[s[0].downcase],s)
96
- @lastcmd=s
97
- elsif s.length==0
98
- next
99
- elsif s[0]=='!!'
100
- send(@@ev_list[@lastcmd[0].downcase],@lastcmd)
101
- else
102
- @log.warn("command error:#{s}")
103
- send_data("ERROR\r\n")
104
- close_connection_after_writing
105
- end
106
- end
107
- rescue =>e
108
- @log.warn("#{__FILE__}:#{__LINE__}:#{@addr[1]}:#{@addr[0]} #{e} #{$@}")
109
- close_connection
110
- end
111
-
112
- def pop(size)
113
- if @rbuf.size >= size
114
- r = @rbuf[0..size-1]
115
- @rbuf = @rbuf[size..-1]
116
- r
117
- else
118
- nil
119
- end
120
- end
121
-
122
- def read_bytes(size, mult = 1)
123
- t=Time.now.to_i
124
- while(@connected) do
125
- d = pop(size)
126
- if d
127
- return d
128
- else
129
- remain = size - @rbuf.size
130
- Fiber.yield(remain)
131
- if Time.now.to_i - t > @timeout * mult
132
- @log.warn("#{__FILE__}:#{__LINE__}:#{@addr[1]}:#{@addr[0]} read_bytes time out");
133
- close_connection
134
- return nil
135
- end
136
- end
137
- end
138
- nil
139
- end
140
-
141
- def gets
142
- while(@connected) do
143
- if idx=@rbuf.index("\n")
144
- return pop(idx+1)
145
- else
146
- Fiber.yield(@rbuf.size)
147
- end
148
- end
149
- nil
150
- end
151
-
152
- def detach_socket
153
- @connected = false
154
- Socket::for_fd(detach)
155
- end
156
- end
157
-
158
- end
159
- end