dango 0.4.3 → 0.4.5
Sign up to get free protection for your applications and to get access to all the features.
@@ -19,8 +19,12 @@ module DangoControllerPlugin
|
|
19
19
|
config = dango_server_config(options)
|
20
20
|
raise("backdoor_run_drb_server is false.") if !config['server']['backdoor_run_drb_server']
|
21
21
|
drb_uri = "druby://#{config['network']['host']}:#{config['server']['backdoor_run_drb_port']}"
|
22
|
-
|
23
|
-
|
22
|
+
begin
|
23
|
+
drb_obj = DRbObject.new_with_uri(drb_uri)
|
24
|
+
drb_obj.__send__(method_name.to_s, arg)
|
25
|
+
rescue Exception
|
26
|
+
raise("DRbError:#{$!.class} #{$!.message} #{$!.backtrace.inspect}")
|
27
|
+
end
|
24
28
|
end
|
25
29
|
end
|
26
30
|
|
data/lib/dango/framework_base.rb
CHANGED
@@ -68,7 +68,8 @@ module ErrorMessage
|
|
68
68
|
"#{exception_class.class} is not Exception class"
|
69
69
|
end
|
70
70
|
|
71
|
-
str = "#{exception_class.class}:#{exception_class.message}\n
|
71
|
+
str = "#{exception_class.class}:#{exception_class.message}\n" +
|
72
|
+
"#{exception_class.backtrace.pretty_inspect}"
|
72
73
|
if code.to_s.downcase == "u" || code.to_s.downcase == "utf8"
|
73
74
|
str = str.toutf8
|
74
75
|
elsif code.to_s.downcase == "s" || code.to_s.downcase == "sjis"
|
@@ -103,6 +104,9 @@ module DangoFrameworkModule
|
|
103
104
|
CommMaxDigit = 5 # 通信の最大桁数
|
104
105
|
MaxLenRecv = 1024 # 通信の一度の送信バイト数
|
105
106
|
MaxLenSend = 1024 * 1024 # 通信の一度の送信バイト数
|
107
|
+
# 4294967296 # 本当はuint最大値なんだけれど、policyファイルの都合で変えてある
|
108
|
+
# 1886350440
|
109
|
+
# 1886350441
|
106
110
|
|
107
111
|
EncodeTypeJSON = 0 # エンコードのタイプのJSON
|
108
112
|
EncodeTypeYAML = 1 # エンコードのタイプのYAML
|
@@ -142,14 +146,14 @@ module DangoFrameworkModule
|
|
142
146
|
@dango_logger = Logger.new(@log_file, @log_shift_age, @log_max_size)
|
143
147
|
@dango_logger.level = @log_level
|
144
148
|
def @dango_logger.format_message(severity, timestamp, msg, progname)
|
145
|
-
# "#{Time.now_to_s}:#{sprintf('%1.1s', severity)}:#{progname}:#{msg}\n"
|
146
|
-
# "%s, [%s#%d] %5s -- %s: %s\n" % [severity[0..0], format_datetime(time), $$, severity, progname,msg2str(msg)]
|
147
149
|
now = Time.now
|
148
150
|
now_str = now.strftime("%Y-%m-%d %H:%M:%S.") << "%06d" % now.usec
|
149
151
|
"%1.1s, [%s] %d:%s %s\n" % [severity, now_str, Thread.current.object_id, progname, msg]
|
150
152
|
end
|
151
153
|
end
|
154
|
+
|
152
155
|
end
|
156
|
+
|
153
157
|
@dango_logger
|
154
158
|
end
|
155
159
|
|
@@ -159,17 +163,15 @@ module DangoFrameworkModule
|
|
159
163
|
def dango_receive_data(sock)
|
160
164
|
ret_data = ""
|
161
165
|
|
162
|
-
# logger.debug "dango_receive_data(#{sock})"
|
163
|
-
|
164
166
|
begin
|
165
|
-
# size_str = sock.readpartial(CommMaxDigit + 1)
|
166
|
-
# size_str = sock.sysread(CommMaxDigit + 1)
|
167
167
|
size_str = sock.recv(CommMaxDigit + 1)
|
168
168
|
rescue EOFError, IOError, Errno::ECONNRESET, Errno::ETIMEDOUT, Errno::ECONNABORTED
|
169
169
|
# 接続終了時の切断と思われるものはDangoFrameworkConnectionExceptionにしない
|
170
|
-
raise(DangoFrameworkDisconnectException, "failed to read sock for EOF reached (and so on).
|
170
|
+
raise(DangoFrameworkDisconnectException, "failed to read sock for EOF reached (and so on). " +
|
171
|
+
"sock=#{sock.inspect} #{$!.class} toid=#{Thread.current.object_id}")
|
171
172
|
rescue
|
172
|
-
raise(DangoFrameworkConnectionException, "failed to read sock. sock=#{sock.inspect}
|
173
|
+
raise(DangoFrameworkConnectionException, "failed to read sock. sock=#{sock.inspect} " +
|
174
|
+
"toid=#{Thread.current.object_id}\n#{error_message($!, 'u')}")
|
173
175
|
end
|
174
176
|
|
175
177
|
if size_str == ""
|
@@ -189,39 +191,31 @@ module DangoFrameworkModule
|
|
189
191
|
|
190
192
|
## データがない場合
|
191
193
|
if size == nil || size == 0
|
192
|
-
raise(DangoFrameworkConnectionException, "toid=#{Thread.current.object_id}
|
194
|
+
raise(DangoFrameworkConnectionException, "toid=#{Thread.current.object_id}" +
|
195
|
+
":size=#{size}:size_str=#{size_str.inspect}")
|
193
196
|
end
|
194
197
|
|
195
198
|
## データが大きすぎる場合
|
196
|
-
if size >=
|
199
|
+
if size >= MaxLenSend
|
197
200
|
raise(DangoFrameworkConnectionException, "too big... size=#{size}:size_str=#{size_str.inspect}")
|
198
201
|
end
|
199
202
|
|
200
|
-
# logger.debug "size=#{size}:size_str=#{size_str.inspect}"
|
201
|
-
|
202
203
|
ret_data_orig = ""
|
203
204
|
|
204
205
|
while size > 0
|
205
206
|
read_len = MaxLenRecv > size ? size : MaxLenRecv
|
206
207
|
begin
|
207
|
-
# this_ret_data_orig = sock.readpartial(read_len)
|
208
|
-
# this_ret_data_orig = sock.sysread(read_len)
|
209
208
|
this_ret_data_orig = sock.recv(read_len)
|
210
209
|
rescue
|
211
210
|
raise(DangoFrameworkConnectionException, "failed to read sock(data).\n#{error_message($!, 'u')}")
|
212
211
|
end
|
213
212
|
|
214
213
|
ret_data_orig += this_ret_data_orig
|
215
|
-
# logger.debug "size:#{size.inspect}:this_ret_data_orig:#{this_ret_data_orig.inspect}"
|
216
214
|
|
217
215
|
size -= this_ret_data_orig.size
|
218
|
-
# logger.debug "size:#{size.inspect}"
|
219
216
|
end
|
220
217
|
|
221
|
-
# logger.debug "ret_data_orig:#{ret_data_orig.inspect}"
|
222
|
-
|
223
218
|
ret_data = dango_receive_decrypt(ret_data_orig[0..-2])
|
224
|
-
# logger.debug "ret_data:#{ret_data.inspect}"
|
225
219
|
|
226
220
|
@recv_count += 1 if @recv_count # 受信回数カウント
|
227
221
|
|
@@ -243,8 +237,6 @@ module DangoFrameworkModule
|
|
243
237
|
# データ送信処理
|
244
238
|
def dango_send_data(sock, send_objs, options = {})
|
245
239
|
encode_type = options[:encode_type] || DefaultEncodeType
|
246
|
-
# logger.debug "dango_send_data:sock=#{sock.inspect} encode_type=#{encode_type}"
|
247
|
-
# logger.debug "dango_send_data:send_objs=#{send_objs.inspect}"
|
248
240
|
|
249
241
|
if send_objs == []
|
250
242
|
send_data_orig = ""
|
@@ -258,46 +250,25 @@ module DangoFrameworkModule
|
|
258
250
|
send_data_orig = JSON.generate(send_objs)
|
259
251
|
end
|
260
252
|
|
261
|
-
# logger.debug "dango_send_data:#{send_data_orig.inspect}"
|
262
|
-
# logger.debug "dango_send_data:#{dango_send_encrypt(send_data_orig).inspect}"
|
263
|
-
|
264
253
|
send_data = dango_send_encrypt(send_data_orig) + "\n"
|
265
|
-
# send_data = dango_send_encrypt(send_data_orig) + "\r\n"
|
266
|
-
# send_data = dango_send_encrypt(send_data_orig) + "\015\012"
|
267
|
-
|
268
|
-
# logger.debug "start dango_send_data:#{send_data.inspect}"
|
269
254
|
|
270
255
|
size = send_data.size
|
271
256
|
|
272
|
-
# if size >= 4294967296 # 本当はuint最大値なんだけれど、policyファイルの都合で変えてある
|
273
|
-
# if size >= 1886350440
|
274
257
|
if size >= MaxLenSend
|
275
258
|
raise(DangoFrameworkException, "max size over. size:#{size} >= #{MaxLenSend}")
|
276
259
|
end
|
277
260
|
|
278
|
-
# size_str = sprintf("%0#{CommMaxDigit}d", size)
|
279
|
-
|
280
261
|
size_str = [encode_type, size].pack("cN")
|
281
|
-
# logger.debug "size=#{size}:size_str=#{size_str.inspect}"
|
282
|
-
|
283
262
|
send_buf = size_str + "\n" + send_data
|
284
|
-
# logger.debug "send_buf:#{send_buf.inspect}"
|
285
|
-
|
286
263
|
begin
|
287
264
|
sock.write send_buf
|
288
265
|
sock.flush
|
289
|
-
|
290
|
-
# sock.send(send_buf, 0)
|
291
|
-
# sock.flush
|
292
|
-
|
293
266
|
rescue
|
294
267
|
raise(DangoFrameworkConnectionException, "sock write failed.\n#{error_message($!, 'u')}")
|
295
268
|
end
|
296
269
|
|
297
270
|
@send_count += 1 if @send_count # 受信回数カウント
|
298
|
-
|
299
|
-
# logger.debug "finish dango_send_data:toid=#{Thread.current.object_id} #{sock} #{sock.closed?}"
|
300
|
-
|
271
|
+
|
301
272
|
sock
|
302
273
|
end
|
303
274
|
end
|
@@ -8,11 +8,11 @@ require 'ipaddr'
|
|
8
8
|
|
9
9
|
# メインクラス
|
10
10
|
class ServerMonitorAction
|
11
|
-
def initialize(parent, config,
|
11
|
+
def initialize(parent, config, peerhost, peeraddr, ret_obj)
|
12
12
|
@parent = parent
|
13
13
|
@config = config
|
14
14
|
|
15
|
-
@logger
|
15
|
+
@logger = @parent.logger
|
16
16
|
@shared = @parent.shared
|
17
17
|
@session = @parent.session
|
18
18
|
@socket_list = @parent.socket_list
|
@@ -21,7 +21,7 @@ class ServerMonitorAction
|
|
21
21
|
# アクション名
|
22
22
|
action_name = ret_obj["action"].to_s
|
23
23
|
|
24
|
-
dango_check_monitor_error(
|
24
|
+
dango_check_monitor_error(peerhost, peeraddr, action_name)
|
25
25
|
|
26
26
|
if action_name == '_monitor_all_info' # メンテナンスアクション名なら
|
27
27
|
dango_server_monitor_all_info(ret_obj)
|
@@ -50,8 +50,7 @@ class ServerMonitorAction
|
|
50
50
|
private
|
51
51
|
|
52
52
|
# メンテナンスコマンド:エラーの場合
|
53
|
-
def dango_check_monitor_error(
|
54
|
-
peerhost, peeraddr = sock.peeraddr[2, 2]
|
53
|
+
def dango_check_monitor_error(peerhost, peeraddr, action_name)
|
55
54
|
backdoor_host = @backdoor_host
|
56
55
|
logger.debug "dango_check_monitor_error:peerhost=#{peerhost.inspect} peeraddr=#{peeraddr.inspect} backdoor_host=#{backdoor_host.inspect}"
|
57
56
|
|
@@ -73,7 +73,7 @@ class DangoServerFramework
|
|
73
73
|
def exit_process() # プロセス終了処理
|
74
74
|
debug_print("shutdown")
|
75
75
|
begin
|
76
|
-
File.delete(@pid_file)
|
76
|
+
# File.delete(@pid_file)
|
77
77
|
rescue
|
78
78
|
# puts "failed delete file. #{@pid_file}:#{$!.class}:#{$!.message}"
|
79
79
|
end
|
@@ -145,17 +145,19 @@ class DangoServerFramework
|
|
145
145
|
logger.warn("Dango Version=#{Dango::VERSION::STRING}")
|
146
146
|
# logger.debug("$LOADED_FEATURES=#{$LOADED_FEATURES.pretty_inspect}")
|
147
147
|
|
148
|
-
shared_init()
|
149
|
-
socket_list_init()
|
150
|
-
@
|
151
|
-
@
|
152
|
-
heart_beat_thread_start() # ハートビートスレッドの開始
|
153
|
-
gc_thread_start() # GCスレッドの開始
|
148
|
+
shared_init() # 共有メモリを初期化
|
149
|
+
socket_list_init() # ソケット一覧を初期化
|
150
|
+
@mutex_sock = {} # ソケットの排他処理ハッシュ
|
151
|
+
@session_manager = SessionManager.new(shared, RAILS_ENV) # セッション情報の初期化
|
154
152
|
|
155
|
-
|
153
|
+
@mutex_proc_thread = Mutex.new # スレッドが同時起動しないようにするためのMutex
|
154
|
+
heart_beat_thread_start() # ハートビートスレッドの開始
|
155
|
+
gc_thread_start() # GCスレッドの開始
|
156
156
|
|
157
|
-
|
158
|
-
|
157
|
+
dango_server_init() # 初期設定読み込み
|
158
|
+
|
159
|
+
@mutex_send_response = Mutex.new # 送信レスポンス用のMutex
|
160
|
+
@arr_send_response = [] # 送信レスポンス用のキャッシュ
|
159
161
|
|
160
162
|
|
161
163
|
TCPSocket.do_not_reverse_lookup = true # 逆引きを行わない
|
@@ -274,15 +276,20 @@ class DangoServerFramework
|
|
274
276
|
@thr_gr_gserver_serve.add(Thread.current) # スレッドグループに登録
|
275
277
|
|
276
278
|
begin
|
277
|
-
sock.binmode
|
278
|
-
sock.sync = true
|
279
|
-
|
280
279
|
@session_manager.start_session() # sessionの開始処理 sidは自動生成
|
281
280
|
sid = session[:sid]
|
282
281
|
|
283
|
-
|
284
|
-
|
285
|
-
|
282
|
+
# sockに対しての=nil write close などの書き換えに対する排他処理
|
283
|
+
@mutex_sock[sock.object_id] = Mutex.new
|
284
|
+
|
285
|
+
@mutex_sock[sock.object_id].synchronize do
|
286
|
+
sock.binmode
|
287
|
+
sock.sync = true
|
288
|
+
|
289
|
+
session[:peer_addr] = sock.peeraddr
|
290
|
+
session[:peer_ip_address] = sock.peeraddr[3]
|
291
|
+
session[:peer_host] = sock.peeraddr[2]
|
292
|
+
end
|
286
293
|
|
287
294
|
session[:encode_type] = DefaultEncodeType
|
288
295
|
|
@@ -315,29 +322,8 @@ class DangoServerFramework
|
|
315
322
|
end
|
316
323
|
|
317
324
|
if is_flash_policy_file # Flashのポリシーファイルが来たら
|
318
|
-
|
319
|
-
|
320
|
-
if @policy_file_request # ポリシーファイルを返す設定なら
|
321
|
-
logger.info "is_flash_policy_file #{sid} #{@policy_file_request}"
|
322
|
-
|
323
|
-
allow_str = ""
|
324
|
-
|
325
|
-
@policy_file_allow_domain.each do |one_host|
|
326
|
-
allow_str += %Q|<allow-access-from domain="#{one_host}" to-ports="#{@policy_file_allow_port.join(',')}" />|
|
327
|
-
allow_str += "\n"
|
328
|
-
end
|
329
|
-
|
330
|
-
policy_data = <<EOF
|
331
|
-
<?xml version="1.0"?>
|
332
|
-
<cross-domain-policy>
|
333
|
-
#{allow_str}
|
334
|
-
</cross-domain-policy>
|
335
|
-
EOF
|
336
|
-
|
337
|
-
logger.debug policy_data
|
338
|
-
sock.write policy_data
|
339
|
-
sock.flush
|
340
|
-
logger.info "policy file sent."
|
325
|
+
@mutex_sock[sock.object_id].synchronize do
|
326
|
+
do_flash_policy_file(sid, sock)
|
341
327
|
end
|
342
328
|
|
343
329
|
# この部分はポリシーファイルを返す設定に関係なく実行する部分
|
@@ -369,7 +355,9 @@ EOF
|
|
369
355
|
@mutex_proc_thread.synchronize do
|
370
356
|
|
371
357
|
if action_name[0, 9] == '_monitor_' # メンテナンスアクション名なら
|
372
|
-
|
358
|
+
peerhost = session[:peer_host]
|
359
|
+
peeraddr = session[:peer_ip_address]
|
360
|
+
ServerMonitorAction.new(self, @config, peerhost, peeraddr, ret_obj)
|
373
361
|
|
374
362
|
elsif action_name == '_response' # 送信パケットの返事なら
|
375
363
|
action_name_is_response(ret_obj)
|
@@ -447,8 +435,9 @@ EOF
|
|
447
435
|
ensure
|
448
436
|
socket_list.delete(sid) # ソケットリストから削除
|
449
437
|
begin
|
450
|
-
|
451
|
-
|
438
|
+
@mutex_sock[sock.object_id].synchronize do
|
439
|
+
sock.close # ソケットを閉じる
|
440
|
+
end
|
452
441
|
rescue IOError
|
453
442
|
logger.info "IOError #{sock.inspect} #{sid}"
|
454
443
|
rescue Exception
|
@@ -456,7 +445,10 @@ EOF
|
|
456
445
|
end
|
457
446
|
|
458
447
|
logger.info "#{sock.inspect} #{sid} is closed"
|
459
|
-
sock
|
448
|
+
@mutex_sock[sock.object_id].synchronize do
|
449
|
+
sock = nil
|
450
|
+
end
|
451
|
+
@mutex_sock.delete(sock.object_id)
|
460
452
|
end
|
461
453
|
end # mutex_proc_thread
|
462
454
|
|
@@ -465,6 +457,34 @@ EOF
|
|
465
457
|
|
466
458
|
end
|
467
459
|
|
460
|
+
# Flashのポリシーファイルの処理
|
461
|
+
def do_flash_policy_file(sid, sock)
|
462
|
+
logger.debug "is_flash_policy_file"
|
463
|
+
|
464
|
+
if @policy_file_request # ポリシーファイルを返す設定なら
|
465
|
+
logger.info "is_flash_policy_file #{sid} #{@policy_file_request}"
|
466
|
+
|
467
|
+
allow_str = ""
|
468
|
+
|
469
|
+
@policy_file_allow_domain.each do |one_host|
|
470
|
+
allow_str += %Q|<allow-access-from domain="#{one_host}" to-ports="#{@policy_file_allow_port.join(',')}" />|
|
471
|
+
allow_str += "\n"
|
472
|
+
end
|
473
|
+
|
474
|
+
policy_data = <<EOF
|
475
|
+
<?xml version="1.0"?>
|
476
|
+
<cross-domain-policy>
|
477
|
+
#{allow_str}
|
478
|
+
</cross-domain-policy>
|
479
|
+
EOF
|
480
|
+
|
481
|
+
logger.debug policy_data
|
482
|
+
sock.write policy_data
|
483
|
+
sock.flush
|
484
|
+
logger.info "policy file sent."
|
485
|
+
end
|
486
|
+
end
|
487
|
+
|
468
488
|
# action_nameが送信パケットの返事なら
|
469
489
|
def action_name_is_response(ret_obj)
|
470
490
|
logger.debug "action_name_is_response: #{ret_obj['_id'].inspect} #{session[:sid].inspect}"
|
@@ -511,12 +531,12 @@ EOF
|
|
511
531
|
@policy_file_allow_port = @config['server']['policy_file_allow_port']
|
512
532
|
@policy_file_allow_port = [@network_port] if !@policy_file_allow_port
|
513
533
|
|
514
|
-
@safe_resolver
|
534
|
+
@safe_resolver = @config['server']['safe_resolver'] || false # require 'resolv-replace'するかどうか
|
515
535
|
|
516
|
-
@statistics_process_memory
|
536
|
+
@statistics_process_memory = @config['server']['statistics_process_memory'] || false # プロセスのメモリ使用量統計取る
|
517
537
|
|
518
|
-
@backdoor_run_drb_server = @config['server']['backdoor_run_drb_server'] || false #
|
519
|
-
@backdoor_run_drb_port = @config['server']['backdoor_run_drb_port'] || 12345 #
|
538
|
+
@backdoor_run_drb_server = @config['server']['backdoor_run_drb_server'] || false # drbサーバーを起動するか
|
539
|
+
@backdoor_run_drb_port = @config['server']['backdoor_run_drb_port'] || 12345 # drbサーバーのポート番号
|
520
540
|
@backdoor_host = @config['server']['backdoor_host'] || '127.0.0.1' # バックドアのアクセス可能ホスト名
|
521
541
|
|
522
542
|
@loop_setting = @config['server']['loop_setting'] # メインループ用の定義
|
@@ -625,25 +645,7 @@ EOF
|
|
625
645
|
logger.debug "GC end #{Time.now - gc_start_time}sec "
|
626
646
|
# Thread.critical = false
|
627
647
|
|
628
|
-
# メモリ使用量統計
|
629
|
-
if @statistics_process_memory
|
630
|
-
memory_usage = 0
|
631
|
-
if RUBY_PLATFORM == 'i386-mswin32'
|
632
|
-
require "win32ole"
|
633
|
-
locator = WIN32OLE.new("WbemScripting.SWbemLocator.1") #(A)
|
634
|
-
service = locator.ConnectServer #(B)
|
635
|
-
set = service.ExecQuery("select * from Win32_Process WHERE ProcessId = #{Process.pid}") #(C)
|
636
|
-
set.each do |process|
|
637
|
-
memory_usage = process.PageFileUsage.to_i
|
638
|
-
end
|
639
|
-
else
|
640
|
-
stat = `cat /proc/#{Process.pid}/stat`.split(" ")
|
641
|
-
memory_usage = stat[22].to_i
|
642
|
-
end
|
643
|
-
|
644
|
-
open("log/dango_stat_proc_mem_#{RAILS_ENV}.log", "ab"){|fh| fh.write "#{Time.now_to_s},#{memory_usage},#{@thr_gr_gserver_serve.list.length}\n" }
|
645
|
-
logger.debug "statistics_process_memory file add."
|
646
|
-
end
|
648
|
+
output_memory_statistics() if @statistics_process_memory # メモリ使用量統計
|
647
649
|
|
648
650
|
rescue Exception
|
649
651
|
logger.error "Exception gc_thread_start #{error_message($!, 'u')}"
|
@@ -653,6 +655,29 @@ EOF
|
|
653
655
|
th.priority = 3
|
654
656
|
end
|
655
657
|
|
658
|
+
# メモリ使用量統計
|
659
|
+
def output_memory_statistics()
|
660
|
+
memory_usage = 0
|
661
|
+
if RUBY_PLATFORM == 'i386-mswin32'
|
662
|
+
require "win32ole"
|
663
|
+
locator = WIN32OLE.new("WbemScripting.SWbemLocator.1")
|
664
|
+
service = locator.ConnectServer
|
665
|
+
set = service.ExecQuery("select * from Win32_Process WHERE ProcessId = #{Process.pid}")
|
666
|
+
set.each do |process|
|
667
|
+
memory_usage = process.PageFileUsage.to_i
|
668
|
+
end
|
669
|
+
else
|
670
|
+
stat = `cat /proc/#{Process.pid}/stat`.split(" ")
|
671
|
+
memory_usage = stat[22].to_i
|
672
|
+
end
|
673
|
+
|
674
|
+
open("log/dango_stat_proc_mem_#{RAILS_ENV}.log", "ab") do |fh|
|
675
|
+
fh.write "#{Time.now_to_s},#{memory_usage},#{@thr_gr_gserver_serve.list.length}\n"
|
676
|
+
end
|
677
|
+
logger.debug "statistics_process_memory file add."
|
678
|
+
end
|
679
|
+
|
680
|
+
|
656
681
|
# ハートビートスレッドの開始
|
657
682
|
def heart_beat_thread_start
|
658
683
|
shared[:_heart_beat_time_hash] = {}
|
@@ -663,38 +688,41 @@ EOF
|
|
663
688
|
begin
|
664
689
|
sleep @herat_beat_interval_sec
|
665
690
|
|
666
|
-
if
|
667
|
-
|
691
|
+
next if @gserver.stopped? # gserverが起動していればスキップ
|
692
|
+
|
693
|
+
logger.debug "heart_beat_thread_start "
|
694
|
+
|
695
|
+
@mutex_proc_thread.synchronize do
|
696
|
+
# クライアントから来るハートビートのチェック
|
697
|
+
heart_beat_time_hash = shared[:_heart_beat_time_hash]
|
668
698
|
|
669
|
-
|
670
|
-
|
671
|
-
|
699
|
+
# 全員分のチェック
|
700
|
+
socket_list.all_sid.each do |sid|
|
701
|
+
sock = socket_list[sid]
|
672
702
|
|
673
|
-
#
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
# sock.close if !sock.closed?
|
686
|
-
begin
|
703
|
+
if ! sock # すでにsocketが無い場合は、スキップ
|
704
|
+
logger.warn "!!!! heart_beat_thread_start:sock is not found. #{sid}:#{sock}"
|
705
|
+
next
|
706
|
+
end
|
707
|
+
|
708
|
+
# クライアントから来たハートビートの時間チェックし、古ければsocketを閉じる
|
709
|
+
if heart_beat_time_hash[sid] &&
|
710
|
+
heart_beat_time_hash[sid] < Time.now - @heart_beat_receive_wait_sec
|
711
|
+
logger.warn "!!!! heart_beat_thread_start:heart beat old:#{sid}:" +
|
712
|
+
"#{heart_beat_time_hash[sid]}:#{sock}:#{sock.closed?}"
|
713
|
+
begin
|
714
|
+
@mutex_sock[sock.object_id].synchronize do
|
687
715
|
sock.close
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
next
|
716
|
+
end # @mutex_sock[sock.object_id].synchronize
|
717
|
+
rescue IOError
|
718
|
+
logger.debug "heart_beat_thread_start:maybe already closed. IOError:#{sid}:#{sock}"
|
719
|
+
rescue
|
720
|
+
logger.warn "heart_beat_thread_start:failed close socket:#{error_message($!, 'u')}"
|
694
721
|
end
|
722
|
+
next
|
695
723
|
end
|
696
|
-
end #
|
697
|
-
end #
|
724
|
+
end # socket_list
|
725
|
+
end # @mutex_proc_thread
|
698
726
|
|
699
727
|
# # スレッド情報をログに出力
|
700
728
|
# if logger.debug?
|
@@ -802,6 +830,7 @@ EOF
|
|
802
830
|
# sidごとにデータをまとめ送り
|
803
831
|
send_data_sid_list.each do |sid, one_send_data_list|
|
804
832
|
sock = socket_list[sid]
|
833
|
+
|
805
834
|
if !sock
|
806
835
|
logger.info "thread_send_notice_queue:not found sid=#{sid} sock=#{sock.inspect}"
|
807
836
|
next
|
@@ -813,11 +842,12 @@ EOF
|
|
813
842
|
end
|
814
843
|
|
815
844
|
begin
|
816
|
-
logger.debug "thread_send_notice_queue:dango_send_data:sid=#{sid} sock=#{sock.inspect}
|
817
|
-
#
|
818
|
-
# logger.debug one_send_data_list.pretty_inspect
|
845
|
+
logger.debug "thread_send_notice_queue:dango_send_data:sid=#{sid} sock=#{sock.inspect} " +
|
846
|
+
"#{one_send_data_list.collect{|d| d['_notice_name'] + ','}}"
|
819
847
|
|
820
|
-
|
848
|
+
@mutex_sock[sock.object_id].synchronize do
|
849
|
+
dango_send_data(sock, one_send_data_list, :type=>send_data_encode_type_list[sid]) # データ送信
|
850
|
+
end # mutex_sock[sock.object_id].synchronize
|
821
851
|
|
822
852
|
rescue DangoFrameworkConnectionException
|
823
853
|
logger.info "thread_send_notice_queue:failed send. sid=#{sid} sock=#{sock.inspect} #{$!.class}"
|
@@ -4,13 +4,14 @@
|
|
4
4
|
class SessionManager
|
5
5
|
MaxSidCounter = 999999
|
6
6
|
|
7
|
-
def initialize(shared)
|
7
|
+
def initialize(shared, rails_env)
|
8
8
|
@shared = shared
|
9
|
+
@rails_env = rails_env
|
10
|
+
|
9
11
|
@session_list = {}
|
10
12
|
@session_mutex = Mutex.new
|
11
13
|
|
12
14
|
@shared[:_session_manager] = {}
|
13
|
-
|
14
15
|
end
|
15
16
|
|
16
17
|
|
@@ -26,7 +27,8 @@ class SessionManager
|
|
26
27
|
def close_session(sid)
|
27
28
|
@session_mutex.synchronize do
|
28
29
|
drop_sid()
|
29
|
-
@session_list[Thread.current.object_id] = nil
|
30
|
+
# @session_list[Thread.current.object_id] = nil
|
31
|
+
@session_list.delete(Thread.current.object_id)
|
30
32
|
end
|
31
33
|
end
|
32
34
|
|
@@ -54,9 +56,8 @@ class SessionManager
|
|
54
56
|
sid = ses_man[:sid_counter] if ! ses_man[:sid_list].has_key?(ses_man[:sid_counter])
|
55
57
|
end
|
56
58
|
|
57
|
-
ses_man[:sid_list][
|
59
|
+
ses_man[:sid_list][sid] = "#{@rails_env}:#{Process.pid}:#{Thread.current.object_id}"
|
58
60
|
|
59
|
-
ses_man
|
60
61
|
@shared.commit(ses_man)
|
61
62
|
end
|
62
63
|
|
@@ -68,9 +69,8 @@ class SessionManager
|
|
68
69
|
@shared.transaction(:_session_manager) do |ses_man|
|
69
70
|
|
70
71
|
# ses_man[:sid_list].delete(sid)
|
71
|
-
ses_man[:sid_list].delete_if{|sid, oid| oid == "#{Process.pid}:#{Thread.current.object_id}" }
|
72
|
+
ses_man[:sid_list].delete_if{|sid, oid| oid == "#{@rails_env}:#{Process.pid}:#{Thread.current.object_id}" }
|
72
73
|
|
73
|
-
ses_man
|
74
74
|
@shared.commit(ses_man)
|
75
75
|
end
|
76
76
|
|
data/lib/dango/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dango
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Keisuke Minami
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-10-04 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -28,9 +28,9 @@ dependencies:
|
|
28
28
|
version_requirement:
|
29
29
|
version_requirements: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.4.5
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: hoe
|