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.
- data/CHANG +326 -0
- data/CHANGELOG +132 -0
- data/{README.rdoc → FETCH_HEAD} +0 -0
- data/{LICENSE.rdoc → LICENSE} +0 -1
- data/README +17 -0
- data/Rakefile +33 -18
- data/ruby/server/bin/chg_redundancy +10 -0
- data/ruby/server/bin/key_access +7 -0
- data/ruby/server/bin/key_list +7 -0
- data/ruby/server/bin/mkconfig +19 -0
- data/{bin → ruby/server/bin}/mkrecent +0 -1
- data/{bin → ruby/server/bin}/mkroute +0 -1
- data/ruby/server/bin/multi_commander +19 -0
- data/ruby/server/bin/recoverlost +10 -0
- data/ruby/server/bin/recoverlost_alist +10 -0
- data/ruby/server/bin/recoverlost_alist_all +10 -0
- data/ruby/server/bin/recoverlost_alist_keys +10 -0
- data/{bin/recoverlost → ruby/server/bin/roma_watcher} +1 -2
- data/ruby/server/bin/romad +36 -0
- data/{bin → ruby/server/bin}/sample_watcher +0 -1
- data/{bin → ruby/server/bin}/sample_watcher2 +0 -1
- data/{bin/simple_bench → ruby/server/bin/sample_watcher3} +1 -2
- data/ruby/server/bin/simple_bench +26 -0
- data/{bin → ruby/server/bin}/ssroute +0 -1
- data/ruby/server/bin/test-scenario +11 -0
- data/{bin → ruby/server/bin}/tribunus +0 -1
- data/{lib → ruby/server/lib}/roma/async_process.rb +67 -15
- data/{lib → ruby/server/lib}/roma/command/bg_command_receiver.rb +1 -1
- data/ruby/server/lib/roma/command/command_definition.rb +422 -0
- data/ruby/server/lib/roma/command/mh_command_receiver.rb +127 -0
- data/ruby/server/lib/roma/command/receiver.rb +64 -0
- data/{lib → ruby/server/lib}/roma/command/rt_command_receiver.rb +6 -1
- data/ruby/server/lib/roma/command/sys_command_receiver.rb +609 -0
- data/{lib → ruby/server/lib}/roma/command/util_command_receiver.rb +15 -5
- data/{lib → ruby/server/lib}/roma/command/vn_command_receiver.rb +12 -4
- data/{lib → ruby/server/lib}/roma/command_plugin.rb +0 -0
- data/ruby/server/lib/roma/config.rb +84 -0
- data/{lib → ruby/server/lib}/roma/event/con_pool.rb +12 -1
- data/ruby/server/lib/roma/event/handler.rb +256 -0
- data/ruby/server/lib/roma/live_patch-20120302-001.rb +107 -0
- data/ruby/server/lib/roma/logging/rlogger.rb +163 -0
- data/ruby/server/lib/roma/messaging/con_pool.rb +92 -0
- data/{lib → ruby/server/lib}/roma/plugin/plugin_alist.rb +118 -240
- data/ruby/server/lib/roma/plugin/plugin_debug.rb +31 -0
- data/ruby/server/lib/roma/plugin/plugin_map.rb +177 -0
- data/ruby/server/lib/roma/plugin/plugin_mapcount.rb +185 -0
- data/{lib/roma/command/st_command_receiver.rb → ruby/server/lib/roma/plugin/plugin_storage.rb} +170 -146
- data/ruby/server/lib/roma/plugin/plugin_stub.rb +283 -0
- data/{lib → ruby/server/lib}/roma/plugin/plugin_test.rb +0 -0
- data/{lib → ruby/server/lib}/roma/romad.rb +221 -94
- data/{lib → ruby/server/lib}/roma/routing/cb_rttable.rb +4 -6
- data/{lib → ruby/server/lib}/roma/routing/merkle_tree.rb +0 -0
- data/ruby/server/lib/roma/routing/routing_data.rb +307 -0
- data/{lib → ruby/server/lib}/roma/routing/rttable.rb +4 -0
- data/{lib → ruby/server/lib}/roma/stats.rb +19 -3
- data/{lib → ruby/server/lib}/roma/storage/basic_storage.rb +25 -26
- data/{lib → ruby/server/lib}/roma/storage/dbm_storage.rb +1 -23
- data/{lib → ruby/server/lib}/roma/storage/dummy_storage.rb +0 -0
- data/{lib → ruby/server/lib}/roma/storage/rh_storage.rb +0 -0
- data/{lib → ruby/server/lib}/roma/storage/sqlite3_storage.rb +0 -0
- data/{lib → ruby/server/lib}/roma/storage/tc_storage.rb +62 -2
- data/ruby/server/lib/roma/tools/chg_redundancy.rb +36 -0
- data/ruby/server/lib/roma/tools/key_access.rb +105 -0
- data/ruby/server/lib/roma/tools/key_list.rb +94 -0
- data/ruby/server/lib/roma/tools/mkconfig.rb +535 -0
- data/{lib → ruby/server/lib}/roma/tools/mkrecent.rb +0 -0
- data/{lib → ruby/server/lib}/roma/tools/mkroute.rb +0 -0
- data/ruby/server/lib/roma/tools/multi_commander.rb +45 -0
- data/{lib → ruby/server/lib}/roma/tools/recoverlost.rb +0 -0
- data/{lib → ruby/server/lib}/roma/tools/recoverlost_alist.rb +0 -0
- data/ruby/server/lib/roma/tools/recoverlost_alist_all.rb +8 -0
- data/ruby/server/lib/roma/tools/recoverlost_alist_keys.rb +16 -0
- data/ruby/server/lib/roma/tools/recoverlost_lib.rb +349 -0
- data/ruby/server/lib/roma/tools/roma_watcher.rb +150 -0
- data/ruby/server/lib/roma/tools/roma_watcher_config.yml.example +20 -0
- data/{lib → ruby/server/lib}/roma/tools/sample_watcher.rb +3 -1
- data/{lib → ruby/server/lib}/roma/tools/sample_watcher2.rb +3 -1
- data/ruby/server/lib/roma/tools/sample_watcher3.rb +49 -0
- data/{lib → ruby/server/lib}/roma/tools/simple_bench.rb +2 -0
- data/ruby/server/lib/roma/tools/simple_bench2.rb +78 -0
- data/{lib → ruby/server/lib}/roma/tools/ssroute.rb +0 -0
- data/ruby/server/lib/roma/tools/test-scenario.rb +327 -0
- data/{lib → ruby/server/lib}/roma/tools/tribunus.rb +0 -0
- data/ruby/server/lib/roma/version.rb +4 -0
- data/{lib → ruby/server/lib}/roma/write_behind.rb +1 -0
- data/ruby/server/test/config4mhash.rb +68 -0
- data/ruby/server/test/config4storage_error.rb +69 -0
- data/{lib/roma/config.rb → ruby/server/test/config4test.rb} +6 -3
- data/{test → ruby/server/test}/rcirb.rb +0 -1
- data/{test → ruby/server/test}/roma-test-utils.rb +21 -8
- data/{test → ruby/server/test}/run-test.rb +3 -2
- data/ruby/server/test/storage_error_storage.rb +37 -0
- data/ruby/server/test/t_command_definition.rb +326 -0
- data/{test → ruby/server/test}/t_cpdata.rb +9 -3
- data/{test → ruby/server/test}/t_listplugin.rb +48 -12
- data/ruby/server/test/t_mapcountplugin.rb +231 -0
- data/ruby/server/test/t_mapplugin.rb +131 -0
- data/ruby/server/test/t_mhash.rb +222 -0
- data/ruby/server/test/t_rclient.rb +199 -0
- data/{test → ruby/server/test}/t_routing_data.rb +56 -0
- data/{test → ruby/server/test}/t_storage.rb +107 -111
- data/ruby/server/test/t_storage_error.rb +61 -0
- data/ruby/server/test/t_writebehind.rb +374 -0
- metadata +150 -82
- data/bin/recoverlost_alist +0 -8
- data/bin/romad +0 -7
- data/lib/roma/command/mh_command_receiver.rb +0 -117
- data/lib/roma/command/receiver.rb +0 -287
- data/lib/roma/event/handler.rb +0 -159
- data/lib/roma/plugin/plugin_debug.rb +0 -19
- data/lib/roma/tools/recoverlost_lib.rb +0 -217
- data/lib/roma/version.rb +0 -4
- data/test/t_rclient.rb +0 -318
- data/test/t_writebehind.rb +0 -200
@@ -9,14 +9,14 @@ module Roma
|
|
9
9
|
con = get_connection(nid)
|
10
10
|
con.send(cmd)
|
11
11
|
res = con.gets
|
12
|
-
if res
|
13
|
-
|
12
|
+
if res == nil
|
13
|
+
@rttable.proc_failed(nid)
|
14
|
+
return nil
|
15
|
+
elsif res.start_with?("ERROR") == false
|
14
16
|
@rttable.proc_succeed(nid)
|
15
17
|
return_connection(nid, con)
|
16
|
-
else
|
17
|
-
@rttable.proc_failed(nid)
|
18
18
|
end
|
19
|
-
res
|
19
|
+
res.chomp
|
20
20
|
rescue => e
|
21
21
|
@rttable.proc_failed(nid)
|
22
22
|
@log.error("#{e}\n#{$@}")
|
@@ -61,6 +61,16 @@ module Roma
|
|
61
61
|
nil
|
62
62
|
end
|
63
63
|
|
64
|
+
# change to actual time for a memcached's expire time value
|
65
|
+
def chg_time_expt(expt)
|
66
|
+
if expt == 0
|
67
|
+
expt = 0x7fffffff
|
68
|
+
elsif expt < 2592000
|
69
|
+
expt += Time.now.to_i
|
70
|
+
end
|
71
|
+
expt
|
72
|
+
end
|
73
|
+
|
64
74
|
end # module UtilCommandReceiver
|
65
75
|
|
66
76
|
end # module Command
|
@@ -50,7 +50,8 @@ module Roma
|
|
50
50
|
vlen, = vlen_bin.unpack('N')
|
51
51
|
if vlen != 0
|
52
52
|
v = read_bytes(vlen, 100)
|
53
|
-
|
53
|
+
|
54
|
+
createhash(s[1]) unless @storages[s[1]]
|
54
55
|
if @storages[s[1]].load_stream_dump(vn, last, clk, expt, k, v)
|
55
56
|
count += 1
|
56
57
|
# @log.debug("#{__method__}:[#{vn} #{last} #{clk} #{expt} #{k}] was stored.")
|
@@ -59,6 +60,7 @@ module Roma
|
|
59
60
|
# @log.warn("#{__method__}:[#{vn} #{last} #{clk} #{expt} #{k}] was rejected.")
|
60
61
|
end
|
61
62
|
else
|
63
|
+
createhash(s[1]) unless @storages[s[1]]
|
62
64
|
if @storages[s[1]].load_stream_dump(vn, last, clk, expt, k, nil)
|
63
65
|
# @log.debug("#{__method__}:[#{vn} #{last} #{clk} #{expt} #{k}] was stored.")
|
64
66
|
count += 1
|
@@ -70,8 +72,16 @@ module Roma
|
|
70
72
|
}
|
71
73
|
send_data("STORED\r\n")
|
72
74
|
@log.debug("#{__method__}:#{s[2]} #{count} keys loaded. #{rcount} keys rejected.")
|
75
|
+
rescue Storage::StorageException => e
|
76
|
+
@log.error("#{e.inspect} #{$@}")
|
77
|
+
close_connection
|
78
|
+
if Config.const_defined?(:STORAGE_EXCEPTION_ACTION) &&
|
79
|
+
Config::STORAGE_EXCEPTION_ACTION == :shutdown
|
80
|
+
@log.error("Romad will stop")
|
81
|
+
@stop_event_loop = true
|
82
|
+
end
|
73
83
|
rescue => e
|
74
|
-
@log.error("#{e}
|
84
|
+
@log.error("#{e} #{$@}")
|
75
85
|
ensure
|
76
86
|
@stats.run_receive_a_vnode = false
|
77
87
|
end
|
@@ -85,13 +95,11 @@ module Roma
|
|
85
95
|
send_data("CLIENT_ERROR usage:reqpushv vnode-id node-id primary-flag(true/false)\r\n")
|
86
96
|
return
|
87
97
|
end
|
88
|
-
|
89
98
|
if @stats.run_iterate_storage == true
|
90
99
|
@log.warn("reqpushv rejected:#{s}")
|
91
100
|
send_data("REJECTED\r\n")
|
92
101
|
return
|
93
102
|
end
|
94
|
-
|
95
103
|
Roma::AsyncProcess::queue.push(Roma::AsyncMessage.new('reqpushv',[s[1],s[2],s[3]]))
|
96
104
|
send_data("PUSHED\r\n")
|
97
105
|
rescue =>e
|
File without changes
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'roma/storage/rh_storage'
|
2
|
+
|
3
|
+
module Roma
|
4
|
+
|
5
|
+
module Config
|
6
|
+
DEFAULT_PORT = 12000
|
7
|
+
DEFAULT_NAME = 'ROMA'
|
8
|
+
|
9
|
+
# :no_action | :auto_assign | :shutdown
|
10
|
+
DEFAULT_LOST_ACTION = :auto_assign
|
11
|
+
|
12
|
+
# failover setting
|
13
|
+
# threshold of failover occurrence
|
14
|
+
ROUTING_FAIL_CNT_THRESHOLD = 15
|
15
|
+
# ROUTING_FAIL_CNT_GAP(sec) doesn't increase the failover counter.
|
16
|
+
ROUTING_FAIL_CNT_GAP = 0
|
17
|
+
|
18
|
+
# log setting
|
19
|
+
LOG_SHIFT_AGE = 10
|
20
|
+
LOG_SHIFT_SIZE = 1024 * 1024 * 10
|
21
|
+
LOG_PATH = '.'
|
22
|
+
# :debug | :info | :warn | :error
|
23
|
+
LOG_LEVEL = :debug
|
24
|
+
|
25
|
+
# routing setting
|
26
|
+
RTTABLE_PATH = '.'
|
27
|
+
|
28
|
+
# connection setting
|
29
|
+
|
30
|
+
# to use a system call of epoll, CONNECTION_USE_EPOLL is to set true
|
31
|
+
CONNECTION_USE_EPOLL = true
|
32
|
+
# to use a system call of epoll, CONNECTION_DESCRIPTOR_TABLE_SIZE can be setting
|
33
|
+
CONNECTION_DESCRIPTOR_TABLE_SIZE = 4096
|
34
|
+
|
35
|
+
# like a MaxStartups spec in the sshd_config
|
36
|
+
# 'start:rate:full'
|
37
|
+
CONNECTION_CONTINUOUS_LIMIT = '200:30:300'
|
38
|
+
# expired time(sec) for accepted connections
|
39
|
+
CONNECTION_EXPTIME = 0
|
40
|
+
|
41
|
+
# expired time(sec) for an async connection in the connection pool
|
42
|
+
# CONNECTION_POOL_EXPTIME should be less than CONNECTION_EXPTIME
|
43
|
+
CONNECTION_POOL_EXPTIME = 30
|
44
|
+
# max length of the connection pool
|
45
|
+
CONNECTION_POOL_MAX = 5
|
46
|
+
|
47
|
+
# expired time(sec) for an eventmachine's connection in the connection pool
|
48
|
+
# CONNECTION_EMPOOL_EXPTIME should be less than CONNECTION_EXPTIME
|
49
|
+
CONNECTION_EMPOOL_EXPTIME = 30
|
50
|
+
# max length of the eventmachine's connection pool
|
51
|
+
CONNECTION_EMPOOL_MAX = 15
|
52
|
+
|
53
|
+
# storage setting
|
54
|
+
STORAGE_CLASS = Roma::Storage::RubyHashStorage
|
55
|
+
STORAGE_DIVNUM = 10
|
56
|
+
STORAGE_PATH = '.'
|
57
|
+
STORAGE_DUMP_PATH = '/tmp'
|
58
|
+
STORAGE_OPTION = ''
|
59
|
+
# :no_action | :shutdown
|
60
|
+
STORAGE_EXCEPTION_ACTION = :no_action
|
61
|
+
|
62
|
+
# expired time(sec) for deleted keys, expired keys and invalid vnode keys
|
63
|
+
# typical value is 5 days
|
64
|
+
STORAGE_DELMARK_EXPTIME = 60 * 60 * 24 * 5
|
65
|
+
|
66
|
+
# data copy setting
|
67
|
+
DATACOPY_STREAM_COPY_WAIT_PARAM = 0.001
|
68
|
+
|
69
|
+
# plugin setting
|
70
|
+
PLUGIN_FILES = ['plugin_storage.rb']
|
71
|
+
|
72
|
+
# write-behind setting
|
73
|
+
WRITEBEHIND_PATH = './wb'
|
74
|
+
WRITEBEHIND_SHIFT_SIZE = 1024 * 1024 * 10
|
75
|
+
|
76
|
+
# redundant setting
|
77
|
+
# REDUNDANT_ZREDUNDANT_SIZE is a option for a redundancy of compressed data.
|
78
|
+
# when the data size is more then REDUNDANT_ZREDUNDANT_SIZE, data compression is done.
|
79
|
+
# however, it dose't in case of REDUNDANT_ZREDUNDANT_SIZE is zero.
|
80
|
+
REDUNDANT_ZREDUNDANT_SIZE = 0
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
@@ -11,10 +11,12 @@ module Roma
|
|
11
11
|
attr_writer :fiber
|
12
12
|
attr_reader :connected
|
13
13
|
attr_accessor :ap
|
14
|
+
attr_accessor :last_access
|
14
15
|
|
15
16
|
def post_init
|
16
17
|
@rbuf = ''
|
17
18
|
@connected = true
|
19
|
+
@last_access = Time.now
|
18
20
|
end
|
19
21
|
|
20
22
|
def receive_data(data)
|
@@ -76,21 +78,30 @@ module Roma
|
|
76
78
|
include Singleton
|
77
79
|
attr :pool
|
78
80
|
attr_accessor :maxlength
|
81
|
+
attr_accessor :expire_time
|
79
82
|
|
80
83
|
def initialize
|
81
84
|
@pool = {}
|
82
|
-
@maxlength =
|
85
|
+
@maxlength = 30
|
86
|
+
@expire_time = 30
|
83
87
|
@lock = Mutex.new
|
84
88
|
end
|
85
89
|
|
86
90
|
def get_connection(ap)
|
87
91
|
ret = @pool[ap].shift if @pool.key?(ap) && @pool[ap].length > 0
|
92
|
+
if ret && ret.last_access < Time.now - @expire_time
|
93
|
+
ret.close_connection if ret.connected
|
94
|
+
ret = nil
|
95
|
+
Logging::RLogger.instance.info("EM connection expired at #{ap},remains #{@pool[ap].length}")
|
96
|
+
end
|
88
97
|
ret = create_connection(ap) if ret == nil || ret.connected != true
|
89
98
|
ret
|
90
99
|
end
|
91
100
|
|
92
101
|
def return_connection(ap, con)
|
93
102
|
return if con.connected == false
|
103
|
+
|
104
|
+
con.last_access = Time.now
|
94
105
|
if @pool.key?(ap) && @pool[ap].length > 0
|
95
106
|
if @pool[ap].length > @maxlength
|
96
107
|
con.close_connection
|
@@ -0,0 +1,256 @@
|
|
1
|
+
#
|
2
|
+
# File: handler.rb
|
3
|
+
#
|
4
|
+
require 'eventmachine'
|
5
|
+
require 'roma/event/con_pool'
|
6
|
+
require 'roma/logging/rlogger'
|
7
|
+
require 'roma/stats'
|
8
|
+
require 'roma/storage/basic_storage'
|
9
|
+
require 'socket'
|
10
|
+
|
11
|
+
module Roma
|
12
|
+
module Event
|
13
|
+
|
14
|
+
class Handler < EventMachine::Connection
|
15
|
+
@@ev_list={}
|
16
|
+
def self.ev_list; @@ev_list; end
|
17
|
+
@@system_commands={}
|
18
|
+
def self.system_commands; @@system_commands; end
|
19
|
+
|
20
|
+
@@ccl_start = 200
|
21
|
+
@@ccl_rate = 30
|
22
|
+
@@ccl_full = 300
|
23
|
+
|
24
|
+
def self.get_ccl
|
25
|
+
"#{@@ccl_start}:#{@@ccl_rate}:#{@@ccl_full}"
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.set_ccl(ccl)
|
29
|
+
if ccl =~ /^(\d+):(\d+):(\d+)$/
|
30
|
+
s,r,f = $1.to_i,$2.to_i,$3.to_i
|
31
|
+
return false if(s < 0 || f < 0 || r < 0 || r > 100 || s > f)
|
32
|
+
@@ccl_start = s
|
33
|
+
@@ccl_rate = r
|
34
|
+
@@ccl_full = f
|
35
|
+
return true
|
36
|
+
else
|
37
|
+
return false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
@@connections = {}
|
42
|
+
def self.connections; @@connections; end
|
43
|
+
|
44
|
+
@@connection_expire_time = 60
|
45
|
+
def self.connection_expire_time=(t)
|
46
|
+
@@connection_expire_time = t
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.connection_expire_time
|
50
|
+
@@connection_expire_time
|
51
|
+
end
|
52
|
+
|
53
|
+
attr_accessor :timeout
|
54
|
+
attr_reader :connected
|
55
|
+
attr_reader :lastcmd
|
56
|
+
attr_reader :last_access
|
57
|
+
attr_reader :addr, :port
|
58
|
+
|
59
|
+
def initialize(storages, rttable)
|
60
|
+
@rbuf=''
|
61
|
+
unless has_event?
|
62
|
+
public_methods.each{|m|
|
63
|
+
if m.to_s.start_with?('ev_')
|
64
|
+
add_event(m.to_s[3..-1],m)
|
65
|
+
end
|
66
|
+
}
|
67
|
+
end
|
68
|
+
@th1 = 100
|
69
|
+
@close_rate = 70
|
70
|
+
@th2 = 200
|
71
|
+
|
72
|
+
@storages = storages
|
73
|
+
@rttable = rttable
|
74
|
+
@timeout = 10
|
75
|
+
@log = Roma::Logging::RLogger.instance
|
76
|
+
@last_access = Time.now
|
77
|
+
end
|
78
|
+
|
79
|
+
def post_init
|
80
|
+
@port, @addr = Socket.unpack_sockaddr_in(get_peername)
|
81
|
+
@log.info("Connected from #{@addr}:#{@port}. I have #{EM.connection_count} connections.")
|
82
|
+
@connected = true
|
83
|
+
@last_access = Time.now
|
84
|
+
@@connections[self] = @last_access
|
85
|
+
@fiber = Fiber.new { dispatcher }
|
86
|
+
rescue Exception =>e
|
87
|
+
@log.error("#{__FILE__}:#{__LINE__}:#{e.inspect} #{$@}")
|
88
|
+
end
|
89
|
+
|
90
|
+
def receive_data(data)
|
91
|
+
@rbuf << data
|
92
|
+
@last_access = Time.now
|
93
|
+
@fiber.resume
|
94
|
+
rescue Exception =>e
|
95
|
+
@log.error("#{__FILE__}:#{__LINE__}:#{@addr}:#{@port} #{e.inspect} #{$@}")
|
96
|
+
end
|
97
|
+
|
98
|
+
def unbind
|
99
|
+
@connected=false
|
100
|
+
begin
|
101
|
+
@fiber.resume
|
102
|
+
rescue FiberError
|
103
|
+
end
|
104
|
+
EventMachine::stop_event_loop if @stop_event_loop
|
105
|
+
@@connections.delete(self)
|
106
|
+
if @enter_time
|
107
|
+
# hilatency check
|
108
|
+
ps = Time.now - @enter_time
|
109
|
+
if ps > @stats.hilatency_warn_time
|
110
|
+
@log.warn("#{@lastcmd} has incompleted, passage of #{ps} seconds")
|
111
|
+
end
|
112
|
+
end
|
113
|
+
@log.info("Disconnected from #{@addr}:#{@port}")
|
114
|
+
rescue Exception =>e
|
115
|
+
@log.warn("#{__FILE__}:#{__LINE__}:#{@addr}:#{@port} #{e.inspect} #{$@}")
|
116
|
+
end
|
117
|
+
|
118
|
+
protected
|
119
|
+
|
120
|
+
def has_event?
|
121
|
+
@@ev_list.length!=0
|
122
|
+
end
|
123
|
+
|
124
|
+
def add_event(c,m)
|
125
|
+
@@ev_list[c]=m
|
126
|
+
end
|
127
|
+
|
128
|
+
def exit
|
129
|
+
EventMachine::stop_event_loop
|
130
|
+
end
|
131
|
+
|
132
|
+
private
|
133
|
+
|
134
|
+
def get_connection(ap)
|
135
|
+
con=Roma::Event::EMConPool::instance.get_connection(ap)
|
136
|
+
con.fiber=@fiber
|
137
|
+
con
|
138
|
+
end
|
139
|
+
|
140
|
+
def return_connection(ap,con)
|
141
|
+
Roma::Event::EMConPool.instance.return_connection(ap,con)
|
142
|
+
end
|
143
|
+
|
144
|
+
def dispatcher
|
145
|
+
@stats = Roma::Stats.instance
|
146
|
+
while(@connected) do
|
147
|
+
@enter_time = nil
|
148
|
+
next unless s=gets
|
149
|
+
@enter_time = Time.now
|
150
|
+
s=s.chomp.split(/ /)
|
151
|
+
if s[0] && @@ev_list.key?(s[0].downcase)
|
152
|
+
send(@@ev_list[s[0].downcase],s)
|
153
|
+
@lastcmd=s
|
154
|
+
next if @@system_commands.key?(s[0].downcase)
|
155
|
+
elsif s.length==0
|
156
|
+
next
|
157
|
+
elsif s[0]=='!!'
|
158
|
+
send(@@ev_list[@lastcmd[0].downcase],@lastcmd)
|
159
|
+
next if @@system_commands.key?(@lastcmd[0].downcase)
|
160
|
+
else
|
161
|
+
@log.warn("command error:#{s}")
|
162
|
+
send_data("ERROR\r\n")
|
163
|
+
close_connection_after_writing
|
164
|
+
end
|
165
|
+
|
166
|
+
# hilatency check
|
167
|
+
ps = Time.now - @enter_time
|
168
|
+
if ps > @stats.hilatency_warn_time
|
169
|
+
@log.warn("hilatency occurred in #{@lastcmd} put in a #{ps} seconds")
|
170
|
+
end
|
171
|
+
|
172
|
+
d = EM.connection_count - @@ccl_start
|
173
|
+
if d > 0 &&
|
174
|
+
rand(100) < @@ccl_rate + (100 - @@ccl_rate) * d / (@@ccl_full - @@ccl_start)
|
175
|
+
send_data("ERROR\r\n")
|
176
|
+
close_connection_after_writing
|
177
|
+
@log.warn("Connection count > #{@@ccl_start}:closed")
|
178
|
+
end
|
179
|
+
end
|
180
|
+
rescue Storage::StorageException => e
|
181
|
+
@log.error("#{e.inspect} #{s} #{$@}")
|
182
|
+
send_data("SERVER_ERROR #{e} in storage engine\r\n")
|
183
|
+
close_connection_after_writing
|
184
|
+
if Config.const_defined?(:STORAGE_EXCEPTION_ACTION) &&
|
185
|
+
Config::STORAGE_EXCEPTION_ACTION == :shutdown
|
186
|
+
@log.error("Romad will stop")
|
187
|
+
@stop_event_loop = true
|
188
|
+
end
|
189
|
+
rescue Exception =>e
|
190
|
+
@log.warn("#{__FILE__}:#{__LINE__}:#{@addr}:#{@port} #{e} #{$@}")
|
191
|
+
close_connection
|
192
|
+
end
|
193
|
+
|
194
|
+
def pop(size)
|
195
|
+
return '' if size == 0
|
196
|
+
if @rbuf.size >= size
|
197
|
+
r = @rbuf[0..size-1]
|
198
|
+
@rbuf = @rbuf[size..-1]
|
199
|
+
r
|
200
|
+
else
|
201
|
+
nil
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def read_bytes(size, mult = 1)
|
206
|
+
t=Time.now.to_i
|
207
|
+
while(@connected) do
|
208
|
+
d = pop(size)
|
209
|
+
if d
|
210
|
+
return d
|
211
|
+
else
|
212
|
+
remain = size - @rbuf.size
|
213
|
+
Fiber.yield(remain)
|
214
|
+
if Time.now.to_i - t > @timeout * mult
|
215
|
+
@log.warn("#{__FILE__}:#{__LINE__}:#{@addr}:#{@port} read_bytes time out");
|
216
|
+
close_connection
|
217
|
+
return nil
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
nil
|
222
|
+
end
|
223
|
+
|
224
|
+
def gets
|
225
|
+
while(@connected) do
|
226
|
+
if idx=@rbuf.index("\n")
|
227
|
+
return pop(idx+1)
|
228
|
+
else
|
229
|
+
Fiber.yield(@rbuf.size)
|
230
|
+
end
|
231
|
+
end
|
232
|
+
nil
|
233
|
+
end
|
234
|
+
|
235
|
+
def detach_socket
|
236
|
+
@connected = false
|
237
|
+
Socket::for_fd(detach)
|
238
|
+
end
|
239
|
+
|
240
|
+
def conn_get_stat
|
241
|
+
ret = {}
|
242
|
+
ret["connection.count"] = EM.connection_count
|
243
|
+
ret["connection.continuous_limit"] = Handler.get_ccl
|
244
|
+
ret["connection.accepted_connection_expire_time"] = Handler.connection_expire_time
|
245
|
+
ret["connection.handler_instance_count"] = Handler.connections.length
|
246
|
+
ret["connection.pool_maxlength"] = Messaging::ConPool.instance.maxlength
|
247
|
+
ret["connection.pool_expire_time"] = Messaging::ConPool.instance.expire_time
|
248
|
+
ret["connection.EMpool_maxlength"] = Event::EMConPool::instance.maxlength
|
249
|
+
ret["connection.EMpool_expire_time"] = Event::EMConPool.instance.expire_time
|
250
|
+
ret
|
251
|
+
end
|
252
|
+
|
253
|
+
end # class Handler < EventMachine::Connection
|
254
|
+
|
255
|
+
end # module Event
|
256
|
+
end # module Roma
|